系统信息

# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

# uname -r
3.10.0-514.26.2.el7.x86_64

如果需要升级系统内核版本,详见Centos系统内核升级的方法。

如果升级到CentOS7版本,主要步骤:

(1)导入elrepo的key

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org  

(2)To install ELRepo for RHEL-7, SL-7 or CentOS-7

# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

(3)在yum的elrepo源中有ml和lt两种内核,其中ml(mainline)为最新版本的内核,lt为长期支持的内核:

#  yum --enablerepo=elrepo-kernel -y install kernel-lt

(4)修改grub.conf文件vim /etc/grub.conf:

default=0

(5)修改完了就重启系统让其生效:

# reboot

查看docker版本等信息

# docker info
 Server Version: 18.09.0  //或是17.09.0-ce版本
 Storage Driver: overlay
 ....

为什么使用overlay2

关于 overlay 与 overlay2 有什么差别,网上资源非常多,这里不作为重点介绍。

之所以升级到 overlay2 ,是因为我们在工作中经常会遇到这样的问题:

Step 1 : FROM million12/nginx-php:latest
 ---> 09c053597dda
Step 2 : COPY etc/docker-jenkins/default.conf /etc/nginx/hosts.d/default.conf
 ---> Using cache
 ---> 26a29dd01af3
Step 3 : COPY app /data/www/app
INFO[0012] link /var/lib/docker/overlay/99380f87e1572466529c4f668b5e79fe711496e9
85d313cc0d2f45bfdbdb3969/root/var/lib/yum/yumdb/p/939d2078d64d51ff7ad16150745e94
a26085bc93-php70-php-opcache-7.0.11-1.el7.remi-x86_64/checksum_type /var/lib/doc
ker/overlay/9ac18f869f20ba8ba29d2a16f00f2ce6ff1c6d0d1a40192a0efb8933c8ad1c45/tmp
root958106287/var/lib/yum/yumdb/p/939d2078d64d51ff7ad16150745e94a26085bc93-php70
-php-opcache-7.0.11-1.el7.remi-x86_64/checksum_type: too many links

使用 overlay2 可以很好解决这一 “too many links” 问题~~

解决上面出现的“too many links” 问题,可以采用下面两种方法:

(1)临时方法:定时删除没用的镜像和已经退出的容器,使用docker system prune
(2)永久方法:将存储驱动由 overlay 升级到 overlay2。

将Docker存储驱动由 overlay 更改为 overlay2

操作之前要注意⚠️:之前 docker images 会丢失,之前运行的 docker 容器服务会丢失(docker ps),进行下面步骤之前请做好数据的备份!!!

具体操作步骤如下:

(1)关闭运行的docker服务

# systemctl stop docker

(2)添加 daemon.json 文件

# echo "

{

  "storage-driver": "overlay2",

  "storage-opts": [ "overlay2.override_kernel_check=true" ],

  "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"],

  "live-restore" : false

}

" >> /etc/docker/daemon.json

(3)启动docker服务

# systemctl start docker