由于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
1 | [root@lijing ~]# docker ps |
使用
docker inspect
查看容器信息,获取容器数据地址docker inspect mysql00
打印出信息可能会很多,可使用
grep
搜索docker inspect mysql00 | grep Source
1 | [root@lijing ~]# docker inspect mysql00 | grep Source |
记录地址
使用
docker commit
由容器打包镜像:docker commit 容器id 生成镜像名: [TAG]
docker commit mysql00 mysqltest:v0
docker commit wordpress00 wordpresstest:v0>
1 | [root@lijing ~]# docker commit mysql00 mysqltest:v0 |
保存镜像
docker save 镜像名 -o 压缩包名.tar
docker save mysqltest -o mysqltest.tar
docker save wordpresstest -o wordpresstest.tar
1 | [root@lijing ~]# docker save mysqltest -o mysqltest.tar |
使用Xshell下的Xftp移动数据至另一台主机
复制 mysqltest.tar wordpresstest.tar
镜像至目标主机
1 | [root@lijing ~]# pwd |
进入容器数据目录
1 | [root@lijing ~]# cd /var/lib/docker/volumes/80e6f32c9005f737ada7019dbabee846476b07c99ffdcc5f1fe752fc658bab66/ |
复制文件夹至目标主机/var/lib/docker/volumes/目录下
被迁移主机操作完成,进入迁移主机
1 | [root@docker01 ~]# docker ps |
使用docker load 导入使用docker save导出的镜像
1 | docker load -i wordpresstest.tar |
此次演示文件放置在docker文件夹下
1 | [root@docker01 docker]# docker load -i mysqltest.tar |
使用docker images查看本地镜像
1 | [root@docker01 docker]# docker images |
使用docker run 拉起 Wordpress 与 mysql 容器
1 | [root@docker01 docker]# docker run -d -p 80:80 --name wordpresstest wordpresstest:v0 |
使用docker inspect查看新容器数据地址
1 | [root@docker01 docker]# docker inspect mysqltest | grep Source |
删除/var/lib/docker/volumes/100ac33bd265d65a84def671f3388b48d340fe2fd7983f5f50cfdbe9b215e009/_data
和
/var/lib/docker/volumes/cacf1f6f39f03f03fc56c22fa6a6a15bf7beb5a79af540589f3d1e1e0b914d07/_data将原主机_data文件夹打包复制到迁移后容器目录
数据迁移完成后,使用docker restart重启容器
1 | [root@docker01 docker]# docker restart mysqltest |
浏览器输入主机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,更新数据库地址
刷新页面,应用已迁移完成