zoukankan      html  css  js  c++  java
  • 【Docker】Docker 使用镜像

    参考教程:https://yeasy.gitbook.io/docker_practice/introduction
    书籍:《Docker技术入门与实践》

    Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
    本章将介绍更多关于镜像的内容,包括:

    • 从仓库获取镜像
    • 管理本地主机上的镜像
    • 介绍镜像实现的基本原理

    环境

    1. virtual box 6.1
    2. centos 7.8
    3. docker 19.03

    获取镜像

    下载镜像

    之前提到过,Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像。

    从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

    docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

    具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。

    • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
    • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。

    比如:

    $ docker pull ubuntu:18.04
    18.04: Pulling from library/ubuntu
    bf5d46315322: Pull complete
    9f13e0ac480c: Pull complete
    e8988b5b3097: Pull complete
    40af181810e7: Pull complete
    e6f7c7e5c03e: Pull complete
    Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe
    Status: Downloaded newer image for ubuntu:18.04
    

    上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:18.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 18.04 的镜像。

    从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。

    在使用上面命令的时候,你可能会发现,你所看到的层 ID 以及 sha256 的摘要和这里的不一样。这是因为官方镜像是一直在维护的,有任何新的 bug,或者版本更新,都会进行修复再以原来的标签发布,这样可以确保任何使用这个标签的用户可以获得更安全、更稳定的镜像。

    运行镜像

    有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的 ubuntu:18.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。

    $ docker run -it --rm ubuntu:18.04 bash
    
    root@e7009c6ce357:/# cat /etc/os-release
    NAME="Ubuntu"
    VERSION="18.04.1 LTS (Bionic Beaver)"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 18.04.1 LTS"
    VERSION_ID="18.04"
    HOME_URL="https://www.ubuntu.com/"
    SUPPORT_URL="https://help.ubuntu.com/"
    BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
    PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
    VERSION_CODENAME=bionic
    UBUNTU_CODENAME=bionic
    

    docker run 就是运行容器的命令,具体格式我们会在容器一节进行详细讲解,我们这里简要的说明一下上面用到的参数。

    • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
    • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
    • ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器。
    • bash:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash

    进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 18.04.1 LTS 系统。

    最后我们通过 exit 退出了这个容器。

    列出镜像

    要想列出已经下载下来的镜像,可以使用 docker image ls 命令。

    $ docker image ls
    REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
    redis                latest              5f515359c7f8        5 days ago          183 MB
    nginx                latest              05a60462f8ba        5 days ago          181 MB
    mongo                3.2                 fe9198c04d62        5 days ago          342 MB
    <none>               <none>              00285df0df87        5 days ago          342 MB
    ubuntu               18.04               f753707788c5        4 weeks ago         127 MB
    ubuntu               latest              f753707788c5        4 weeks ago         127 M
    

    列表包含了 仓库名标签镜像 ID创建时间 以及 所占用的空间

    其中仓库名、标签在之前的基础概念章节已经介绍过了。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个 标签。因此,在上面的例子中,我们可以看到 ubuntu:18.04ubuntu:latest 拥有相同的 ID,因为它们对应的是同一个镜像。

    删除镜像

    删除镜像时,可以使用镜像的 ID,镜像名或者镜像摘要进行删除。

    $  docker image ls
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              latest              bb0eaf4eee00        2 days ago          72.9MB
    redis               latest              84c5f6e03bf0        8 days ago          104MB
    nginx               latest              7e4d58f0e5f3        8 days ago          133MB
    busybox             latest              6858809bf669        10 days ago         1.23MB
    [node1] (local) root@192.168.0.18 ~
    $ docker image rm bb0eaf4e
    Untagged: ubuntu:latest
    Untagged: ubuntu@sha256:cbcf86d7781dbb3a6aa2bcea25403f6b0b443e20b9959165cf52d2cc9608e4b9
    Deleted: sha256:bb0eaf4eee00c28cb8ffd54e571dd225f1dd2ed8d8751b2835c31e84188bf2de
    Deleted: sha256:362bda1d1f9b8af533390c6046a74e279bccd5fb70472b5afd4ab4b8d40e10cf
    Deleted: sha256:832c9286fda134a08292f53028ff1d50dc232cef9317fd7e108e24c480c42217
    Deleted: sha256:b2fd17df207168da45a6eefccbf58eca08d05b263b3eeb365b6e4b321b18cdc8
    [node1] (local) root@192.168.0.18 ~
    $ docker image rm redis
    Untagged: redis:latest
    Untagged: redis@sha256:1cfb205a988a9dae5f025c57b92e9643ec0e7ccff6e66bc639d8a5f95bba928c
    Deleted: sha256:84c5f6e03bf04e139705ceb2612ae274aad94f8dcf8cc630fbf6d91975f2e1c9
    Deleted: sha256:302d9c99198ac9f8d56c5dae991b77a64e094626553e3cb601132f35d10ccb61
    Deleted: sha256:9c18c8ee5ed59040373f1fe21b7071062be0c7a274331da22d4f29b30716a53e
    Deleted: sha256:f8e08eb76c8dbd0c01edda03625e0bd0a3c6521b780374b91d457d4f045aea5e
    Deleted: sha256:0df6c826b3b757c0c37e282245c139abc81ba1678a506eb5f8f68174ce2fbee1
    Deleted: sha256:04ea7ac0e6e99e0aeec0cd44a9f99f516e2791e0918f35ca58296f664c05676a
    [node1] (local) root@192.168.0.18 ~
    

    Untagged 和 Deleted

    如果观察上面这几个命令的运行输出信息的话,你会注意到删除行为分为两类,一类是 Untagged,另一类是 Deleted。我们之前介绍过,镜像的唯一标识是其 ID 和摘要,而一个镜像可以有多个标签。

    因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete 行为就不会发生。所以并非所有的 docker image rm 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。

    当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变得非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。这就是为什么,有时候会奇怪,为什么明明没有别的标签指向这个镜像,但是它还是存在的原因,也是为什么有时候会发现所删除的层数和自己 docker pull 看到的层数不一样的原因。

    除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。之前讲过,容器是以镜像为基础,再加一层容器存储层,组成这样的多层存储结构去运行的。因此该镜像如果被这个容器所依赖的,那么删除必然会导致故障。如果这些容器是不需要的,应该先将它们删除,然后再来删除镜像。

    总结

    介绍了镜像的下载、查看、使用和删除。

  • 相关阅读:
    ASP.NET获取客户端IP地址Marc地址
    WPF(MultiBinding 数据对比验证,启用提交)
    WPF(Binding of ObjectDataProvider)
    WPF(附加属性 Slider)
    WPF(Binding of ItemsControl)
    WPF( 数据验证)
    WPF(依赖属性)
    WPF(附加属性)
    WPF(Binding of RelativeSource)
    WPF(Binding of LinQ)
  • 原文地址:https://www.cnblogs.com/jiangbo44/p/14025493.html
Copyright © 2011-2022 走看看