一.将容器制作成新的镜像

(1)描述

docker commit :从容器创建一个新的镜像。

(2)语法

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

(3)参数

a :提交的镜像作者;
–c :使用Dockerfile指令来创建镜像;
–m :提交时的说明文字;
–p :在commit时,将容器暂停

(4)实例

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
619031b389ad        mysql               "docker-entrypoint..."   3 minutes ago       Up 3 minutes        33060/tcp, 0.0.0.0:3306->3306/tcp   mysql
[root@localhost ~]# docker commit -a "lqh" -m "ceshi" 619031b389ad mysql:v1
sha256:d6392cc301eacd443541aa0c92ab5a561fa3eedc0b30757c8887cdf8a3afe7d9
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               v1                  d6392cc301ea        6 seconds ago       514 MB
docker.io/mysql     latest              0716d6ebcc1a        13 days ago         514 MB

二.导出镜像到本地

(1)描述

docker save : 将指定镜像保存成 tar 归档文件。

(2)语法

docker save [OPTIONS] IMAGE [IMAGE...]

(3)参数

o :输出到的文件。

(4)实例

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               v1                  d6392cc301ea        6 seconds ago       514 MB
docker.io/mysql     latest              0716d6ebcc1a        13 days ago         514 MB
[root@localhost ~]# docker save -o mysql.tar mysql:v1
[root@localhost ~]# ll
总用量 507096
-rw-------. 1 root root      1319 6月  19 00:56 anaconda-ks.cfg
-rw-------  1 root root 519262208 9月  17 14:45 mysql.tar

三.加载镜像

(1)描述

docker load : 导入使用 docker save 命令导出的镜像。

(2)语法

docker load [OPTIONS]

(3)参数

–input , -i : 指定导入的文件,代替 STDIN。
–quiet , -q : 精简输出信息。

(4)实例

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
[root@localhost ~]# ll
总用量 507096
-rw-------. 1 root root      1319 6月  19 00:56 anaconda-ks.cfg
-rw-------  1 root root 519262208 9月  17 14:45 mysql.tar
[root@localhost ~]# docker load -i mysql.tar 
d000633a5681: Loading layer 72.53 MB/72.53 MB
731f7c213603: Loading layer 338.4 kB/338.4 kB
b2830993d63a: Loading layer 9.557 MB/9.557 MB
97a2a3481f0d: Loading layer 4.202 MB/4.202 MB
35e94dafc854: Loading layer 2.048 kB/2.048 kB
2eaac5532d44: Loading layer 53.77 MB/53.77 MB
89638afc97cd: Loading layer 5.632 kB/5.632 kB
cf0cecb7358f: Loading layer 3.584 kB/3.584 kB
16c71bbd693d: Loading layer 378.8 MB/378.8 MB
46bb27bfe165: Loading layer 5.632 kB/5.632 kB
2ecd2889304a: Loading layer 17.92 kB/17.92 kB
bc3da4909d75: Loading layer 1.536 kB/1.536 kB
c68a0d96341c: Loading layer 10.24 kB/10.24 kB
Loaded image: mysql:v1
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               v1                  d6392cc301ea        8 minutes ago       514 MB

四.docker export import与docker save load的区别

(1)作用

docker save 用来将镜像打包保存。
docker export 用来将容器打包保存,相当于容器快照。
docker load 用来载入镜像包,必须是一个分层文件系统,必须是是save的包。
docker import 用来载入容器包,必须是export的包。

(2)数据完整

docker save images_name:将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。
docker export container_id:将一个容器导出为文件,再使用docker import 命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

(3)命名

docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。

(4)是否包含镜像历史

export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

(5)应用场景不同

docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

五.docker export

(1)描述

docker export :将文件系统作为一个tar归档文件导出到STDOUT。

(2)语法

docker export [OPTIONS] CONTAINER

(3)参数

-o :将输入内容写到文件。

(4)实例

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED       STATUS       PORTS                                                                                                         NAMES
f3160b8b877a   mysql                   "docker-entrypoint.s…"   12 days ago   Up 12 days   33060/tcp, 0.0.0.0:3307->3306/tcp                                                                             mysql
[root@localhost ~]# docker export -o mysql-`date +%y%m%d`.tar  f3160b8b877a
[root@localhost ~]# ll 
-rw------- 1 root root 512821248 9月  30 10:33 mysql-210930.tar

六.docker import

(1)描述

docker import : 从归档文件中创建镜像。

(2)语法

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

(3)参数

c :应用docker 指令创建镜像;

-m :提交时的说明文字;

(4)实例

[root@localhost ~]# docker import mysql-210930.tar mysql:v1
sha256:f37a16987cf1b6383c79e5ff721e3b1c3ffc3714ab71933723971fdaa6ecb975
[root@localhost ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
mysql                          v1                  f37a16987cf1        7 seconds ago       508 MB