美文网首页docker
【docker 笔记】docker 镜像相关整理

【docker 笔记】docker 镜像相关整理

作者: 58bc06151329 | 来源:发表于2019-05-04 19:27 被阅读3次

    文前说明

    作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

    本文仅供学习交流使用,侵权必删。
    不用于商业目的,转载请注明出处。

    1. 概述

    • 可以通过 docker pull 命令拉取镜像。
    • 可以通过 docker search 命令搜索镜像。
    • 可以通过 docker images 命令查看镜像信息,更详细的信息可以通过 docker inspect 命令查看。

    1.1 最小的镜像

    • hello-world 是 Docker 官方提供的一个镜像,通常用于验证 Docker 是否安装成功。
    [root@localhost ~]# docker pull hello-world
    Using default tag: latest
    Trying to pull repository docker.io/library/hello-world ... 
    latest: Pulling from docker.io/library/hello-world
    Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
    Status: Image is up to date for docker.io/hello-world:latest
    
    • 查看镜像信息。
    [root@localhost ~]# docker images hello-world
    REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
    docker.io/hello-world   latest              fce289e99eb9        4 months ago        1.84 kB
    
    • Dockerfile 是镜像的描述文件,定义了如何构建 Docker 镜像。
    • hello-world 的 Dockerfile 文件内容如下。
    FROM scratch
    COPY hello /
    CMD ["/hello"]
    
    • FROM scratch 镜像从空白开始构建的。
    • COPY hello / 拷贝文件 hello 到镜像的根目录。
    • CMD ["/hello"] 容器启动时,执行 /hello。
    [root@localhost ~]# docker run hello-world
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

    1.2 base 镜像

    • base 镜像有两层含义
      • 不依赖其他镜像,从 scratch 构建。
      • 其他镜像可以以之为基础进行扩展。
    • 能称为 base 镜像的通常是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu、Debian、CentOS 等。
    • Linux 操作系统由内核空间和用户空间组成。
      • 内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 被卸载。rootfs 是用户空间的文件系统,包含 /dev、/proc、/bin 等目录。
      • 对于 base 镜像而言,底层使用的是主机的 kernel,因此只需要提供 rootfs 即可。
      • 对于一个精简的 OS,rootfs 很小,只需要包含最基本的命令、工具和程序库。
    • 以 CentOS 为例,镜像的 Dockerfile 内容为。
    FROM scratch
    ADD centos-7-docker.tar.xz /
    CMD ["/bin/bash"]
    
    • ADD centos-7-docker.tar.xz / 就是把 CentOS 7 的 rootfs 添加到镜像,制作镜像时,自动解压到 / 目录下,生成 /dev、/proc、/bin 等目录。
    • 镜像的描述文件都可以在 Docker Hub 中查看。
    • 容器只能使用主机的 kernel,并且不能修改。所有的容器都共用主机的 kernel,在容器中没有办法对 kernel 升级。如果容器对 kernel 版本有要求(比如应用只能在某个 kernel 版本下运行),则不建议使用容器,这种场景虚拟机可能更加合适。

    1.3 镜像的分层结构

    镜像分层 镜像分层 2
    • Docker 支持通过扩展现有镜像,创建新的镜像。
    • Docker Hub 中的大部分镜像都是通过在 base 镜像中安装和配置需要的软件而构建出来的。
    FROM debian
    RUN opt-get install emacs
    RUN opt-get install apache2
    CMD ["/bin/bash"]
    
    • 直接在 Debian base 镜像上构建。
    • Docker 镜像采用这种分层结构的好处在于 共享资源
    • 多个镜像从相同的 base 镜像构建而来,那么主机磁盘上只需要保存一份 base 镜像即可。同时内存中也只需要加载一份 base 镜像,镜像的每一层都可以被共享。
    • 当某个容器修改了基础镜像的内容,比如 /etc,其他容器的 /etc 不会被修改,修改会被限制在单个容器内。

    Copy-on-Write

    • 当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为 容器层,之下的都是 镜像层
    • 所有对于容器层的改动,无论添加、删除、修改都会只发生在容器层。只有容器层是可写的,镜像层都是只读的
    • 镜像层数量可能会有很多,所有镜像层会联合在一起组成一个统一的文件系统。上层的会覆盖下层的相同目录,用户只能访问到上层中的文件,在容器层中,用户看到的是一个叠加后的文件系统。
      • 添加文件,在容器中创建文件时,新文件被添加到容器层中。
      • 读取文件,在容器中读取文件,Docker 会从上往下依次在各镜像层中查找此文件,一旦找到,打开并读入内存。
      • 修改文件,在容器中修改文件时,Docker 会从上往下依次在各镜像层中查找此文件,一旦找到,立即将其复制到容器层,再修改。
      • 删除文件,在容器中删除文件时,Docker 会从上往下依次在各镜像层中查找此文件,一旦找到,会在容器层中记录下此删除操作。
    • 只有需要修改时才复制一份数据,这种特性被称为 Copy-on-Write,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

    2. 构建镜像

    • docker commit 命令是创建新镜像最直观的方法,其过程包含。
      • 运行容器。
      • 修改容器。
      • 将容器保存为新的镜像。
    • Docker 并不建议用户通过这种方式构建镜像。
      • 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。
    • Docker 推荐通过 Dockerfile 描述文件进行构建,具体的语法可以查看 【docker 笔记】docker 基础命令相关整理
    • Dockerfile 是一个文本文件,记录了镜像构建的所有步骤,构建的过程中会创建临时镜像,最终通过 docker commit 命令保存新的镜像,再删除临时镜像。
    • 构建的过程,可以通过 docker history 命令验证,该命令会显示构建历史,也就是 Dockerfile 的执行过程。
      • 构建过程中的 IMAGE ID 为 missing 表示无法获取,通常从 Docker Hub 下载的镜像会存在这样的问题。
    镜像的表示
    • 镜像的表示分为四部分:红色的部分是 镜像中心域名,黄色的部分是 镜像命名空间,可以根据命名空间进行权限控制等操作,绿色是 镜像的名称,每个镜像有一个 版本(即标签)。
    • Docker 官方的镜像不需要镜像中心的域名,有一些镜像可以省略命名空间。

    2.1 镜像的缓存特性

    • Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就会直接使用,无需重新创建。
    • 如果希望在构建镜像时不使用缓存,可以在 docker build 命令中添加 --no-cache 参数。
    • Dockerfile 中每一个指令都会创建一个镜像层,上层是依赖于下层的,只要某一层发生变化,那么其上面所有层的缓存都会失效。
      • 所以改变 Dockerfile 指令的执行顺序,或者修改或添加指令,都会使缓存失效。
    • 除构建时使用缓存,Docker 在下载镜像时也会使用,如果存在则不需要再下载。

    2.2 调试 Dockerfile

    • 如果 Dockerfile 由于某种原因执行到某个指令失败了,会得到前一个指令成功执行构建出的镜像,这对调试 Dockerfile 很有帮助,可以运行最新的镜像定位指令失败的原因。
      • 运行最新的镜像,执行失败的指令,看失败原因。

    2.3 RUN、CMD 和 ENTRYPOINT 区别

    • RUN,执行命令并创建新的镜像层,RUN 经常用于安装软件包。
    • CMD,设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换。
    • ENTRYPOINT,配置容器启动时运行的命令。
    • 使用 RUN 指令安装应用和软件包,构建镜像。如果 Docker 镜像的用途是运行应用程序或服务,比如运行一个 MySQL,应用优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时利用 docker run 命令行替换默认参数。如果想为容器设置默认的启动命令,可使用 CMD 指令。用户可在 docker run 命令行中替换此默认命令。

    3. 镜像的基础操作

    • 本地镜像管理。
    操作 说明
    images 列出本地镜像。
    rmi 删除本地一个或多少镜像。
    tag 标记本地镜像,将其归入某一仓库。
    build 用于使用 Dockerfile 创建镜像。
    history 查看指定镜像的创建历史。
    save 将指定镜像保存成 tar 归档文件。
    load 导入使用 docker save 命令导出的镜像。
    • 镜像仓库。
    操作 说明
    login 登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub。
    logout 登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub。
    pull 从镜像仓库中拉取或者更新指定镜像。
    push 将本地的镜像上传到镜像仓库,需要先登陆到镜像仓库。
    search 从 Docker Hub 查找镜像。

    4. 镜像优化

    • 镜像要求指定容器的首进程,即完成三个工作。
      • 给这个容器里面其他进程正确传递信号。
      • 正确回收僵尸进程。
      • 等待子进程的退出。

    参考资料

    https://blog.csdn.net/runner668/article/details/80785241

    相关文章

      网友评论

        本文标题:【docker 笔记】docker 镜像相关整理

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