How to migrate data in Docker

前段时间运行了一个关于mysql的docker镜像,比较懒没有去官网查资料,直接从国内某技术网站找了一个关于mysql镜像运行的例子跑了一下,具体如下:

docker run  --detach \
--restart always \
--publish 3306:3306 --name mysql \
--volume /data/mysql/logs:/logs \
--volume /data/mysql/data:/mysql_data \
-e MYSQL_ROOT_PASSWORD=e23566ah6k237ohfio4 \
mysql:5.7.28

明眼人基本上是可以看出来的,这个脚本虽然是可以跑进来的,宿主机脚不能通过卷挂载获取到容器中的数据,有朝一日容器坏了或者被删除了,里面的数据也就没有了。原因是容器中的mysql的日志与数据目录不应该是这里映射的。好了,既然我我们知道了问题所在,有没有办法将当前mysql容器中的数据迁出来,重新启动一个新容器,挂载上正确的数据卷呢?比方说就是下面给出的新容器。

docker run  --detach \
--restart always \
--publish 3306:3306 \
--name mysql \
--volume /data/cloud/docker/mysql/logs:/var/log/mysql \
--volume /data/cloud/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=e23566ah6k237ohfio4 \
mysql:5.7.28

答案是有的,我们可以基于docker的cp子命令完成相应的数据迁移工作,接下来,我们就着重来介绍一下。

要将老mysql容器中的数据迁出来,首先要做的就是找到对应的数据目录在哪里,怎么找呢?个人觉得最直接有效的途径就是查阅官方文档,其次是阅读docker hub上当前docker image的构建脚本即Dockerfile文件,Dockerfile其实就是最直白的说明文档。好了,具体怎么找,这里就不说了,大家可以自行查阅。这里给出结果,对于docker hub上的docker image mysql:5.7.28来,主要的数据文件目录是/var/lib/mysql,也就是说,我们只要将这个目录中的数据复制出来即可。

[root@cvm00 ~]# docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                      PORTS                               NAMES
5b803ffcfb3d        mysql:5.7.28         "docker-entrypoint.s…"   8 weeks ago         Up 12 hours                 0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@cvm00 ~]#mkdir -p /data/cloud/docker/mysql/
[root@cvm00 ~]#docker cp mysql:/var/lib/mysql /data/cloud/docker/mysql/data	
[root@cvm00 ~]#docker cp mysql:/var/log/mysql /data/cloud/docker/mysql/logs
[root@cvm00 ~]#cd /data/cloud/docker/mysql/data	
[root@cvm00 data]# ll
total 188532
drwxr-xr-x 11 root root     4096 Jan 13 21:33 .
drwxr-xr-x  4 root root     4096 Jan 13 21:26 ..
-rw-r-----  1 root root       56 Nov 15 20:44 auto.cnf
-rw-------  1 root root     1680 Nov 15 20:44 ca-key.pem
-rw-r--r--  1 root root     1112 Nov 15 20:44 ca.pem
-rw-r--r--  1 root root     1112 Nov 15 20:44 client-cert.pem
-rw-------  1 root root     1680 Nov 15 20:44 client-key.pem
-rw-r-----  1 root root    17749 Jan 12 17:49 ib_buffer_pool
-rw-r-----  1 root root 79691776 Jan 13 20:59 ibdata1
-rw-r-----  1 root root 50331648 Jan 13 20:59 ib_logfile0
-rw-r-----  1 root root 50331648 Jan 12 11:00 ib_logfile1
-rw-r-----  1 root root 12582912 Jan 13 20:14 ibtmp1
drwxr-x---  2 root root     4096 Nov 29 19:22 integral
drwxr-x---  2 root root     4096 Nov 21 10:38 mysql
drwxr-xr-x  2 root root     4096 Jan 13 21:33 mysql-backup
drwxr-x---  2 root root     4096 Nov 18 16:24 nacos
drwxr-x---  2 root root     4096 Nov 15 20:44 performance_schema
-rw-------  1 root root     1676 Nov 15 20:44 private_key.pem
drwxr-x---  2 root root     4096 Jan 11 15:40 proprietary@002dmall
-rw-r--r--  1 root root      452 Nov 15 20:44 public_key.pem
-rw-r--r--  1 root root     1112 Nov 15 20:44 server-cert.pem
-rw-------  1 root root     1676 Nov 15 20:44 server-key.pem
drwxr-x---  2 root root     4096 Nov 16 10:10 sms
drwxr-x---  2 root root    12288 Nov 15 20:44 sys
drwxr-x---  2 root root    12288 Jan 13 10:47 xtwj_mall
[root@cvm00 data]# cd ../logs
[root@cvm00 logs]# ll
total 24
drwxr-xr-x 3 root root 4096 Jan 13 21:32 .
drwxr-xr-x 4 root root 4096 Jan 13 21:26 ..
-rw-r----- 1 root root 8837 Oct 17 12:49 error.log

停止老的mysql容器,启动新的mysql容器。

[root@cvm00 ~]# docker stop mysql
mysql
[root@cvm00 ~]# docker rm mysql-new 
mysql
[root@cvm00 ~]# docker run  --detach \
> --restart always \
> --publish 3306:3306 \
> --name mysql \
> --volume /data/cloud/docker/mysql/logs:/var/log/mysql \
> --volume /data/cloud/docker/mysql/data:/var/lib/mysql \
> -e MYSQL_ROOT_PASSWORD=Gah6kuP7ohfio4 \
> mysql:5.7.28
6e16d46a0c5f1f074c1a0793954fbe06c5e973ed17cb5d355a906ba85a732491
[root@cvm00 ~]# 
[root@cvm00 ~]# docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                               NAMES
6e16d46a0c5f        mysql:5.7.28         "docker-entrypoint.s…"   25 minutes ago      Up 25 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
[root@cvm00 ~]#

至此,任务完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qwfys200

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值