前言
由于笔者所在公司无论是开发、测试环境,还是准生产环境、生产环境,使用的都是CentOS6.6。要想按照新版本的Docker就必须升级Linux内核。因此,此文讲解如何升级Linux内核,以及在升级完内核后,如何安装Docker17.06.2-ce。其他版本的docker笔者没有尝试,应该也是可行的。毕竟内核升级到4.4.132-1了
安装方式一
第一种安装方式,需要联网,因此请确保机器可以连接到互联网
升级Linux内核
- 查看当前linux内核版本,查看CentOS版本
uname -a
cat /etc/centos-release
1 | [root@localhost ~]# uname -a |
- 导入存储库的GPG密钥
rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
1 | [root@localhost ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
- 若你也遇到以上错误,可执行下yum -y update nss
yum -y update nss
1 | [root@localhost ~]# yum -y update nss |
- 再次尝试导入GPG密钥就OK了
rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
1 | [root@localhost ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
- 安装ELRepo
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
1 | [root@localhost ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm |
- 安装新内核
yum –enablerepo=elrepo-kernel install kernel-lt -y
不建议
yum –enablerepo=elrepo-kernel install -y kernel-ml( ml=mainline)
1 | [root@localhost ~]# yum --enablerepo=elrepo-kernel install kernel-lt -y |
- 编辑grub.conf文件,修改Grub引导顺序
vi /etc/grub.conf (这里踩了个坑,我改了/etc/grub.conf文件,但是貌似一直没有生效,后来发现原来用的是/boot/grub/grub.conf,这个得事先观察下是否存在这个/boot/grub/grub.conf),一般情况应该都是使用/etc/grub.conf。但无论如何安装内核都是去操作/etc/grub.conf文件的,如果grub启动用的是/boot/grub/grub.conf,那么请将/etc/grub.conf文件内新安装的内核的启动引导配置复制到/boot/grub/grub.conf文件内。
1 | # grub.conf generated by anaconda |
将default=1改为default=0,确保默认启动新的内核。一般新安装的内核会在第一个位置(从0开始),所以设置default=0
安装Docker
笔者这里用的是二进制安装包来安装
- 下载安装,配置国内中科大docker镜像源
下面给出中科大与阿里云的docker二进制安装包
curl -O http://mirrors.ustc.edu.cn/docker-ce/linux/static/stable/x86_64/docker-17.06.2-ce.tgz
tar -xzvf docker-17.06.2-ce.tgz && cp docker/* /usr/bin && rm -rf docker
mkdir -p /etc/docker && echo “{\”registry-mirrors\”: [\”https://docker.mirrors.ustc.edu.cn\”]}” > /etc/docker/daemon.json
1 | [root@localhost ~]# curl -O http://mirrors.ustc.edu.cn/docker-ce/linux/static/stable/x86_64/docker-17.06.2-ce.tgz |
- 如果我们此时启动dockerd,提示我们升级到3.10.0内核版本或升级到更新的内核版本,这个重启下就好了,不用担心
1 | [root@localhost ~]# dockerd |
- 给dockerd设置自动启动
echo “nohup dockerd > /var/log/dockerd.log & 2>&1” >> /etc/rc.local
1 | [root@localhost ~]# echo "nohup dockerd > /var/log/dockerd.log 2>&1 &" >> /etc/rc.local |
- 重启查看内核版本
如果看到内核版本已经是4.4.132啦,那说明grub确实已经引导了新的内核了
1 | [root@localhost ~]# uname -a |
- 查看docker info但提示docker没启动成功
此时我们也可以查看docker的日志,我们把日志放在了/var/log/dockerd.log。或者你可以直接运行dockerd。
提示我们cgroup的东东,看来得安装cgroup
1 | [root@localhost ~]# docker info |
- 安装cgroup,并配置挂载cgroup,需要重启系统(当然这一步可以在之前重启前就做好,这样系统只要重启一次就好了,我这里只是想分享我的踩坑经历哈,就按我踩坑的顺序写下去了)
yum install -y libcgroup
echo “none /sys/fs/cgroup cgroup defaults 0 0” >> /etc/fstab
1 | [root@localhost ~]# yum install -y libcgroup |
一键安装shell脚本
上述一步步比较多,可以整合在一起搞一个shell进行统一处理,因此有了下面的一键安装脚本
笔者希望在别的机器上能一键处理,自己写了个一键安装内核及docker的脚本。这里仅供给大家参考,但由于笔者水平有限,不可能写出非常完美的安装脚本,并不保证在每台机器上都能完美运行。也希望大家多多提建议,我可以改进这个脚本。
curl也可以用来下载如curl -O http://mirrors.ustc.edu.cn/docker-ce/linux/static/stable/x86_64/docker-17.06.2-ce.tgz
1 | !/bin/sh |
执行完记得要重启机器
安装方式二
为什么有安装方式二?这个说来话长,公司内部有几台服务器无法连接外网,只能先下载好安装包。这个我就写简单点了哈。
| 安装包名 | 下载地址 |
| ———————— | ———————————————————— |
| linux4.4.132-1内核安装包 | http://elrepo.org/linux/kernel/el6/x86_64/RPMS/kernel-lt-4.4.132-1.el6.elrepo.x86_64.rpm |
| cgroup安装包 | http://mirror.centos.org/centos/6/updates/x86_64/Packages/libcgroup-0.40.rc1-24.el6_9.x86_64.rpm |
| docker安装包 | http://mirrors.ustc.edu.cn/docker-ce/linux/static/stable/x86_64/docker-17.06.2-ce.tgz |
- 离线安装内核及cgroup
1 | rpm -ivh kernel-lt-4.4.132-1.el6.elrepo.x86_64.rpm |
- 挂载cgroup文件系统
1 | echo "none /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab |
- 修改grub内核启动顺序
vi /etc/grub.conf(这里有坑,可能会用/boot/grub/grub.conf)
得确定下是否存在 /boot/grub/grub.conf如果存在那么 grub启动用的是这个文件如果不存在用的是/etc/grub.conf安装完内核后,默认会在/etc/grub.conf下添加一条记录把/etc/grub.conf下的添加的新内核的启动记录复制到/boot/grub/grub.conf文件末尾,然后把/boot/grub/grub.conf的 default=0改为default=1
- 安装docker
1 | tar -xzvf docker-17.06.2-ce.tgz && cp docker/* /usr/bin && rm -rf docker |
- 配置使用国内中科大的镜像
1 | mkdir -p /etc/docker |
- 设置dockerd自动启动
1 | echo "nohup dockerd > /var/log/dockerd.log 2>&1 &" >> /etc/rc.local |
- 重启
1 | reboot |
附加注意点
几个常见警告的解决
- IPv4 forwarding is disabled的警告
vi /etc/sysctl.conf
1 | # Controls IP packet forwarding |
- Could not get operating system name: Error opening /usr/lib/os-release: open /usr/lib/os-release: no such file or directory
echo “CentOS release 6.x (Final)” | tee /usr/lib/os-release
1 | [root@localhost ~]# echo "CentOS release 6.x (Final)" | tee /usr/lib/os-release |
docker exec -it 报错的问题
报的错误是rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:262: starting container process caused “open /dev/ptmx: no such file or directory “,我看了下宿主机上是有这个文件,那么应该是容器里没有的原因,目前还没查到原因。不过可以通过启动容器时指定 -v /dev:/dev 映射宿主机/dev来解决
此问题可以在启动容器的时候时候,通过-v /dev:/dev来解决,如:
1 | docker run -it -d --name mynginx -p 80:80 -v /dev:/dev nginx:alpine |
如果报以下错误则可以执行下yum update
[root@centos ~]# docker run -it alpine:3.7 /bin/sh
Unable to find image ‘alpine:3.7’ locally
3.7: Pulling from library/alpine
ff3a5c916c92: Pull complete
Digest: sha256:e1871801d30885a610511c867de0d6baca7ed4e6a2573d506bbec7fd3b03873f
Status: Downloaded newer image for alpine:3.7
docker: Error response from daemon: mkdir /var/lib/docker/overlay2/3520bc6c5dcc7ba4dc5e2ba1419cd6250c4b6d61797da7487f20d991179ddd05-init/merged/dev/shm: permission denied.
See ‘docker run –help’.
那么请yum update下,注意/etc/grub.conf的内核启动顺序,要改下
提供一个service脚本
可以方便的实现 service dockerd start,service dockerd stop,service dockerd restart
创建一个dockerd文件,赋予可执行权限,并将该文件放到/etc/init.d即可
1 | !/bin/sh |
总结
踩了好多坑,还是一点点解决了,有点抓狂,有点惊喜;还是得多多总结,多多把遇到的坑,怎么解决的经历整理成文,分享出来,以免更多人踩同样的坑。希望此文对有需要在CentOS6.6或CentOS6.x上安装docker的读者有一些帮助。
参考资料
- Get Docker CE for CentOS https://docs.docker.com/install/linux/docker-ce/centos/
- Install Docker CE from binaries https://docs.docker.com/install/linux/docker-ce/binaries/