完全可用的迁移docker目录方案(centos/redhat)

一、前提

情景:原生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 1214 14:32 diff
-rw-r--r-- 1 root root  26 1214 14:32 link
-rw-r--r-- 1 root root 347 1214 14:32 lower
drwx------ 3 root root  18 1214 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 1214 14:32 run
drwxr-xr-t 2 root root  6 1214 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值