• 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

  • 相关阅读:
    分布式锁
    zookeeper
    工作流笔记第四天_流程变量
    工作流笔记第三天_流程实例
    工作流笔记第二天_流程定义的CRUD
    工作流笔记第一天_简单介绍activiti
    groovy修改代码不用重启通过监听记录改变时间重新加载
    遇到的前端问题
    常用正则表达式大全
    Hibernate中Session.get()方法和load()方法的详细比较
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/15320991.html
Copyright © 2020-2023  润新知