Docker跨主机容器迁移

由于Docker容器运行产生的数据并不是持久化的,一旦容器被删除其中数据同样被删除,生产环境下会使用-v参数挂载数据卷以持久化数据,因此我们可以通过备份数据卷数据重新挂载原数据卷实现迁移。

本文以迁移wordpress及关联mysql容器为例。

背景

安装Docker后,所有数据默认存放在/var/lib/docker

包括镜像,容器,网络,卷和插件等的数据都存储在这个目录下

简介

/var/lib/docker/ 目录中包括以下几个重要的子目录:

containers/:这个目录包含了所有运行和停止的容器的数据

image/:这个目录包含了所有的 Docker 镜像

volumes/:这个目录包含了所有的 Docker 卷,这些卷可以被容器用来存储数据

network/:这个目录包含了 Docker 的网络配置信息

overlay2/:这个目录是默认的存储驱动器,用于存储容器的文件系统

Docker命令集

容器生命周期管理容器操作容器rootfs命令镜像仓库本地镜像管理info|version
run -d -ppscommitloginimagesinfo
start/stop/restartinspectcppullrmiversion
killtopdiffpushtag
rmattachsearchbuild
pause/unpauseeventshistory
createlogssave
execwaitimport
export
port
命令作用功能参数作用
$ ps -ef | grep docker $ sudo status docker查看守护进程
$ docker ps [-a][-l]列出运行的应用信息列出所有应用|列出最新启动的应用
$ docker inspect 容器名或应用ID容器或应用的配置信息参数为容器的名称或者应用的ID
$ docker start [-i] 容器名重新启动停止的容器交互方式启动
$ docker rm 容器名删除已经停止的容器
$ docker run [-i] [-t] [-d] [-p] 9200:9200 –volumes-from [CONTAINER NAME] -v$(pwd):/backup tar cvf|xvf /backup/backup.tar [container data volume] [-v] ~/container_data:/data:ro –name [name] 容器名运行一个容器交互式运行||后台运行|定义端口映射|自定义运行的容器名 -D –debug=false -e –exec-driver=”native” -g –graph=”/var/lib/docker” –icc=true 容器镜像互联 -l –log-level=”info” –label=[] -p –pidfile=”/var/run/docker.pid” –volumes-from [CONTAINER NAME]指定挂载容器卷 -v$(pwd):/backup 指定数据备份|还原的目录 tar cvf|xvf /backup/backup.tar将数据压缩|解压至目录 [container data volume]指定备份的数据卷 -v 为容器添加数据卷~/container_data(本地数据卷的位置):/data(容器访问数据卷的位置):ro(指定访问权限)
$ docker attach 容器名或应用ID进入守护进程,进程是通过Ctrl+P、Ctrl+Q退出的
$ docker logs [-f] [-t] [–tail]查看容器已经应用运行日志-f –follows=true|false默认false -t –timestamps=true|false默认false –tail=all 可以带参数0表示最新
$ docker top 容器名查看运行容器的进程
$ docker exec [-i] [-t] [-d] 容器名在运行的容器启动新的进程
$ docker kill 容器名 $ docker stop 容器名停止守护式容器直接停止进行 发送信号停止进程
$ docker run [-P] [-p]容器运行配置端口映射映射所有端口|映射自定义端口
$ docker images [-a] [-f] [–no-trunc] [-q]-a –all=false查看所有镜像 -f –filter=[]过滤镜像 –no-trunc=false截断镜像的ID名称 -q –quiet=false只显示镜像的ID
$ docker inspect [-f]查看镜像名称定义显示格式
$ docker rmi 镜像名删除镜像-f –f=false –no-prune=false
$ docker search 镜像名搜索镜像–automated=false自动化构建 –no-trunc=false -s –stars=0显示结果的最低星级评分 最多返回25个结果
$ docker pull 镜像名拉取镜像-a –all-tags=false 拉取所有符合tags的镜像 –registry-mirror选择镜像仓库
$ docker push 镜像名:tag推送镜像
$ docker run –link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMOND]CONTAINER_NAME 要关联的镜像名称 ALIAS 关联镜像的代号

数据迁移

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

1
2
3
4
5
[root@lijing ~]# 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

1
2
3
4
[root@lijing ~]# docker inspect mysql00 | grep Source
"Source": "/var/lib/docker/volumes/80e6f32c9005f737ada7019dbabee846476b07c99ffdcc5f1fe752fc658bab66/_data",
[root@lijing ~]# docker inspect wordpress00 | grep Source
"Source": "/var/lib/docker/volumes/e1a1d94fd2ef7510cdd4c17e18871e056bf34d76c45b817f3d60c47cc4375f56/_data",

记录地址

使用docker commit由容器打包镜像:docker commit 容器id 生成镜像名: [TAG]

docker commit mysql00 mysqltest:v0

docker commit wordpress00 wordpresstest:v0>

1
2
3
4
[root@lijing ~]# docker commit mysql00 mysqltest:v0
sha256:7a13c0ab60c208d097f8fcc63a7c32f6b4b7430b625506cfa7fd19cb9edeae3a
[root@lijing ~]# docker commit wordpress00 wordpresstest:v0
sha256:4deb7db2440a8f65e56c088d6be50e29d41fa5f7c96e89af112691722e97d7b2

保存镜像

docker save 镜像名 -o 压缩包名.tar

docker save mysqltest -o mysqltest.tar

docker save wordpresstest -o wordpresstest.tar

1
2
[root@lijing ~]# docker save mysqltest -o mysqltest.tar
[root@lijing ~]# docker save wordpresstest -o wordpresstest.tar

使用Xshell下的Xftp移动数据至另一台主机

复制 mysqltest.tar wordpresstest.tar 镜像至目标主机

1
2
3
4
[root@lijing ~]# pwd
/root
[root@lijing ~]# ls
anaconda-ks.cfg mysqltest.tar wordpresstest.tar

进入容器数据目录

1
2
3
4
5
6
[root@lijing ~]# cd /var/lib/docker/volumes/80e6f32c9005f737ada7019dbabee846476b07c99ffdcc5f1fe752fc658bab66/
[root@lijing 80e6f32c9005f737ada7019dbabee846476b07c99ffdcc5f1fe752fc658bab66]# ls
_data
[root@lijing ~]# cd /var/lib/docker/volumes/e1a1d94fd2ef7510cdd4c17e18871e056bf34d76c45b817f3d60c47cc4375f56/
[root@lijing e1a1d94fd2ef7510cdd4c17e18871e056bf34d76c45b817f3d60c47cc4375f56]# ls
_data

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

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

1
2
3
4
5
[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导出的镜像

1
2
docker load -i wordpresstest.tar
docker load -i mysqltest.tar

此次演示文件放置在docker文件夹下

1
2
3
4
5
6
[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查看本地镜像

1
2
3
4
[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 容器

1
2
3
4
[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查看新容器数据地址

1
2
3
4
[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文件夹打包复制到迁移后容器目录

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

1
2
3
4
[root@docker01 docker]# docker restart mysqltest 
mysqltest
[root@docker01 docker]# docker restart wordpresstest
wordpresstest

浏览器输入主机ip进入页面测试应用状态,提示Error establishing a database connection错误,这是我这里的数据库中的wordpress表中的数据库配置为原来的ip地址造成的,因不同人配置而异

修复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表,将对应值修改

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)

退出容器

重启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查找文件位置,编辑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,更新数据库地址

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

点击查看

本文标题:Docker跨主机容器迁移

文章作者:LiJing

发布时间:2023年11月18日 - 10:20:12

最后更新:2023年11月25日 - 12:04:51

原始链接:https://blog-next.xiaojingge.com/posts/780526992.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------