更新

Oct 9, 2018

国庆期间恰巧服务器硬盘故障且运维并没有做 raid 备份,给更换了一台新内部服务器,索性升级到了 CentOS 7,因此针对 CentOS 6 安装 Docker 的答疑不再更新。

前言

前不久终于把我们移动团队内部服务器从 CentOS 5.x 升级到了 6.8。本来是拜托让升级至 7.0 版本起码能用上 docker 1.12 版本还是靠谱的事情。 事情往往难以预料的被告知其他团队在安装 7.0 之后造成内部服务器群的网卡失灵的诡异故障只能作罢,想想起码还有个早期 docker 版本可安装也就先这么着吧。

这个是在 如何在CentOS 上安装Gitlab 之后有一个无奈的使用指南, 因为运维也有他的考虑方面,参见知乎讨论:如何说服运维选择 Debian/Ubuntu 而不是 CentOS

安装 Docker

1.7.1

Docker 最后一个支持 CentOS 6 的版本是 1.7.1 还必须安装 epel 源之后就被大家欢天喜地的抛弃了 6 的支持

1sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
2sudo yum -y remove docker
3sudo yum install libselinux-python docker-io

由于 yum 内 docker 已经被其他使用,不用安装错误了。

1.7.1 以上版本

请果断放弃这种想法,虽然你可能在网上搜索有个别的文章说把内核升级到 3.10 后可以安装 docker 1.9 版本,经过我个人反复测试根本不可行!

当然如果你还是坚持想尝试,请参考如下链接:

配置 Docker

安装成功后先不要配置开机自启动和启动服务,docker 的官方镜像在国内众所周知的慢的一塌糊涂,如果你是在国内服务器使用请参考如下配置。

我这里把我个人私藏已久的好用的镜像告诉大家,大家可不要以为我用的是阿里云或者 DaoCloud 这类有很多限制的玩意:

  • 中国科技大学镜像:https://docker.mirrors.ustc.edu.cn
  • 网易蜂巢镜像:http://hub-mirror.c.163.com

同样需要注意的是 1.7.1 版本的 docker 配置文件是在 /etc/sysconfig/docker 而不是网上和官方说的 /etc/default/docker 打开此文件在 other_args 配置对于的源即可。

 1# /etc/sysconfig/docker
 2#
 3# Other arguments to pass to the docker daemon process
 4# These will be parsed by the sysv initscript and appended
 5# to the arguments list passed to docker -d
 6
 7#other_args=
 8#other_args="--registry-mirror=http://hub-mirror.c.163.com"
 9other_args="--registry-mirror=https://docker.mirrors.ustc.edu.cn"
10
11DOCKER_CERT_PATH=/etc/docker
12
13# Resolves: rhbz#1176302 (docker issue #407)
14DOCKER_NOWARN_KERNEL_VERSION=1
15
16# Location used for temporary files, such as those created by
17# # docker load and build operations. Default is /var/lib/docker/tmp
18# # Can be overriden by setting the following environment variable.
19# # DOCKER_TMPDIR=/var/tmp

后面就没什么好说的了,启动服务和设置开机自启动就完事了

1sudo chkconfig docker on
2sudo service docker start

验证下启动的服务是否已经配置了国内镜像源

1$ ps aux | grep "docker -d"
2
3root     16992  0.1  0.1 1239860 32276 ?       Sl   Dec29   2:02 /usr/bin/docker -d --registry-mirror=https://docker.mirrors.ustc.edu.cn
4root     26873  0.0  0.0 103332   876 pts/2    S+   18:16   0:00 grep docker -d

疑难杂症

1. 使用国内镜像源 pull 镜像偶尔会失败,反复几次就可以解决

频次不高原因未知,因此还未重视。

2. Docker Web 管理工具

推荐使用 portainer ,兼容 1.7 的部分功能可能会发生部分功能和参数无法显示但不影响使用。之前我有推荐 rancher(可参考前篇文章:如何在 OS X 上安装 Rancher ),但 rancher 官方要求 docker 最低版本是 1.9+。

3. Docker 进程挂了重启后无法恢复之前的 containers

1$ docker start c39206003c7a
2Error: Cannot start container c39206003c7a: Error getting container c39206003c7ae8992a554a9ac2ea130327fc4af1b2c389656c34baf9a56c84b5 from driver devicemapper: Error mounting '/dev/mapper/docker-253:0-267081-c39206003c7ae8992a554a9ac2ea130327fc4af1b2c389656c34baf9a56c84b5' on '/var/lib/docker/devicemapper/mnt/c39206003c7ae8992a554a9ac2ea130327fc4af1b2c389656c34baf9a56c84b5': device or resource busy
32014/05/08 19:14:57 Error: failed to start one or more containers

这种一般是因为意外终止进程造成上次的 volume 没有正常 unmount,只需手动操作下即可:

1unmount /var/lib/docker/devicemapper/mnt/d640aea67108b04c6a5ba14645966b092db1f807f3e3f41dca7a1470f76b68fb

d640aea67108b04c6a5ba14645966b092db1f807f3e3f41dca7a1470f76b68fb 是根据不同 container 生成的,请根据实际情况复制和执行。

这个真没办法,只能在 Dockerfile 或者进实例里面进行修改时区,这个我就不过多赘述了。

4. 升级运行的 container 版本

1$ docker stop xxxx
2$ docker create --volumes-from <container_name_of_original_server> \ --name xxx-data image/name:<tag_of_previous_rancher_server>
3$ docker pull image/name:latest
4$ docker run -d --volumes-from xxx-data --restart=unless-stopped \ -p 8080:8080 image/namel.:latest

5. 非 root 用户执行 docker

创建 docker 用户组并重启 docker 服务,之后把你想要的用户加到 docker 用户组即可。

1$ groupadd docker
2$ service docker restart
3$ usermod -a -G docker icyleaf

6. 宿主机 CST 时间会造成 docker 实例时间不准

这个真没办法,只能在 Dockerfile 或者进实例里面进行修改时区,这个我就不过多赘述了。