Docker镜像的导入和导出

相关阅读:

Docker容器时间与宿主机同步

使用Docker搭建WordPress博客

Docker私有仓库搭建及镜像删除

Docker容器与宿主机同网段互相通信

在Docker上部署Ambari


场景描述

需要在客户现场快速部署应用,东西多,时间短

场景分析:

为了节省时间,使用docker进行快速部署,由于不是内部环境,无法使用内部私有库,于是构建镜像,将镜像导出

解决办法:

使用dockerfile构建应用镜像,将镜像导出,在部署的节点上将镜像导入,启动容器即可

镜像导入和导出:

docker提供了把镜像导出为文件的机制,有两种方式:

1.save / load   保存/加载

save有两种

第一种:

docker save 镜像id > 目录/XXX.tar

第二种(推荐):

docker save repository:tag > 目录/XXX.tar 

load命令如下:

docker load < XXX.tar

2.export / import  导出/导入

export命令如下:

docker export 容器名 > XXX.tar

import命令:

docker import XXX.tar REPOSITORY:TAG


这两种方式都能都导出,但是细节不同,先进行对比,后通过实例演示

导出的对象
导出文件大小
是否可回滚到历史层
save / load
镜像导出
export / import
容器导出

从本质上来说,save/load导出的是镜像,export/import导出的是容器,大家不要弄混

相对于文件大小来说,save方式导出的文件比export方式导出的文件大

正是因为save方式保存了镜像的历史和层(layer),使其可以层回滚,即回滚到之前的历史层,所以save方式导出的文件稍微大一些

反观export方式,在导出过程中丢失所有的历史,导致其不可以层回滚,导出的文件会小一些

演示:

下面通过实例,对这两种方式进行演示和对比

save / load 方式

1.save 保存镜像

这里有一个构建好的镜像

[root@uat-app01 /]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
centos_ssh                                            latest              ae0548244885        10 days ago         285 MB

先查看该镜像的历史层

注意:

docker images –tree命令已被弃用,现已用docker history +镜像id 命令

[root@uat-app01 /]# docker history ae0548244885
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
ae0548244885        10 days ago         /bin/sh -c ln -snf /usr/share/zoneinfo/$TZ...   14 B                
de38162f94f6        10 days ago         /bin/sh -c #(nop)  ENV TZ=Asia/Shanghai         0 B                 
64c78cfdb6d2        10 days ago         /bin/sh -c #(nop)  MAINTAINER yanwei <yanw...   0 B                 
7a9653034358        2 weeks ago         /bin/bash                                       81.1 MB             
3fa822599e10        7 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
<missing>           7 months ago        /bin/sh -c #(nop)  LABEL name=CentOS Base ...   0 B                 
<missing>           7 months ago        /bin/sh -c #(nop) ADD file:7441d818786942a...   204 MB   

导出该镜像,导出的镜像文件为280M

注意:

如果使用docker save + 镜像id 方式导出,导入的镜像的REPOSITORY和TAG会显示为<none>

方法1:

[root@uat-app01 /]# docker save  ae0548244885 > /centos_ssh.tar
[root@uat-app01 /]# ll -sh /centos_ssh.tar 
280M -rw-r--r-- 1 root root 280M Jul 17 11:20 /centos_ssh.tar

方法2:

[root@uat-app01 /]# docker save  centos_ssh:latest > /centos_ssh2.tar
[root@uat-app01 /]# ll -sh /centos_ssh.tar 
280M -rw-r--r-- 1 root root 280M Jul 17 11:31 /centos_ssh2.tar

2.load 加载镜像

将镜像导入到其他环境,加载镜像文件

先来加载方法1导出的镜像文件

[root@uat-ucs01 /]# docker load < /centos_ssh.tar 
d1be66a59bc5: Loading layer [==================================================>] 212.1 MB/212.1 MB
610610a96352: Loading layer [==================================================>] 81.43 MB/81.43 MB
e5dab0be5e57: Loading layer [==================================================>] 3.072 kB/3.072 kB
Loaded image ID: sha256:ae0548244885ae05a4d8a3deab32bfeb0518697986586c3a1023579c8dc2d21c B/3.072 kB

查看该镜像,REPOSITORY和TAG都为<none>

解决这种情况,使用docker tag添加标签,这里就不做演示了,多一步显得很冗余,推荐大家使用save的第二种方法导出

[root@uat-ucs01 /]# docker images -a
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
<none>                                                <none>              ae0548244885        10 days ago         284.7 MB

删除该镜像

再来加载方法2导出的镜像文件

[root@uat-ucs01 /]# docker load < /centos_ssh2.tar 
d1be66a59bc5: Loading layer [==================================================>] 212.1 MB/212.1 MB
610610a96352: Loading layer [==================================================>] 81.43 MB/81.43 MB
e5dab0be5e57: Loading layer [==================================================>] 3.072 kB/3.072 kB
Loaded image: centos_ssh:latest

查看该镜像,REPOSITORY和TAG显示都正常

[root@uat-ucs01 /]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
centos_ssh                                            latest              ae0548244885        10 days ago         284.7 MB

export / import 方式

1.export 导出

这里有一个正在运行的容器,基础镜像也是centos_ssh

[root@uat-app01 /]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                            NAMES
2cc200d98a54        centos_ssh          "/bin/bash"              14 seconds ago      Up 10 seconds                                                        wizardly_babbage

将该容器导出,export方式导出的文件大小为258M,比save方式导出的文件小了22M

[root@uat-app01 /]# docker export 2cc200d98a54 > /centos_ssh.tar
[root@uat-app01 /]# ll -sh /centos_ssh.tar 
258M -rw-r--r-- 1 root root 258M Jul 17 14:06 /centos_ssh.tar

2.import导入

在其他环境,将文件导入

[root@uat-ucs01 /]# docker import /centos_ssh.tar  centos_ssh:latest
sha256:d1e984b716211a3b29b39f75d6c31a132844f9307d87e81c540364162e311074

查看导入的镜像

[root@uat-ucs01 /]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
centos_ssh  latest              d1e984b71621        4 seconds ago       261.2 MB

查看镜像的历史层,没有之前的历史层,只有从导入开始的历史层

[root@uat-ucs01 /]# docker history d1e984b71621
IMAGE               CREATED             CREATED BY          SIZE                COMMENT
d1e984b71621        21 seconds ago                          261.2 MB            Imported from -

至此,docker的导入和导出介绍完了,我们下篇文章见

亲,看完了点个赞呗!


赫墨拉

我是一个喜爱大数据的小菜鸡,这里是我分享我的成长和经历的博客

发表评论

邮箱地址不会被公开。