返回介绍

四、使用容器:镜像与容器

发布于 2024-08-17 19:02:34 字数 3514 浏览 0 评论 0 收藏 0

4.1 Docker 镜像

  1. 如果进行形象的表述,我们可以将 Docker 镜像理解为包含应用程序以及其相关依赖的一个基础文件系统,在 Docker 容器启动的过程中,它以只读的方式被用于创建容器的运行环境。
  2. 从另一个角度看,在之前的小节里我们讲到了, Docker 镜像其实是由基于 UnionFS 文件系统的一组镜像层依次挂载而得,而每个镜像层包含的其实是对上一镜像层的修改,这些修改其实是发生在容器运行的过程中的。所以,我们也可以反过来理解,镜像是对容器运行环境进行持久化存储的结果…

4.2 查看镜像

  1. 镜像是由 Docker 进行管理的,所以它们的存储位置和存储方式等我们并不需要过多的关心,我们只需要利用 Docker 所提供的一些接口或命令对它们进行控制即可。
  2. 如果要查看当前连接的 docker daemon 中存放和管理了哪些镜像,我们可以使用 docker images 这个命令 ( LinuxmacOS 还是 Windows 上都是一致的 )
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php 7-fpm f214b5c48a25 9 days ago 368MB
redis 3.2 2fef532eadb3 11 days ago 76MB
redis 4.0 e1a73233e3be 11 days ago 83.4MB
cogset/cron latest c01d5ac6fc8a 15 months ago 125MB...

docker images 命令的结果中,我们可以看到镜像的 ID ( IMAGE ID )、构建时间 ( CREATED )、占用空间 ( SIZE ) 等数据

这里需要注意一点,我们发现在结果中镜像 ID 的长度只有 12 个字符,这和我们之前说的 64 个字符貌似不一致。其实为了避免屏幕的空间都被这些看似“乱码”的镜像 ID 所挤占,所以 Docker 只显示了镜像 ID 的前 12 个字符,大部分情况下,它们已经能够让我们在单一主机中识别出不同的镜像了…

4.3 镜像命名

  • 镜像层的 ID 既可以识别每个镜像层,也可以用来直接识别镜像 ( 因为根据最上层镜像能够找出所有依赖的下层镜像,所以最上层进行的镜像层 ID 就能表示镜像的 ID ),但是使用这种无意义的超长哈希码显然是违背人性的,所以这里我们还要介绍镜像的命名,通过镜像名我们能够更容易的识别镜像…
  • docker images 命令打印出的内容中,我们还能看到两个与镜像命名有关的数据: REPOSITORYTAG ,这两者其实就组成了 docker 对镜像的命名规则

准确的来说,镜像的命名我们可以分成三个部分:username、repository 和 tag

  • username : 主要用于识别上传镜像的不同用户,与 GitHub 中的用户空间类似。
  • repository :主要用于识别进行的内容,形成对镜像的表意描述。
  • tag :主要用户表示镜像的版本,方便区分进行内容的不同细节

对于 username 来说,在上面我们展示的 docker images 结果中,有的镜像有 username 这个部分,而有的镜像是没有的。没有 username 这个部分的镜像,表示镜像是由 Docker 官方所维护和提供的,所以就不单独标记用户了…

4.4 容器的生命周期

容器运行的状态流转图

图中展示了几种常见对 Docker 容器的操作命令,以及执行它们之后容器运行状态的变化。这里我们撇开命令,着重看看容器的几个核心状态,也就是图中色块表示的: CreatedRunningPausedStoppedDeleted

在这几种状态中, Running 是最为关键的状态,在这种状态中的容器,就是真正正在运行的容器了

4.5 主进程

  1. 如果单纯去看容器的生命周期会有一些难理解的地方,而 Docker 中对容器生命周期的定义其实并不是独立存在的。
  2. Docker 的设计中,容器的生命周期其实与容器中 PID1 这个进程有着密切的关系。更确切的说,它们其实是共患难,同生死的兄弟。容器的启动,本质上可以理解为这个进程的启动,而容器的停止也就意味着这个进程的停止,反过来理解亦然。
  3. 当我们启动容器时, Docker 其实会按照镜像中的定义,启动对应的程序,并将这个程序的主进程作为容器的主进程 ( 也就是 PID1 的进程 )。而当我们控制容器停止时, Docker 会向主进程发送结束信号,通知程序退出。
  4. 而当容器中的主进程主动关闭时 ( 正常结束或出错停止 ),也会让容器随之停止。
  5. 通过之前提到的几个方面来看, Docker 不仅是从设计上推崇轻量化的容器,也是许多机制上是以此为原则去实现的。所以,我们最佳的 Docker 实践方法是遵循着它的逻辑,逐渐习惯这种容器即应用,应用即容器的虚拟化方式。虽然在 Docker 中我们也能够实现在同一个容器中运行多个不同类型的程序,但这么做的话, Docker 就无法跟踪不同应用的生命周期,有可能造成应用的非正常关闭,进而影响系统、数据的稳定性…

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文