完全可用的迁移docker目录方
- 一、前提
- 二、具体操作如下:
- 2.1 先模拟运行一个 docker mysql
- 2.2 先停docker进程
- 2.3 新建存储目录
- 2.4 修改启动默认的目录
- 2.4.1 使用软链接(推荐)
- 2.4.2 修改`/etc/docker/daemon.json` (推荐)
- 2.4.3 指定容器启动参数(实际上不好用这个,不建议用)
- 2.5 重载配置和重启docker进程
- 三、 可能出现的问题和解决办法
一、前提
情景:原生docker镜像容器放在/var/lib/docker
之中,容量有限,需要迁移
特别注意:如果有mysql,可能会报错如下:
mysqld: Can't create/write to file '/tmp/ibRGpjMk' (OS errno 13 - Permission denied)
OR
Setup of socket: '/var/run/mysqld/mysqlx.sock' failed,
解决办法在最后
二、具体操作如下:
2.1 先模拟运行一个 docker mysql
注意:
mysql 8 和 mysql 5.7可能会遇见下面的问题,解决办法也一样
docker run -it -d --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.35
2.2 先停docker进程
systemctl stop docker
可能会有提示
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
所以还需要停掉socket:
systemctl stop docker.socket
2.3 新建存储目录
mkdir -p /test/
2.4 修改启动默认的目录
常见的办法有3中,选择其中之一即可:
2.4.1 使用软链接(推荐)
mv /var/lib/docker/ /test/
ln -sf /test/docker /var/lib/docker
2.4.2 修改/etc/docker/daemon.json
(推荐)
移动到新的目录
cp -r /var/lib/docker/ /test/
修改daemon.json
如果没有可新建目录,然后编辑
mkdir /etc/docker/
如果已经存在,可先备份
cp /etc/docker/daemon.json /etc/docker/daemon.json_`date +%F`
开始修改配置
vim /etc/docker/daemon.json
#添加一行
"graph":"/test/docker"
可参考图示:
2.4.3 指定容器启动参数(实际上不好用这个,不建议用)
cd /etc/systemd/system
mkdir docker.service.d
cd docker.service.d
cp /lib/systemd/system/docker.service docker.conf
然后编辑docker.conf文件
vim docker.conf
# 添加这一行,否则报错
ExecStart=
# 修改这一行
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --graph="/test/docker"
参考图示如下:
2.5 重载配置和重启docker进程
systemctl daemon-reload
systemctl restart docker
删除原有的存储
rm -rf /var/lib/docker/
如果报错:
rm: 无法删除"/var/lib/docker/overlay/50f73bfd98368e3d9f47aac7d23ae12b514ade1c283b88013995b12a5f238860/merged": 设备或资源忙
解决办法:
vim umount_old_overlay.sh
res=`df -h | grep /var/lib/docker/ | awk '{print $6}'`
for i in ${res[@]}
do
umount $i
done
三、 可能出现的问题和解决办法
上述 2.4.1
可成功启动mysql
上述2.4.2 和2.4.3
mysql都会报错
报错如下:
mysqld: Can't create/write to file '/tmp/ibRGpjMk' (OS errno 13 - Permission denied)
可参考图示如下:
原因:根据提示是没有/tmp的权限
查看docker mysql的工作层
docker inspect --format '{{ .GraphDriver.Data.WorkDir }}' bf9d2637d4d1
输出结果
/test/docker/overlay2/fb2ccd3b4f36ba5ed129eff407693780dfb0b04c233025dcf253ff3ce1e24864/work
OR
docker inspect bf9d2637d4d1
进入到工作层:
cd "/test/docker/overlay2/fb2ccd3b4f36ba5ed129eff407693780dfb0b04c233025dcf253ff3ce1e24864"
查看
[root@node1 fb2ccd3b4f36ba5ed129eff407693780dfb0b04c233025dcf253ff3ce1e24864]# ll
总用量 8
drwxr-xr-x 4 root root 28 12月 14 14:32 diff
-rw-r--r-- 1 root root 26 12月 14 14:32 link
-rw-r--r-- 1 root root 347 12月 14 14:32 lower
drwx------ 3 root root 18 12月 14 14:34 work
寻找是否有tmp目录
[root@node3 fb2ccd3b4f36ba5ed129eff407693780dfb0b04c233025dcf253ff3ce1e24864]# find ./ -name tmp
./diff/tmp
发现存在目录tmp,查看并赋权。
[root@node1 fb2ccd3b4f36ba5ed129eff407693780dfb0b04c233025dcf253ff3ce1e24864]# ll diff
总用量 0
drwxr-xr-x 3 root root 20 12月 14 14:32 run
drwxr-xr-t 2 root root 6 12月 14 14:32 tmp
[root@node1 fb2ccd3b4f36ba5ed129eff407693780dfb0b04c233025dcf253ff3ce1e24864]# chmod -Rf 777 diff/*
可参考图示如下:
再次启动还是报错
Setup of socket: '/var/run/mysqld/mysqlx.sock' failed,
根据上图可以看出:mysqld文件下不能新建socket文件
解决办法还是需要赋权
# cd "/test/docker/overlay2/fb2ccd3b4f36ba5ed129eff407693780dfb0b04c233025dcf253ff3ce1e24864"
# find ./ -name mysqld
./diff/run/mysqld
./merged/run/mysqld
./merged/usr/sbin/mysqld
实际上只需要对diff下面的mysqld赋权即可
chmod -Rf 777 diff/run/mysqld
可参考图示如下:
再次启动mysql,就会恢复正常
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa4216a6da0a mysql "docker-entrypoint.s…" 5 hours ago Up 8 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-test