docker容器迁移实战

假设要迁移一个 mysql 服务(docker部署),由于数据库过大(超过50 GB),用mysqldump备份和还原则太过耗时,下面尝试拷贝目录的方式来迁移,详细过程如下:

老机器:192.168.4.231
新机器:192.168.4.232

准备数据

  • 老机器:创建mysql 5.7容器并准备测试数据
docker pull mysql:5.7
mkdir -p /data/docker/mysql/{binlog,log,opt,var}
curl -sL http://iso.sqlfans.cn/docker/yml/mysql-my.cnf -o /data/docker/mysql/my.cnf
docker run --name mysql -v /data/docker/mysql/my.cnf:/etc/my.cnf -v /data/docker/mysql/opt:/opt -v /data/docker/mysql/log:/var/log/mysql -v /data/docker/mysql/var:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Admin_147 -d mysql:5.7 --lower_case_table_names=1

sleep 30
docker exec -it mysql /bin/bash -c 'mysql -uroot -pAdmin_147 -e"create database if not exists abc;"'
docker exec -it mysql /bin/bash -c 'mysql -uroot -pAdmin_147 -e"show databases;"'

容器迁移步骤

  • 第1步,老机器:执行 docker inspect 找到该容器所映射的外部目录,示例 /data/docker/mysql/*
[root@192.168.4.231]# docker inspect mysql | more
        "HostConfig": {
            "Binds": [
                "/data/docker/mysql/my.cnf:/etc/my.cnf",
                "/data/docker/mysql/opt:/opt",
                "/data/docker/mysql/log:/var/log/mysql",
                "/data/docker/mysql/var:/var/lib/mysql"
            ],
  • 第2步,老机器:执行 docker ps 找到该容器所使用的镜像 repository和tag,示例 mysql:5.7
[root@192.168.4.231]# docker ps -a | grep mysql
CONTAINER ID   IMAGE         COMMAND                  CREATED       STATUS          PORTS                      NAMES
da7c4b1a9d4f   mysql:5.7     "docker-entrypoint.s…"   29 days ago   Up 29 days      0.0.0.0:3306->3306/tcp     mysql
  • 第3步,老机器:执行 docker commit 提交操作会捕获容器的当前状态,并将其保存为一个全新的镜像
[root@192.168.4.231]# docker images
REPOSITORY      TAG     IMAGE ID       CREATED         SIZE
mysql           5.7     c20987f18b13   2 years ago     448MB

[root@192.168.4.231]# docker commit da7c4b1a9d4f mysql:5.7-2

[root@192.168.4.231]# docker images
REPOSITORY      TAG     IMAGE ID       CREATED         SIZE
mysql           5.7-2   3f3447deacaa   10 seconds ago  452MB
mysql           5.7     c20987f18b13   2 years ago     448MB
  • 第4步,老机器:执行 docker save 导出镜像(记得带上repository和tag),语法参考:docker save -o 镜像包.tar 镜像名:tag
[root@192.168.4.231]# docker save -o /opt/mysql.20220413.tar mysql:5.7-2
  • 第5步,老机器:建议将该容器停掉,免得迁移前后的数据不一致
[root@192.168.4.231]# docker ps -a | grep mysql
CONTAINER ID   IMAGE         COMMAND                  CREATED       STATUS          PORTS                      NAMES
da7c4b1a9d4f   mysql:5.7     "docker-entrypoint.s…"   29 days ago   Up 29 days      0.0.0.0:3306->3306/tcp     mysql

[root@192.168.4.231]# docker stop da7c4b1a9d4f
  • 第6步,老机器:同步镜像文件及容器目录到新机器
[root@192.168.4.231]# scp -r -P1618 /opt/mysql.20220413.tar 192.168.4.232:/opt/
[root@192.168.4.231]# scp -r -P1618 /data/docker/mysql/* 192.168.4.232:/data/docker/mysql/
  • 第7步,新机器:导入该容器所引用的镜像包.tar,语法参考:docker load -i 镜像包.tar
[root@192.168.4.232]# docker load -i /opt/mysql.20220413.tar

[root@192.168.4.232]# docker images
REPOSITORY      TAG     IMAGE ID       CREATED         SIZE
mysql           5.7-2   3f3447deacaa   10 minutes ago  452MB
  • 第8步,新机器:启动容器,最好与老容器的启动命令一致
docker run --name mysql -v /data/docker/mysql/my.cnf:/etc/my.cnf -v /data/docker/mysql/opt:/opt -v /data/docker/mysql/log:/var/log/mysql -v /data/docker/mysql/var:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Admin_147 -d mysql:5.7 --lower_case_table_names=1
  • 第9步,新机器:确认一下数据
docker exec -it mysql /bin/bash -c 'mysql -uroot -pAdmin_147 -e"show databases;"'
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2024-06-13 15:56:40

results matching ""

    No results matching ""