美文网首页
Docker镜像相关操作

Docker镜像相关操作

作者: jinjin1009 | 来源:发表于2021-07-03 23:06 被阅读0次

    查看镜像、容器、数据卷所占用的空间
    docker system df
    镜像是多层存储,每一层是在前一层的基础上进行修改;
    而容器同样也是多层存储,是在以镜像为基础,在其基础上加一层作为容器运行时的存储层

    一、镜像相关:
    列出本地已下载的镜像,默认展示顶层镜像:
    docker image ls
    列出包括中间层在内的所有镜像:
    docker image ls -a
    删除镜像:
    docker image rm
    检索镜像:
    docker search image_name
    显示镜像历史:
    docker history image_name
    拉取镜像:若不写默认地址为Docker Hub,命令的输出结果最后一行给出了镜像的完整名称
    docker pull ubuntu:16.04
    发布镜像:
    docker push new_image_name

    二、构建镜像
    进入容器
    docker exec命令
    docker exec -it webserver bash
    root@7603bd94b5e:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    root@27603bd94b5e:/# exit
    exit

    有时候,采用上面命令进入容器会报错,error为:OCI runtime exec failed: exec failed: container_linux.go:367: starting container process caused: exec: "bash": executable file not found in $PATH: unknown

    所以采用 docker exec -it 18ad /bin/sh

    情况一:采用docker commit 慎用
    docker commit \ --author "Joe Jiang <hijiangtao@gmail.com>" \ --message "modify: Nginx default page to Hello Docker" \ webserver \ nginx:v2

    上面的改动都会被记录于容器存储层里,而Docker提供了一个docker commit命令,可以将容器的存储层保存下来成为镜像,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像,以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

    docker commit不是很推荐使用

    1、由于commit命令的执行,有很多文件被改动或者添加,这还仅仅是比较简答的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。
    2、使用 commit 生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。
    3、不符合分层存储的概念,即任何修改的结果仅仅是在当前层进行标记,不会改动上一层,如果采用docker commit制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,因为所删除的上一层东西不会丢失,会一直跟随着这个镜像。

    情况二:采用Dockerfile
    Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM 和 RUN
    FROM制定基础镜像,如果是以scratch为基础镜像,意味着不以任何镜像为基础,是一个空白镜像,接下来所写的指令将作为镜像第一层存在
    Dockerfile中每一个指令都会建立一层,RUN也不例外,每一个RUN的行为,就和我们刚才手工建立镜像是一样的,新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像,一般编写一个RUN即可,使用&&将各个所需的命令串联起来

    最后添加了清理工作的命令,删除了为了编译构建所需要的软件,清理了所有下载、展开的文件,并且还清理了apt缓存文件。这是很重要的一步,我们之前说过,镜像是多层存储,每一层的东西并不会在下一层被删除,会一直跟随着镜像。因此镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉

    构建镜像:
    docker build -t nginx:v3 .
    注意,在nginx:v3后面有一个 . 表示当前目录,而Dockerfile就在当前目录

    当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件

    参考文章:
    https://hijiangtao.github.io/2018/04/17/Docker-in-Action/
    https://yeasy.gitbook.io/docker_practice/basic_concept/repository

    相关文章

      网友评论

          本文标题:Docker镜像相关操作

          本文链接:https://www.haomeiwen.com/subject/kbhjeltx.html