由于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 -p | ps | commit | login | images | info |
start/stop/restart | inspect | cp | pull | rmi | version |
kill | top | diff | push | tag | |
rm | attach | search | build | ||
pause/unpause | events | history | |||
create | logs | save | |||
exec | wait | import | |||
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
[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
[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>
[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
[root@lijing ~]# docker save mysqltest -o mysqltest.tar
[root@lijing ~]# docker save wordpresstest -o wordpresstest.tar
使用Xshell下的Xftp移动数据至另一台主机
复制 mysqltest.tar wordpresstest.tar
镜像至目标主机
[root@lijing ~]# pwd
/root
[root@lijing ~]# ls
anaconda-ks.cfg mysqltest.tar wordpresstest.tar
进入容器数据目录
[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/目录下
被迁移主机操作完成,进入迁移主机
[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查看本地镜像
[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 容器
[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查看新容器数据地址
[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重启容器
[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,更新数据库地址
刷新页面,应用已迁移完成
评论区