docker export_Docker 镜像/容器的导入导出

00866d0d9bff24cffd26e0cdb3951b38.png
最近在研究一个开源的小项目,准备部署在公司的测试环境试试,结果由于网络隔离,不能pull 外部镜像,于是先在本地把项目构建好,再将其导出成文件,传到内网。这个过程中用到了 Docker 镜像的导入导出。于是研究了一下 Docker 镜像和容器的导入导出功能。

一、镜像导入/导出

1.1 镜像导出

如果要导出镜像到本地文件,可以使用 docker [image] save 命令。该命令支持-o,-output string 参数,导出镜像到指定文件中(也可以重定向到指定文件中)。该命令格式为:

62ac3a5c014dcbb1001230b311113d5d.png
docker save 命令

镜像导出演示:

-- 

1.2 镜像导入

将导出的镜像文件传到需要部署的服务器上之后,需要先将镜像导入 Docker 本地镜像库中。可以使用 docker [image] load 命令,支持 -i,-input string选项,从指定文件中读入镜像内容(也可以使用重定向方式读入镜像内容)。该命令格式为:

96b27558172be653735ce5392873fdce.png
docker load 命令

镜像导入演示:

-- 使用 -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 文件名(也可以通过重定向来实现)。该命令格式为:

7404d82a846b7fae0ae17749ed0b89fe.png

容器导出演示:

-- 

2.2 容器导入

由容器可以使用 docker [container] import 命令导入变成镜像,可以通过-c, --change=[]选项在导入的同时执行对容器进行修改的 DockerFile 指令。该命令格式为:

107aeb87fe391ee87437e2b2634904f9.png

导入演示:

-- 将文件导入为镜像
% 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 的值。

709f3942abbf7e9cba08b52ec9e1dd7f.png

现在我们加上参数重新创建容器。

-- 创建容器
% 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 镜像和容器 导出和导入的区别

  1. 镜像导入 是复制的过程,导入的镜像 ID 和导出的镜像 ID 相同;
  2. 容器导入 是将当前容器变成一个新的镜像。

3.2 save 和 export 区别

  1. save 保存镜像所有的信息-包含历史,体积更大;
  2. export 只导出当前的信息,将丢弃所有的历史记录和元数据信息,体积更小。

3.3 load 和 import 区别

  1. load 不能重命名导入的镜像;
  2. import 可以重命名导入的镜像,并且还可以在导入的同时执行对容器进行修改的 DockerFile 指令。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值