参:https://cloud.tencent.com/developer/article/2027894
Docker镜像与容器的备份迁移
容器迁移直接看最后的案例的方式。推荐使用 commit 构建新镜像,导出后迁移。
用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
save、export 和 commit 的区别
docker save:是用来保存镜像的
- 用途:用于将一个或多个 Docker 镜像保存到一个压缩的 tar 文件中。
- 特点:保存的 tar 文件包含镜像的所有层、标签、元数据和历史记录,这允许在不同 Docker 环境之间完整地迁移和还原镜像。
- 场景:适用于在不同 Docker 环境之间共享和迁移镜像,或在无网络连接的环境中部署镜像。
docker export:是用来导出容器文件系统的
- 用途:用于将 Docker 容器(无论是运行中还是已停止的)的文件系统导出为一个 tar 存档文件。
- 特点:导出的 tar 文件不包含容器的历史记录和元数据,只包含文件系统状态,这使得导出的文件更为紧凑但功能有所损失。
- 场景:适用于备份或迁移容器的当前状态,但不需要保留完整的容器历史或元数据。
docker commit:是用来根据容器的当前状态创建新镜像的
- 用途:基于正在运行的容器的当前状态创建一个新的 Docker 镜像。
- 特点:允许捕获容器所做的更改,并保存为一个新的镜像,包括容器的历史记录和元数据。
- 场景:当对容器进行了修改(如安装软件、更改配置等)后,并希望保存这些更改以便将来创建相同状态的容器或共享该状态时,非常有用。
容器迁移(export/import)
应用场景:
主要用来制作基础镜像,比如从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,如作为基础的开发环境。
注意:
- 它只会导出文件系统;会丢失历史记录和元数据,如映射端口、CMD 和 ENTRYPOINT 配置。数据卷也不会包含在导出归档中。
- 启动export与import命令导出导入的镜像必须加/bin/bash或者其他/bin/sh,否则会报错。
# 导出(export):导出容器会丢失历史记录和元数据,类似快照
docker export [container ID or NAMES] > xx.tar # 将导出容器快照到本地文件(.tar)
# 导入(import)
docker import xx.tar [REPOSITORY:TAG]
案例:
通过 export 命令也可以将容器里的数据保存,并可以迁移到别的docker主机。
# 创建容器 web
[root@localhost ~]# docker run -itd --name web nginx
9a17f7c9f00a3711018581a1523ecd7a06c40d1408ae5678e034be1a1e4e0cd8
# 新增数据
[root@localhost ~]# docker exec -it web touch /mnt/test.txt
[root@localhost ~]# docker exec -it web ls /mnt/
test.txt
# 导出容器快照
[root@localhost ~]# docker export web > web.tar
[root@localhost ~]# docker import web.tar web:v