Docker:commit、export、import、save、load命令的使用

export和import

export、import命令是一对,save、load命令是一对。

export:导出容器快照为镜像。

import:导入容器快照到本地镜像库

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

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

commit:将已存在容器中的镜像和修改内容提交为一个新的镜像,通过这个方式同样能保存读写层内容。

下面进行演示:

export和import:

命令格式:

docker export -o xxx.tar [容器ID|Name]

docker import xxx.tar newname:tag

先运行一个容器:

docker run --name mynginx -v /opt/html:/usr/share/nginx/html -p 80:80 -d nginx

执行:

docker export -o nginx.tar mynginx
docker import nginx.tar mynginx:v1
docker images

image-20210922165220616

先关闭原来的nginx容器,再去运行import生成的镜像:

docker stop mynginx
docker run --name mynginx.v1 -v /opt/html:/usr/share/nginx/html -p 80:80 -d mynginx:v1

这时候,我们发现docker run直接报错,说我们没有定义执行命令

image-20210922165507849

这时候,对于import生成的镜像,我们需要手动指定执行命令。

那么我怎么知道原镜像的执行命令呢?

两种办法:

  • 先执行docker inspect nginx,查看镜像的元信息,这里面定义了详细启动命令

    image-20210922170518471

    结合红框不难得出运行命令是:/docker-entrypoint.sh nginx -g 'daemon off;'

  • docker start mynginx
    docker ps --no-trunc
    

    image-20210922170743081

重新执行:

docker stop mynginx
docker run --name mynginx.v1 -v /opt/html:/usr/share/nginx/html -p 80:80 -d mynginx:v1 /docker-entrypoint.sh nginx -g 'daemon off;'

所以docker export和import比较坑,import生成的镜像不能直接run,需要知道之前容器的启动命令。

那出了不能直接run,还有其他区别吗?

使用docker inspect,查看原镜像:文件系统分了很多层。

image-20210922172358663

再看import生成的镜像:个镜像只剩了一层,其他的层级全没有了,整个镜像体积较之前也小了一些

image-20210922173210551

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

save和load

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

命令:docker save -o xxx.tar 镜像名

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

命令:docker load -i xxx.tar

这两个命令比较简单,也没有什么坑,不着重介绍。

应用场景:

​ 用于镜像迁移到别处。

commit

将已存在容器中的镜像和修改内容提交为一个新的镜像,通过这个方式同样能保存读写层内容。

命令格式:

docker commit [容器名称|ID] 生成新的镜像名字

选项说明:

-a:提交的镜像作者

-c:使用dockerfile指令来创建镜像

-m:提交时的说明文字

-p:在commit的时候,将正在运行的容器暂停

测试:

docker run --name mynginx -v /opt/html:/usr/share/nginx/html -p 80:80 -d nginx
docker commit mynginx mynginx:v2
docker inspect mynginx:v2

image-20210922173925240

发现比原来的镜像多了一层。

应用场景:
 主要作用是将配置好的一些容器生成新的镜像,可以得到复用(再次使用不需要再配置)。

通过commit+save+load可以实现:我先在A机器上配置好了一个镜像,然后通过commit生成了镜像,使用save命令生成该镜像对应的tar包,然后移动到B机器上,然后在B机器上执行load命令,加载tar包到本地镜像仓库。当然你可以说那我有私人镜像仓库,就不用这么麻烦了,但是不是所有机器都在一个局域网内,那么这时候这几个命令就可以大展身手了。

参考:https://blog.csdn.net/qq_44895681/article/details/106100061

https://zhuanlan.zhihu.com/p/152219012

原文地址:https://www.cnblogs.com/wwjj4811/p/15320991.html