容器技术是轻量级虚拟化技术,利用该技术能够将应用打包发布到不同的容器化服务器上运行。在此过程中,可以减少繁琐的应用环境的构建。容器技术领域中有一个佼佼者叫Docker。
Docker在2017年3月1日后,版本发生了改变,之前叫:docker
或者docker-engine
,之后分成了企业版和社区版,社区版叫docker-ce
。
如果我们有一台比较厉害的服务器,但是我们需要在上面放两个应用,而且想让这两个应用互不干扰,那么我们首先要解决的问题就是应用环境隔离的问题。我们可以采取的一种方案是:装个虚拟机,然后在这两个虚拟机中个装一个操作系统,然后在分别部署我们的应用。不过现在我们也可以用Docker,你可以把Docker看成是一个轻量级的虚拟机。关于Docker和虚拟机的具体区别,大家可以自行查阅资料。
Docker的组成
- registry:Docker的镜像库,制作好的Docker镜像存储的地方,方便用户推送和拉取。类似于虚拟机的镜像源,yum中的软件源,python中pip模块存放的地方、手机上的应用市场等一样。
- image:镜像,就像虚拟机中的镜像文件、yum中的rpm软件包、pip中的whl包,安卓中的apk包。
- container:镜像启动运行后的一种状态。
在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 socket
与 Docker
引擎通讯。而只有 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 容器名称
重启就可以了。