zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    FreeSql.Repository (九)级联保存
    FreeSql.Repository (八)级联加载
    FreeSql.Repository (七)多表查询
    FreeSql.Repository (六)导航属性
    FreeSql.Repository (五)状态管理
    FreeSql.Repository (四)工作单元
    FreeSql.Repository (三)实体特性
    FreeSql.Repository (一)什么是仓储
    [开源] .Net 使用 ORM 访问 华为GaussDB数据库
    24位PCM采样数据转成16位算法,已实现PCM转WAV在线工具源码支持24bits、16bits、8bits
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/15320991.html
Copyright © 2011-2022 走看看