Docker容器迁移(Wordpress+mysql为例)

本文介绍跨主机容器迁移,理论上适用于大部分Docker应用
由于Docker容器运行产生的数据并不是持久化的,一旦容器被删除其中数据同样被删除,生产环境下请使用-v参数挂载数据卷以持久化数据!!!
涉及到Mysql容器迁移,除下列方法,还可使用

1.使用mysqldump或mysqlhotcopy等工具进行数据库备份来进行数据库迁移操作
2.重新挂载原数据卷实现迁移

以迁移Wordpress及关联mysql容器为例

Docker ps查看当前容器状态,记录容器ID/容器名
docker ps

[root@MiWiFi-RC01-srv ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
83d03d81ab2a        mysql:5.7           "docker-entrypoint..."   About an hour ago   Up About an hour    33060/tcp, 0.0.0.0:3301->3306/tcp   mysql00
795748985b7b        wordpress           "docker-entrypoint..."   About an hour ago   Up About an hour    0.0.0.0:80->80/tcp                  wordpress00
e1840165eb89        registry            "/entrypoint.sh /e..."   8 days ago          Up 2 days           0.0.0.0:5000->5000/tcp              registry

在这里插入图片描述

使用docker inspect查看容器信息,获取容器数据地址
docker inspect mysql00
打印出信息可能会很多,可使用grep搜索
docker inspect mysql00 | grep Source>

[root@MiWiFi-RC01-srv ~]# docker inspect mysql00 | grep Source
 "Source": "/var/lib/docker/volumes/80e6f32c9005f737ada7019dbabee846476b07c99ffdcc5f1fe752fc658bab66/_data",
[root@MiWiFi-RC01-srv ~]# docker inspect wordpress00 | grep Source
 "Source": "/var/lib/docker/volumes/e1a1d94fd2ef7510cdd4c17e18871e056bf34d76c45b817f3d60c47cc4375f56/_data",

记录地址

使用docker commit由容器打包镜像
docker commit mysql00 mysqltest:v0
docker commit wordpress00 wordpresstest:v0>

[root@MiWiFi-RC01-srv ~]# docker commit mysql00 mysqltest:v0
sha256:7a13c0ab60c208d097f8fcc63a7c32f6b4b7430b625506cfa7fd19cb9edeae3a
[root@MiWiFi-RC01-srv ~]# docker commit wordpress00  wordpresstest:v0
sha256:4deb7db2440a8f65e56c088d6be50e29d41fa5f7c96e89af112691722e97d7b2

参数说明
docker commit 容器id 生成镜像名: [TAG]

保存镜像
docker save mysqltest -o mysqltest.tar
docker save wordpresstest -o wordpresstest.tar

[root@MiWiFi-RC01-srv ~]# docker save mysqltest -o mysqltest.tar
[root@MiWiFi-RC01-srv ~]# docker save wordpresstest -o wordpresstest.tar

参数说明
docker save 镜像名 -o 压缩包名.tar

可使用SCP迁移所需数据
scp -r /xxxx 用户名@IP:/xxx
下文使用Xshell下的xftp移动数据至另一台主机

查看打包好的镜像位置
pwd
ls
复制mysqltest.tar wordpresstest.tar 镜像至目标主机

[root@MiWiFi-RC01-srv ~]# pwd
/root
[root@MiWiFi-RC01-srv ~]# ls
anaconda-ks.cfg  mysqltest.tar  wordpresstest.tar

进入容器数据目录
cd /var/lib/docker/volumes/80e6f32c9005f737ada7019dbabee846476b07c99ffdcc5f1fe752fc658bab66/
cd
/var/lib/docker/volumes/e1a1d94fd2ef7510cdd4c17e18871e056bf34d76c45b817f3d60c47cc4375f56/

[root@MiWiFi-RC01-srv ~]# cd /var/lib/docker/volumes/80e6f32c9005f737ada7019dbabee846476b07c99ffdcc5f1fe752fc658bab66/
[root@MiWiFi-RC01-srv 80e6f32c9005f737ada7019dbabee846476b07c99ffdcc5f1fe752fc658bab66]# ls
_data
[root@MiWiFi-RC01-srv ~]# cd /var/lib/docker/volumes/e1a1d94fd2ef7510cdd4c17e18871e056bf34d76c45b817f3d60c47cc4375f56/
[root@MiWiFi-RC01-srv e1a1d94fd2ef7510cdd4c17e18871e056bf34d76c45b817f3d60c47cc4375f56]# ls
_data

复制文件夹至目标主机/var/lib/docker/volumes/目录下

被迁移主机操作完成,进入迁移主机

进入目标主机,查看docker状态
docker ps

[root@docker01 ~]# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

使用docker load 导入使用docker save导出的镜像
docker load -i wordpresstest.tar>
docker load -i mysqltest.tar

在这里插入图片描述
此次演示文件放置在docker文件夹下

[root@docker01 docker]# docker load -i mysqltest.tar 
b0064388b160: Loading layer [==================================================>]  7.68 kB/7.68 kB
Loaded image: mysqltest:v0
[root@docker01 docker]# docker load -i wordpresstest.tar 
096b2fc5baea: Loading layer [==================================================>] 4.608 kB/4.608 kB
Loaded image: wordpresstest:v0

使用docker images查看本地镜像
docker images

[root@docker01 docker]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
wordpresstest           v0                  4deb7db2440a        About an hour ago   616 MB
mysqltest               v0                  7a13c0ab60c2        About an hour ago   569 MB

使用docker run拉起Wordpress与mysql容器
docker run -d -p 80:80 --name wordpresstest wordpresstest:v0
docker run -d -p 3301:3306 -e MYSQL_ROOT_PASSWORD=12345678 --name mysqltest mysqltest:v0

[root@docker01 docker]# docker run -d -p 80:80 --name wordpresstest  wordpresstest:v0
3612dc9ba4a1d1045309717ec0e5891e8287fceef174bb5df620deaee58d1905
[root@docker01 docker]# docker run -d -p 3301:3306 -e MYSQL_ROOT_PASSWORD=12345678 --name mysqltest mysqltest:v0
863241b5271e77240a5fcaf75a0c145bcd2f898f36b9ab0da4290f6b05c6db44

使用docker inspect查看新容器数据地址
docker inspect mysqltest | grep Source
docker inspect wordpresstest | grep Source

[root@docker01 docker]# docker inspect mysqltest | grep Source
"Source": "/var/lib/docker/volumes/100ac33bd265d65a84def671f3388b48d340fe2fd7983f5f50cfdbe9b215e009/_data",
[root@docker01 docker]# docker inspect wordpresstest | grep Source
"Source": "/var/lib/docker/volumes/cacf1f6f39f03f03fc56c22fa6a6a15bf7beb5a79af540589f3d1e1e0b914d07/_data",

删除/var/lib/docker/volumes/100ac33bd265d65a84def671f3388b48d340fe2fd7983f5f50cfdbe9b215e009/_data
/var/lib/docker/volumes/cacf1f6f39f03f03fc56c22fa6a6a15bf7beb5a79af540589f3d1e1e0b914d07/_data
将原主机_data文件夹复制到迁移后容器目录
可使用rmcp命令操作

数据迁移完成后,使用docker restart重启容器
docker restart mysqltest
docker restart wordpresstest

[root@docker01 docker]# docker restart mysqltest 
mysqltest
[root@docker01 docker]# docker restart wordpresstest 
wordpresstest

浏览器输入主机ip进入页面测试应用状态
提示Error establishing a database connection错误
在这里插入图片描述

修复mysql重建与wordpress的连接
进入mysql
docker exec -it mysqltest /bin/bash

[root@docker01 docker]# docker exec -it mysqltest /bin/bash
bash-4.2# 

登陆数据库
mysql -u root -p12345678

bash-4.2# mysql -u root -p12345678
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.42 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

查看原wordpress库是否存在
show databases;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
5 rows in set (0.00 sec)

原库已迁移完成

我们需要重建链接
进入wordpress表,查看wp_options表单option_name为siteurl行

mysql> use wordpress;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from wp_options limit 1;
+-----------+-------------+-----------------------+----------+
| option_id | option_name | option_value          | autoload |
+-----------+-------------+-----------------------+----------+
|         1 | siteurl     | http://192.168.31.143 | yes      |
+-----------+-------------+-----------------------+----------+
1 row in set (0.00 sec)

更新为新host
更新语句update wp_options set option_value=replace(option_value,‘旧ip’,‘新ip’) where option_value LIKE ‘%旧ip%’;

mysql> update wp_options set option_value=replace(option_value,'192.168.31.143','192.168.31.98') where option_value LIKE '%192.168.31.143%';
Query OK, 2 rows affected (0.04 sec)
Rows matched: 2  Changed: 2  Warnings: 0

退出容器
重启mysql容器
docker start mysqltest

[root@docker01 ~]# docker start mysqltest 
Error response from daemon: driver failed programming external connectivity on endpoint mysqltest (b10f9695221934c0999461c12e1fa54117b7ef857584b4fe78ab783748bde13f):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3301 -j DNAT --to-destination 172.17.0.3:3306 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1))
Error: failed to start containers: mysqltest

提示iptables failed这是由于docker启动后变更了firewalld导致的, iptables 规则与docker产生冲突

重新启动docker,重新生成自定义链即可
systemctl restart docker

[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker start mysqltest 
mysqltest
[root@docker01 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
863241b5271e        mysqltest:v0        "docker-entrypoint..."   20 hours ago        Up 11 minutes       33060/tcp, 0.0.0.0:3301->3306/tcp   mysqltest
3612dc9ba4a1        wordpresstest:v0    "docker-entrypoint..."   21 hours ago        Up 21 seconds       0.0.0.0:80->80/tcp                  wordpresstest

修改wordpress配置文件wp-config.php
使用find查找文件位置
find / -name wp-config.php
编辑wp-config.php
vim /var/lib/docker/volumes/cacf1f6f39f03f03fc56c22fa6a6a15bf7beb5a79af540589f3d1e1e0b914d07/_data/wp-config.php

[root@docker01 ~]# find / -name wp-config.php
/var/lib/docker/volumes/cacf1f6f39f03f03fc56c22fa6a6a15bf7beb5a79af540589f3d1e1e0b914d07/_data/wp-config.php
[root@docker01 ~]# vim /var/lib/docker/volumes/cacf1f6f39f03f03fc56c22fa6a6a15bf7beb5a79af540589f3d1e1e0b914d07/_data/wp-config.php

找到DB_HOST,更新数据库地址

i键进入改写模式
esc退出改写模式
:wq保存

在这里插入图片描述

刷新页面,应用已迁移完成

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值