背景:
服务混跑的情况,任何中间件或配置的变更,都要检查是否影响了现有服务。
服务器上原来跑的docker服务。同事在上面装mysql,导数据,各种安装插件,不知道怎么docker被卸载了。。。重装之后build镜像的时候提示:error creating overlay mount to /var/lib/docker/overlay2/XX/merged: invalid argument。
处理:
参考https://www.jianshu.com/p/66f5f1e2bfa8,原文用到的组合拳1. 变更storage driver类型 + 2. 禁用selinux
对于我来说,只执行了第一步变更storage driver类型,从overlay2变更为overlay就可以了。
停止docker服务
systemctl stop docker
清理镜像
rm -rf /var/lib/docker
修改存储类型
vi /etc/sysconfig/docker-storage
把DOCKER_STORAGE_OPTIONS参数改为overlay:
DOCKER_STORAGE_OPTIONS="--storage-driver overlay"
原理学习:
通过 docker info 查询,对比发现,除了Storage Driver从overlay2变成了overlay,相比overlay2,还少了一行:配置Native Overlay Diff: false。
Containers: 2
Running: 2
Paused: 0
Stopped: 0
Images: 15
Server Version: 1.13.1
Storage Driver: overlay
Backing Filesystem: extfs
Supports d_type: true
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
Init Binary: /usr/libexec/docker/docker-init-current
containerd version: (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: 9c3c5f853ebf0ffac0d087e94daef462133b69c7 (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)
init version: fec3683b971d9c3ef73f284f176672c44b448662 (expected: 949e6facb77383876aeff8a6944dde66b3089574)
Security Options:
seccomp
WARNING: You're not using the default seccomp profile
Profile: /etc/docker/seccomp.json
Kernel Version: 3.10.0-229.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 24
Total Memory: 125.7 GiB
Name: 13-1-138-bx-core.jpool.sinaimg.cn
ID: PRO7:4EXJ:MEI6:RZBK:KU7A:ZU2N:KG2L:K2VF:4FHW:CC4A:ZEVV:N2VS
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Registries: docker.io (secure)
参考下面的文章,看一下overlay和overlay2的差别。
https://blog.csdn.net/zhonglinzhang/article/details/80970411
1. docker数据分层OverlayFS的基本原理:
将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载。OverlayFS底层目录称为lowerdir, 高层目录称为upperdir。合并统一视图称为merged。当需要修改一个文件时,使用CoW将文件从只读的Lower复制到可写的Upper进行修改,结果也保存在Upper层。在Docker中,底下的只读层就是image,可写层就是Container
下图分层图,镜像层是lowdir,容器层是upperdir,统一的视图层是merged层
overlay就是按照这种形式组织的,用的是硬连接。
mount|grep overlay 看挂载情况:
overlay on /var/lib/docker/overlay/18ad814598c9f6068cf757ed1d3eee396717034fb17c390fce388de0ba4caa1f/merged type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay/1c5aee752be12cb2254a0c73c46cdafb45f8ed73bb87ee9feb2096095112b5bc/root,upperdir=/var/lib/docker/overlay/18ad814598c9f6068cf757ed1d3eee396717034fb17c390fce388de0ba4caa1f/upper,workdir=/var/lib/docker/overlay/18ad814598c9f6068cf757ed1d3eee396717034fb17c390fce388de0ba4caa1f/work)
overlay2用的软链接,diff记录每一层自己内容的数据,link记录该层链接目录。
所以为什么overlay2的时候merged的挂载就失败了么?