docker export_Docker 镜像/容器的导入导出
最近在研究一个开源的小项目,准备部署在公司的测试环境试试,结果由于网络隔离,不能pull 外部镜像,于是先在本地把项目构建好,再将其导出成文件,传到内网。这个过程中用到了 Docker 镜像的导入导出。于是研究了一下 Docker 镜像和容器的导入导出功能。一、镜像导入/导出1.1 镜像导出如果要导出镜像到本地文件,可以使用docker [image] save 命令。该命令支持-o,-out..
最近在研究一个开源的小项目,准备部署在公司的测试环境试试,结果由于网络隔离,不能pull 外部镜像,于是先在本地把项目构建好,再将其导出成文件,传到内网。这个过程中用到了 Docker 镜像的导入导出。于是研究了一下 Docker 镜像和容器的导入导出功能。
一、镜像导入/导出
1.1 镜像导出
如果要导出镜像到本地文件,可以使用 docker [image] save 命令。该命令支持-o,-output string 参数,导出镜像到指定文件中(也可以重定向到指定文件中)。该命令格式为:
镜像导出演示:
--
1.2 镜像导入
将导出的镜像文件传到需要部署的服务器上之后,需要先将镜像导入 Docker 本地镜像库中。可以使用 docker [image] load 命令,支持 -i,-input string选项,从指定文件中读入镜像内容(也可以使用重定向方式读入镜像内容)。该命令格式为:
镜像导入演示:
-- 使用 -i参数 导入镜像
% docker load -i mysql_5.7_o.tar
13cb14c2acd3: Loading layer [==================================================>] 72.49MB/72.49MB
365386a39e0e: Loading layer [==================================================>] 338.4kB/338.4kB
c3f46b20a0d3: Loading layer [==================================================>] 9.539MB/9.539MB
66c45123fd43: Loading layer [==================================================>] 4.2MB/4.2MB
61cbb8ea6481: Loading layer [==================================================>] 1.536kB/1.536kB
44853bb67274: Loading layer [==================================================>] 53.75MB/53.75MB
3a2464d8e0c0: Loading layer [==================================================>] 6.656kB/6.656kB
91ae264962fb: Loading layer [==================================================>] 3.584kB/3.584kB
8f0182ef7c8c: Loading layer [==================================================>] 313.1MB/313.1MB
ac7657905788: Loading layer [==================================================>] 16.38kB/16.38kB
c90a34afcab0: Loading layer [==================================================>] 1.536kB/1.536kB
Loaded image ID: sha256:9cfcce23593a93135ca6dbf3ed544d1db9324d4c40b5c0d56958165bfaa2d46a
-- 查看镜像列表
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 9cfcce23593a 4 weeks ago 448MB
redis latest 36304d3b4540 6 weeks ago 104MB
mysql latest 30f937e841c8 7 weeks ago 541MB
-- 使用重定向方式导入镜像
% docker load < mysql_5.7_c.tar
13cb14c2acd3: Loading layer [==================================================>] 72.49MB/72.49MB
365386a39e0e: Loading layer [==================================================>] 338.4kB/338.4kB
c3f46b20a0d3: Loading layer [==================================================>] 9.539MB/9.539MB
66c45123fd43: Loading layer [==================================================>] 4.2MB/4.2MB
61cbb8ea6481: Loading layer [==================================================>] 1.536kB/1.536kB
44853bb67274: Loading layer [==================================================>] 53.75MB/53.75MB
3a2464d8e0c0: Loading layer [==================================================>] 6.656kB/6.656kB
91ae264962fb: Loading layer [==================================================>] 3.584kB/3.584kB
8f0182ef7c8c: Loading layer [==================================================>] 313.1MB/313.1MB
ac7657905788: Loading layer [==================================================>] 16.38kB/16.38kB
c90a34afcab0: Loading layer [==================================================>] 1.536kB/1.536kB
Loaded image ID: sha256:9cfcce23593a93135ca6dbf3ed544d1db9324d4c40b5c0d56958165bfaa2d46a
-- 查看镜像列表
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 9cfcce23593a 4 weeks ago 448MB
redis latest 36304d3b4540 6 weeks ago 104MB
mysql latest 30f937e841c8 7 weeks ago 541MB
我们可以看到 load 命令导入的镜像 ID 和导出镜像的 ID 是相同的。
但是 load 命令导入的镜像是没有命名的,这是因为 load 命令不支持导入时重命名。我们需要手动给导入的镜像命名。
% docker tag 9cfcce23593a mysql:5.7
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 9cfcce23593a 4 weeks ago 448MB
redis latest 36304d3b4540 6 weeks ago 104MB
mysql latest 30f937e841c8 7 weeks ago 541MB
二、容器导入导出
有时候需要将配置好的容器从一个服务器迁移到另外一个服务器,这时就可以使用 Docker 的容器导入和导出功能。
2.1 容器导出
导出容器是指,导出一个已经创建的容器导到一个文件,不管此时这个容器是否处于运行状态。可以使用 docker [container] export 命令,可以通过-o 选项来指定导出的 tar 文件名(也可以通过重定向来实现)。该命令格式为:
容器导出演示:
--
2.2 容器导入
由容器可以使用 docker [container] import 命令导入变成镜像,可以通过-c, --change=[]选项在导入的同时执行对容器进行修改的 DockerFile 指令。该命令格式为:
导入演示:
-- 将文件导入为镜像
% docker import mysql.tar mysql:latest
sha256:f924c1cd09f1388b920e3bf34a680ec22d1989b6a0bbd65174b4ffa86288c0a4
-- 查看镜像列表
yangdong@MacBook-Pro DockerFile % docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest f924c1cd09f1 18 seconds ago 728MB
redis latest 36304d3b4540 6 weeks ago 104MB
文件导入为镜像之后,我们需要将其启动为容器。
-- 创建容器
% docker run --name sportplay -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest
docker: Error response from daemon: No command specified.
See 'docker run --help'.
这里可以看到,需要加参数,于是我们到原容器所在的服务器查看一下创建这个容器的时候所用到的参数。使用 docker ps --no-trunc 命令可以查看 COMMAND 的值。
现在我们加上参数重新创建容器。
-- 创建容器
% docker run --name sportplay -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest docker-entrypoint.sh mysqld
a7dd4c3b9fedaeba668563ba5e14af58cceb91b47d9a7da8cdfc834c230c87de
-- 查看容器已经创建
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7dd4c3b9fed mysql:latest "docker-entrypoint.s…" 5 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp sportplay
9cbd2d7d768f redis:latest "docker-entrypoint.s…" 4 weeks ago Up 4 weeks 0.0.0.0:6379->6379/tcp festive_lewin
-- 进入容器内部,可以看到容器状态和导出前一致,有一个test库
% docker exec -it sportplay /bin/bash
root@a7dd4c3b9fed:/# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 8
Server version: 8.0.20 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.01 sec)
我们可以看到,使用 docker export 和 docker import 导出并导入之后,按照相同的命令去创建容器后,所创建的容器和导出的容器状态完全一样,这样就可以做到项目随时迁移。
三、save/load 和 export/import 的区别
3.1 镜像和容器 导出和导入的区别
- 镜像导入 是复制的过程,导入的镜像 ID 和导出的镜像 ID 相同;
- 容器导入 是将当前容器变成一个新的镜像。
3.2 save 和 export 区别
- save 保存镜像所有的信息-包含历史,体积更大;
- export 只导出当前的信息,将丢弃所有的历史记录和元数据信息,体积更小。
3.3 load 和 import 区别
- load 不能重命名导入的镜像;
- import 可以重命名导入的镜像,并且还可以在导入的同时执行对容器进行修改的 DockerFile 指令。
更多推荐
所有评论(0)