一、简介

将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件,便于迁移便于复制

1.1 两种方式

1.1.1 运行容器,打包成文件,便于迁移

  1. 导出的 tar 包是 纯净的文件系统打包,不包含 Docker 镜像的分层结构、镜像元数据、容器的环境变量、端口映射、挂载配置等信息;
  2. 对容器状态无要求:运行中的容器、已经停止的容器,都可以被 export 导出;import导入。
  3. 导出的文件体积偏小,因为只打包「容器最终的文件系统」,不会冗余存储镜像的分层数据。

1.1.2 运行的容器,直接做成镜像,便于本地二次使用

二、容器系统打包export

将容器的文件系统导出为tar归档文件(扁平化,仅保留当前文件系统状态,无镜像层,元数据)

2.1 export和import的打包示范

export对当前的容器状态建立快照,并持久化为tar文件

docker export 存出镜像时,是不保存历史镜像层信息的;

import导入打包的容器;

(最好使用两台服务器,此处我用一台服务器给大家演示)

2.1.1 查看当前运行的容器信息

# 只看运行的容器信息
docker ps

2.1.2 选择容器进行打包

# -o 就是output的意思
docker export -o <自定义tar包名>  容器ID

我们把前面打包的这个运行容器删除掉

2.2 导入打包容器

import(export的黄金搭档) 从一个tar归档包(就是export导出的包)中导入文件内容,创建一个全新的Docker文件系统镜像;

2.2.1 导入打包容器

docker import <tar的存放路径>  <new 镜像 name>

给容器镜像更名,清理了不需要的镜像名

docker run -it --name <new_docker_name> 镜像名 /bin/bash

三、容器创建镜像 commit

镜像文件除了打包这种方法,还可以用容器实例,直接转为镜像。将一个容器的当前状态(文件系统 + 运行配置)提交为一个新的Docker镜像,本质是基于容器的修改创建的镜像层。

3.1 commit的打包示范

# 查看正在运行的容器
docker ps

# 附着其中一个容器内部
docker attach 容器ID

# 添加自定义内容然后按ctrl+p+q退出

# 生成容器并查询
docker commit 运行的容器ID 新的镜像名

运行并验证

四、镜像迁移save&load

保存一台宿主机上的镜像为tar文件,然后可以导入到其他的宿主机上;将一个/多个Docker镜像打包成tar归档文件(包含镜像的所有层、标签,元数据)

4.1 将镜像打包

docker save <打包的文件> 镜像名

4.2 通过load命令导入

# 先删除之前打包的镜像
docker rmi 镜像名

docker load < 前面save打包的文件

五、save/export/commit的区别

  • commit 容器→新镜像(存本地),适合临时固化容器修改;
  • save:镜像→tar包(含完整信息),适合镜像备份/迁移;
  • export:容器→tar包(仅文件系统),适合导出容器的最终文件内容。

六、通过Dockerfile创建镜像

6.1 创建工作目录

mkdir 工作目录
cd 工作目录

6.2 创建Dockerfile文件

# 必须使用Dockerfile
vim Dockerfile

6.3 遍历Dockerfile文件

镜像源

作者信息

上下文操作

6.4 构建镜像文件

# 注意最后的那个点点点
docker build -t 镜像名 .

运行验证一下

dockerfile的优化建议:

  1. RUN 命令要尽量写在一条里,每次 RUN 命令都是在之前的镜像上封装,只会增大不会减小
  2. 每次进行依赖安装后使用yum clean all清除缓存中的rpm头文件和包文件
  3. 选择比较小的基础镜像,比如:alpine

更多推荐