容器技术是轻量级虚拟化技术,利用该技术能够将应用打包发布到不同的容器化服务器上运行。在此过程中,可以减少繁琐的应用环境的构建。容器技术领域中有一个佼佼者叫Docker。

Docker在2017年3月1日后,版本发生了改变,之前叫:docker或者docker-engine,之后分成了企业版和社区版,社区版叫docker-ce

如果我们有一台比较厉害的服务器,但是我们需要在上面放两个应用,而且想让这两个应用互不干扰,那么我们首先要解决的问题就是应用环境隔离的问题。我们可以采取的一种方案是:装个虚拟机,然后在这两个虚拟机中个装一个操作系统,然后在分别部署我们的应用。不过现在我们也可以用Docker,你可以把Docker看成是一个轻量级的虚拟机。关于Docker和虚拟机的具体区别,大家可以自行查阅资料。

Docker的组成

  1. registry:Docker的镜像库,制作好的Docker镜像存储的地方,方便用户推送和拉取。类似于虚拟机的镜像源,yum中的软件源,python中pip模块存放的地方、手机上的应用市场等一样。
  2. image:镜像,就像虚拟机中的镜像文件、yum中的rpm软件包、pip中的whl包,安卓中的apk包。
  3. container:镜像启动运行后的一种状态。




docker 和 docker 实例的关系 docker和docker-ce区别_docker 进入镜像


在CentOS上安装docker-ce

建议使用CentOS7进行安装,因为最新版的Docker要求linux内核版本不低于 3.10,而CentOS6默认内核小于此版本。

如果我们之前安装过老版本或者系统自带的有老版本的docker,那么我们需要卸载一下旧版本:


yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-engine


卸载完旧版本以后,我们可能需要先把依赖包安装一下:


yum install -y yum-utils  device-mapper-persistent-data  lvm2


然后添加docker-ce的稳定源(以下二选一即可)


# 这个是官方镜像源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 这个是阿里云的镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


更新yum的缓存(根据网络情况,可能会失败,需要多次尝试)


# 本步可选
yum clean all
# 本步必选
yum makecache fast


然后安装docker-ce


yum -y install docker-ce docker-ce-cli containerd.io


官方安装文档:https://docs.docker.com/install/linux/docker-ce/centos/

安装完成后可以查看docker版本:


docker --version


设置docker开机启动,并启动docker


# 设置开机启动
systemctl enable docker
# 启动docker
systemctl start docker


建立docker用户组(选做,如果当前用户不是root用户的时候需要做)

默认情况下,docker 命令会使用 Unix socketDocker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:


sudo groupadd docker


将当前用户加入 docker 组:


sudo usermod -aG docker $USER


docker启动后,我们就可以去镜像仓库中尝试搜索一下:


docker search ubuntu


配置国内镜像仓库

新建配置文件:


vi /etc/docker/daemon.json


在配置文件中加入国内镜像仓库地址(这个仓库我们其实可以弄成我们自己的):


{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}


然后重启docker


systemctl daemon-reload
systemctl restart docker


更多请参考:

https://yeasy.gitbooks.io/docker_practice/content/install/mirror.html

基本使用

镜像仓库中有大量的高质量的镜像可以用。我们这里以使用docker快速安装nginx作为例子:

在docker默认仓库中搜索nginx镜像:


docker search nginx:1.14.2


下载nginx镜像


docker pull nginx


查看本地镜像列表(选做):


docker images


启动镜像


# 方式1:启动镜像并进入容器(可执行命令)
docker run -it --rm  -p 80:80 --name ssnginx nginx /bin/bash


-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端
--rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间(生产环境请谨慎使用)
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash
-p 80:80:将容器的80端口映射到主机的80端口
--name ssnginx:将容器命名为ssnginx


# 如果需要后台运行容器,则表格 -d 参数即可
docker run -it --rm  -p 80:80 --name ssnginx -d nginx /bin/bash


此时一般在浏览器中访问您的IP,就可以访问到Nginx默认页了。

查看运行着的容器列表


docker ps


如果想停止我们刚才启动的容器的话:


docker stop ssnginx


如果我们想进入某个容器:


# 使用该方式进入, 退出后该容器会停止运行
# 9b28426ff2cc 可以通过docker ps 查看到
docker attach 9b28426ff2cc


或者:


# 使用该方式进入, 退出后该容器会停止运行
# ssnginx 是我们启动容器时设置的名字
docker attach ssnginx


或者:


# 使用该方式进入, 退出后容器依然在运行
docker exec -it ssnginx /bin/bash


退出容器使用:


exit


可能会遇到的问题

问题1:


docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:293: copying bootstrap data to pipe caused "write init-p: broken pipe"": unknown.


这个问题最简单的一个解决方式就是更新一下CentOS版本:


yum -y update
# 更新完成后别忘了重启一下系统
reboot


问题2:

CentOS7 防火墙开放 80端口


firewall-cmd --zone=public --add-port=80/tcp --permanent


问题3:

查看Linux发行版:


cat /etc/issue


问题4:

进入容器后发现有些命令不存在

因为容器可以看成是一个轻量级的虚拟机,如果你用的是别人做好的镜像,那么你需要确定对方的Linux发行版,然后根据其发行版安装对应的命令即可

问题5:


docker: Error response from daemon: Conflict. The container name "/ssnginx" is already in use by container "48c97ed4979c9a2bf82cc4ba4441c99c4a3180e30523ff87e777ac9515465964". You have to remove (or rename) that container to be able to reuse that name.


如果我们启动容器的时候,没有使用参数--rm,那么我们如果中途退出后,再启动容器就会遇到这个问题,这是是因为docker容器里面已经存在,如果不需要可以使用docker rm 容器名进行删除;如果需要使用命令docker restart 容器名称重启就可以了。