前段时间运行了一个关于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 ~]#
至此,任务完成。