文章目录
- 应用场景
- 测试环境的快速迁移
- 多环境的并行开发
- 备份容器运行环境,但不包括数据卷的数据
- 1.查找容器ID
- 2.创建新镜像
- 3.备份新镜像为tar文件
- 4.加载新镜像
- 5.使用新镜像启动容器
- 备份数据卷
- 1.找到容器使用的数据卷挂载路径
- 2.备份数据卷
- 3.数据卷恢复数据
应用场景
测试环境的快速迁移
在实际应用中,我们常常需要迁移测试环境。如果完全重新安装,过程不仅费时费力,而且容易出错。在这种情况下,可以利用 Docker 的移植性和快速部署特性,快速迁移一套完整的测试环境。通过备份当前测试环境的容器镜像和数据卷,我们可以在新的环境中迅速还原,实现无缝过渡。
多环境的并行开发
开发和测试团队往往需要同时处理多个项目。Docker 可以让我们在同一台机器上并行运行多个容器,每个容器可以对应不同的项目环境。这样,不仅节省了硬件资源,还减少了环境切换带来的麻烦。
备份容器运行环境,但不包括数据卷的数据
1.查找容器ID
# 查看所有容器
docker ps -a
# 查看镜像 docker images # 一次性删除所有的容器 docker rm $(docker ps -q -a) # 一次性删除所有的镜像 docker rmi $(docker images -q) # 删除 image 文件 docker image rm [imageName]
2.创建新镜像
# 把容器创建一个新的镜像。
docker commit 容器ID 新镜像名称:标签
docker commit e80ebe336e4f mysql:laker.1.0# 查看镜像
docker images
推送镜像:如果希望将镜像推送到Docker注册中心,需要先运行
docker login命令登录进Docker注册中心,然后使用docker push命令推送所需的镜像。例如,docker push image-name命令将把镜像推送到Docker注册中心。
3.备份新镜像为tar文件
# 保存镜像文件,执行命令等一会儿
docker save -o 备份文件名.tar 新镜像名称:标签
docker save -o mysql-laker.tar mysql:laker.1.0
# 查看大小
du -sh mysql-laker.tar
4.加载新镜像
把tar包上传到新备份服务器,以下命令下新服务器执行
scp mysql-laker.tar 用户@目标主机IP:/path/to/destination
# 从tar文件加载镜像
docker load -i mysql-laker.tar
# 查看镜像
docker images
5.使用新镜像启动容器
docker run -d --name 新容器名称 新镜像名称:标签
docker run -d --name laker-mysql-test -p 3306:3306 mysql:laker.1.0
# 停止并删除容器
docker stop laker-mysql-test
docker rm laker-mysql-test
备份数据卷
1.找到容器使用的数据卷挂载路径
# 找出容器使用的数据卷
docker inspect 容器ID
# 查看数据卷挂载路径
docker inspect 容器ID | grep "Mounts" -A 10
# 查看所有卷
docker volume ls
# 查看容器内部的挂载路径
docker inspect 容器ID | grep "Destination"
docker inspect e80ebe336e4f | grep "Destination"
在输出中查找 Mounts 部分,这一节包含了挂载的所有卷的详细信息,包括卷的名称和挂载路径。以下是典型的 Mounts 信息:
"Mounts": [{"Type": "volume","Name": "my_data_volume", # 数据卷的名称"Source": "/var/lib/docker/volumes/my_data_volume/_data",# 数据卷在主机系统中的实际存储路径"Destination": "/var/lib/mysql",#数据卷在容器内的挂载路径"Driver": "local","Mode": "rw","RW": true,"Propagation": ""}
]
- Name:数据卷的名称(如
my_data_volume)。 - Source:数据卷在主机系统中的实际存储路径。
- Destination:数据卷在容器内的挂载路径。
2.备份数据卷
# /路径/数据卷 为上面的 Destination 数据卷在容器内的挂载路径
docker run --rm --volumes-from 容器ID -v $(pwd):/backup ubuntu tar cvf /backup/备份文件名.tar /路径/数据卷docker run --rm --volumes-from e80ebe336e4f -v $(pwd):/backup ubuntu tar cvf /backup/laker-data.tar /var/lib/mysql
-v $(pwd):/backup的意思是将主机的当前目录(由$(pwd)获取)挂载到容器内的/backup路径下。具体解释如下:
-v参数:用于在 Docker 容器中挂载一个卷或目录,允许在容器和主机之间共享文件或目录。$(pwd):这是一个 Shell 命令,返回当前的工作目录路径。$(pwd)的实际值会被替换成当前目录的绝对路径。例如,如果当前工作目录是/home/user, 那么$(pwd)的值就是/home/user。/backup:这是容器内部的路径。在容器启动后,容器内的/backup路径将指向主机上的当前目录($(pwd))。
3.数据卷恢复数据
# 查找新的容器ID
docker ps -a
# 在恢复数据之前,确保容器处于停止状态,特别是在进行物理备份恢复时。
docker stop laker-mysql-test
# 注意是新容器ID
# cd /路径/数据卷 进入数据卷在容器内的挂载路径。需要替换为实际的挂载路径。即上面的 Destination
docker run --rm --volumes-from 新容器ID -v $(pwd):/backup ubuntu bash -c "cd /路径/数据卷 && tar xvf /backup/备份文件名.tar --strip 1"docker run --rm --volumes-from b4006a68eb30 -v $(pwd):/backup ubuntu bash -c "cd /var/lib/mysql && tar xvf /backup/laker-data.tar --strip 1"# 重启容器
docker restart <container_name>
docker restart laker-mysql-test
# 查看日志
docker logs <container_name>
docker logs laker-mysql-test
# 查看文件
docker exec -it laker-mysql-test bash
cd /var/lib/mysql
rm -rf *
# 如果有问题可以先清空数据卷(注意:这将删除所有现有数据)
# VOLUME_NAME 参考上面找 docker inspect 容器ID | grep "Mounts" -A 10
docker run --rm -v $VOLUME_NAME:/var/lib/mysql ubuntu bash -c "rm -rf /var/lib/mysql/*"
