Docker镜像与容器的导入和导出

Docker镜像与容器的导入和导出

镜像和容器的导入、导出操作主要涉及到下面的几个命令:save、load、export、import

镜像导入是一个复制的过程,容器导入是将当前容器变成一个新的镜像。

docker save命令保存的是镜像(image),docker export命令保存的是容器(container)。

export命令导出的tar文件略小于save命令导出的。

因为export导出的是容器,export导出的文件在import导入时,无法保留镜像所有的历史(即每一层layer信息),不能进行回滚操作。而save是根据镜像来的,所以导入时可以完整保留下每一层layer信息。

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

  1. 若是只想备份image,使用save和load。
  2. 若是在启动容器后,容器内容有变化,需要备份,则使用export和import。

容器和镜像是两个不一样的东西,所以他们的导出和导入有所区别。

容器(container) 镜像(image)
导入 docker import docker save
导出 docker export docker load

示例

需求1:将本地运行的容器,导出成 tar,tar 上传到服务器,服务器 docker 导入,并运行,相关操作如下:

1
2
3
4
5
docker export vlmcsd_vlmcsd_1 -o vlmcsd_vlmcsd_1.tar

docker import vlmcsd_vlmcsd_1.tar

docker tag e275b82bd72e vlmcsd_vlmcsd:latest

需求2:将本地镜像,导出成 tar,tar 上传到服务器,服务器 docker 导入,并运行,相关操作如下:

1
2
3
docker save 3b9acedb6a46 -o vlmcsd.tar

docker load < vlmcsd.tar

容器导出

  • docker export <CONTAINER ID>/<NAMES> -o <STDOUT>
    
    1
    2
    3
    4

    - CONTAINER ID/NAMES 容器的名字或者 ID
    - STDOUT 要导出的路径及文件名

    $ docker export --help

Usage: docker export [OPTIONS] CONTAINER

Export a container’s filesystem as a tar archive

Options:
-o, –output string Write to a file, instead of STDOUT

1
2
3
4
5
6
7



### 容器导入

- ```
docker import <FILE>
  • FILE 要导入的文件

导入完成后,使用 docker images 查看所有镜像,会发现刚刚导入的 REPOSITORYTAG<none>

这时候可以使用 docker tag 命令进行重命名 / 打标签。

也可以一步到位,在导入的时候就指定 REPOSITORYTAG

1
2
3
4
5
6
7
8
9
$ docker import --help

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

Import the contents from a tarball to create a filesystem image

Options:
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Set commit message for imported image

镜像导出

  • docker save <CONTAINER ID>/<NAMES> -o <STDOUT>
    
    1
    2
    3
    4

    - CONTAINER ID/NAMES 镜像的名字或者 ID
    - STDOUT 要导出的路径及文件名

    $ docker save --help

Usage: docker save [OPTIONS] IMAGE [IMAGE…]

Save one or more images to a tar archive (streamed to STDOUT by default)

Options:
-o, –output string Write to a file, instead of STDOUT

1
2
3
4
5
6
7



### 镜像导入

- ```
docker load < <FILE>
  • FILE 要导入的路径及文件名
1
2
3
4
5
6
7
8
9
$ docker load --help

Usage: docker load [OPTIONS]

Load an image from a tar archive or STDIN

Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output

打标签

  • docker tag <source IMAGE ID> <target image name>:<tag>
    
    1
    2
    3
    4

    - source image id 为 `<none>` 的镜像 id
    - `target image name:tag` 新命名的镜像名称及标签

    $ docker tag --help

Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165



### 参考文档

- https://docs.docker.com/engine/reference/commandline/docker/
- https://github.com/techiall/Blog/issues/61



# docker导出镜像、容器打镜像

### **方法一:通过容器导出镜像**

1 首先使用 docker ps -a 查看本机上的所有容器



> docker ps -a

2 导出镜像

使用 docker export 命令根据容器 id 将镜像导成一个文件



> docker export 容器id > image.tar

上面命令执行之后,我们便可以通过 ls 命令在当前目录下发现 image.tar

3 导入镜像

使用 docker import 命令将这个镜像导进来



> docker import 容器名 < image.tar

通过 docker images 命令查看镜像是否导入



> docker images

### ** 方法二:通过镜像**

1 通过 docker image 查看本机上的所有镜像



> docker imags

2 找到要上传的镜像的 id, 使用 docker save 命令将镜像保存为一个文件



> docker save 镜像id > image.tar

docker save 可以将多个 image 打包成一个文件



> docker save -o image.tar 镜像1 镜像2

>

3 通过 docker load 载入镜像



> docker load < image.tar

### **这两种方案的差别**

#### **1,文件大小不同**

export 导出的镜像文件体积小于 save 保存的镜像

#### ** ****2,是否可以对镜像重命名**

docker import 可以为镜像指定新名称

docker load 不能对载入的镜像重命名



#### **3,是否可以同时将多个镜像打包到一个文件中**

docker export 不支持

docker save 支持

#### ** ****4,是否包含镜像历史**

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

而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。



#### **5,应用场景不同**

docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。

docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。



### **镜像重命名**

> docker tag 存在的镜像名:tag caidingnu/镜像名称:tag

### **镜像推送到dockerhub**

先登录docker,输入账号密码

> docker login -u 用户名 -p 密码

推送镜像到docker hub

> docker push <hub-user>/<repo-name>:<tag>

jar包打镜像

> docker build -t 镜像名:tag

容器打镜像

> sudo docker commit -a "" -m "new image" 容器id xxl:v0

| Option | 功能 |
| ------ | ------------------------------ |
| -a | 指定新镜像作者 |
| -c | 使用 Dockerfile 指令来创建镜像 |
| -m | 提交生成镜像的说明信息 |
| -p | 在 commit 时,将容器暂停 |





### Docker镜像

Docker镜像是一个轻量级、可执行的独立软件包,它包含运行应用所需的一切:代码、运行时、库、环境变量和配置文件。镜像是容器运行的基础,可以看作是容器的“蓝图”。开发者可以根据这个蓝图来创建容器实例。镜像是不可变的,一旦创建,内容就不会改变。

### [Docker容器](https://zhida.zhihu.com/search?content_id=240024450&content_type=Article&match_order=1&q=Docker容器&zhida_source=entity)

容器是从镜像创建的运行实例。它在Docker引擎上运行,使用镜像提供的文件系统和设置,但也拥有自己的隔离运行空间。容器可以被启动、停止、移动和删除。每个容器都是独立的,包含自己的环境,互不影响。

在实际开发中,镜像和容器的概念十分重要。开发者通常会在本地环境中构建和测试镜像,然后将这些镜像推送到仓库,供其他人下载和运行容器。在多人协作的项目中,确保每个人都在相同的环境中工作,这对于项目的成功至关重要。



### Docker镜像导出方法

Docker提供了两种主要的方式来导出镜像,分别是`docker save`和`docker export`命令。虽然这两个命令在表面上看起来功能相似,都能够将Docker镜像或容器的内容保存到一个文件中,但它们在使用场景和结果上存在显著的差异。理解这些差异对于选择最适合您需求的工具至关重要。

### `docker save`命令

`docker save`命令用于将一个或多个Docker镜像保存到一个tar归档文件中。这个命令非常适合于镜像的备份或者将镜像从一个Docker环境迁移到另一个Docker环境的场景。

### 命令语法

```bash
docker save [OPTIONS] IMAGE [IMAGE...]
  • [OPTIONS]: 可选参数,例如-o,用于指定输出的文件名。
  • IMAGE [IMAGE…]: 指定要保存的一个或多个镜像的名称或ID。

使用场景

  • 镜像的备份与归档。
  • 将镜像从一个环境迁移到另一个环境,例如从开发环境到测试环境。

示例代码

将名为myimage:latest的Docker镜像保存到名为myimage_latest.tar的文件中:

1
docker save -o myimage_latest.tar myimage:latest

docker export命令

docker save不同,docker export命令是用于将一个运行中的容器的文件系统导出为tar归档文件。这个命令适用于需要导出容器内容,而不是镜像的场景。

命令语法

1
docker export [OPTIONS] CONTAINER
  • [OPTIONS]: 可选参数,例如-o,用于指定输出的文件名。
  • CONTAINER: 指定要导出的容器的ID或名称。

使用场景

  • 容器的文件系统备份。
  • 从运行中的容器创建镜像。

示例代码

将名为mycontainer的容器导出到名为mycontainer.tar的文件中:

1
docker export -o mycontainer.tar mycontainer

docker savedocker export的差异

尽管docker savedocker export都可以用于备份Docker镜像和容器的内容,但它们之间有几个关键区别: - 内容: docker save导出的是镜像的所有层和元数据,而docker export仅导出容器的当前文件系统状态。 - 用途: docker save适合镜像的迁移和备份,docker export适合容器文件系统的备份。 - 结果: 通过docker save导出的tar文件可以使用docker load命令重新导入为Docker镜像;通过docker export导出的tar文件可以使用docker import命令创建新的Docker镜像,但不包含原始镜像的层信息或历史。

理解这些差异有助于您根据具体的需求选择正确的工具,无论是进行镜像的备份、迁移,还是容器文件系统的导出。

接下来,我们将探讨如何使用docker loaddocker import命令来导入这些导出的tar文件,以及这两个命令之间的区别。

Docker镜像导入方法

在成功导出Docker镜像或容器后,下一步是将这些导出的文件导入到另一个Docker环境中。Docker提供了两种命令来实现这一功能:docker loaddocker import。这两个命令在功能上相似,但各自适用于不同的场景和需求。

docker load命令

docker load命令用于将通过docker save命令导出的tar归档文件导入为Docker镜像。这一命令确保了镜像的所有层和元数据都被完整地恢复,适合于镜像的迁移和恢复。

命令语法

1
docker load [OPTIONS]
  • [OPTIONS]: 可选参数,例如-i,用于指定输入的tar归档文件。

使用场景

  • 从tar归档文件中恢复Docker镜像。
  • 将镜像迁移至另一个Docker环境。

示例代码

从名为myimage_latest.tar的文件中加载镜像:

1
docker load -i myimage_latest.tar

docker import命令

docker import命令用于创建一个新的Docker镜像,从通过docker export命令或任意tar归档文件导出的容器文件系统中。与docker load不同,docker import不恢复镜像的层和元数据,而是创建一个新的镜像层。

命令语法

1
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
  • file|URL|-: 指定tar归档文件的路径,可以是本地文件路径、URL或者直接从标准输入中读取。
  • [REPOSITORY[:TAG]]: 可选参数,用于指定新创建镜像的仓库和标签。

使用场景

  • 从容器的文件系统创建新的Docker镜像。
  • 从备份或其他tar归档文件中恢复容器数据。

示例代码

从名为mycontainer.tar的文件创建一个新的镜像,并指定标签:

1
docker import mycontainer.tar mynewimage:latest

docker loaddocker import的差异

docker loaddocker import在导入Docker镜像时扮演了不同的角色,主要区别如下: - 源文件: docker load用于导入通过docker save创建的tar文件,而docker import用于导入通过docker export或其他方式创建的容器文件系统的tar文件。 - 结果: docker load恢复一个完整的镜像,包括所有层和元数据;docker import创建一个新的镜像,仅包含单个层。 - 使用场景: docker load适合于镜像的完整迁移和备份恢复;docker import适合于基于容器文件系统创建新镜像或从备份中恢复数据。

理解这些差异有助于您根据具体的需求和场景,选择最合适的命令来导入Docker镜像。

接下来,我们将深入探讨如何处理Docker容器的导出与导入,这包括容器数据卷的备份与恢复,以及使用docker exportdocker import命令处理容器数据的高级技巧。这将为您提供更全面的操作指南,帮助您高效管理Docker环境中的资源。

Docker容器的导出与导入

在日常开发和运维中,除了镜像的导入导出,处理Docker容器的导出与导入也是一项重要的技能。这不仅涉及到容器文件系统的备份与恢复,还包括如何高效地管理容器数据卷,确保数据的持久化和一致性。接下来,我们将探讨容器数据的导出导入方法,以及如何利用这些方法在不同环境之间迁移容器数据。

容器导出为镜像

在某些情况下,您可能需要将正在运行的容器及其当前状态导出为一个新的镜像,以便在其他地方重现相同的环境。这可以通过结合使用docker commitdocker save命令来实现。

docker commit命令

首先,使用docker commit命令将容器的当前状态保存为一个新的镜像。

1
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  • CONTAINER: 要导出的容器ID或名称。
  • [REPOSITORY[:TAG]]: 新创建镜像的仓库和标签。

示例

将名为mycontainer的容器保存为一个新的镜像mycontainerimage:latest

1
docker commit mycontainer mycontainerimage:latest

接下来,您可以使用docker save命令将这个新创建的镜像导出为tar文件,如前文所述。

容器数据卷的备份与恢复

对于使用数据卷的容器,备份和恢复数据卷内容是维护数据持久性的关键步骤。Docker没有直接的命令来备份或恢复数据卷,但您可以通过在运行的容器内部或者使用Docker卷挂载的主机路径来手动备份数据卷。

数据卷备份

使用docker cp命令或直接在宿主机上压缩数据卷目录来备份数据。

数据卷恢复

将备份文件解压到新容器的数据卷路径或挂载的宿主机路径上。

使用docker exportdocker import处理容器数据

虽然docker exportdocker import主要用于容器的文件系统,但通过先将容器导出为镜像,再进行导出导入操作,也可以间接实现容器数据的迁移。

容器导出

首先,使用docker commit将容器保存为镜像,然后使用docker save导出为tar文件。

容器导入

使用docker load将tar文件导入为镜像,然后基于这个镜像启动新容器,实现数据的迁移。

小结

处理Docker容器的导出与导入,不仅仅是关于文件的传输,更涉及到对容器状态和数据持久性的管理。