在docker容器中安装docker服务,基于fuse-overlayfs进行overlay挂载,而不是vfs
1、docker 安装
正常安装docker软件,运行docker时,会提示:No docker socket 服务
2、启动docker服务(包含守护进程)
systemctl start docker
#dockerd &if ! ps aux | grep -v grep | grep -q "dockerd"; thenecho "Starting dockerd in background..."nohup dockerd > /dev/null 2>&1 &export DOCKER_DAEMON_STARTED_BY_BASHRC=1 # 标记由本脚本启动
elseecho "dockerd is already running."
fi
现在可以运行了,但是发现运行在vfs模式,非常占用IO,需要更换成overlay模型
docker info | grep "Storage Driver"
可确认当前存储驱动是否为 vfs。若输出为 Storage Driver: vfs,则说明 Docker 未使用 overlay2。
3、容器内需要安装overlay模组
我的思路是直接apt安装,发现不行。然后我把宿主机的 /lib/modules/5.4.0-* 复制到容器中。通过这个可查看内核版本$(uname -r)
。
加载模块
depmod -amodprobe overlaylsmod | grep overlay
4、这个时候还是无法dockerd启动overlay,还是用fuse-overlayfs
内核态搞不了就换成用户态的overlay,到https://github.com/containers/fuse-overlayfs
的release页面下载二进制bin文件。然后复制到容器的/bin目录
检查模块是否加载:
lsmod | grep overlay # 或 modinfo overlayfuse-overlayfs --version
这个时候我这边启动dockerd已经ok
最后在容器的 .bashrc 添加脚本,确保每次都能启动docker服务
systemctl start docker
#dockerd &if ! ps aux | grep -v grep | grep -q "dockerd"; thenecho "Starting dockerd in background..."modprobe overlaylsmod | grep overlaynohup dockerd > /dev/null 2>&1 &export DOCKER_DAEMON_STARTED_BY_BASHRC=1 # 标记由本脚本启动
elseecho "dockerd is already running."
fi