Docker实践(10) – 类主机容器

我们现在把讨论转到Docker社区最具争议性的领域之一 – 运行一个包含多个进程的类主机镜像。
这个在Docker社区中部分人认为是一种不好的形式。容器不是虚拟机 – 它们有显著的差异 – 假装不会造成混乱和没有问题。
不管是好还是坏,本文展示如何运行一个类主机镜像,讨论这其中的一些问题。

运行一个类主机镜像是一个说服Docker反对者的好方法,Docker很有用。当他们更多地使用Docker,他们会更理解Docker范式,微服务方法对他们更有意义。在我们介绍Docker的公司中,我们发现这种单一的方法是将人们从开发服务器和笔记本电脑上的开发移动到更加包容和可管理的环境的好方法。

虚拟机与Docker容器的不同之处
这些是VM和Docker容器之间的一些区别:
Docker是面向应用的,而VM是面向操作系统的;
Docker容器与其他Docker容器共享操作系统,相比之下,VM各自有它们自己的操作系统;
Docker容器设计为运行一个主要进程,而不是管理多个进程集。

问题

你需要为容器设置一个类主机的环境,并设置多个进程和服务。

解决方法

使用旨在模拟主机的镜像,并为其提供所需的应用程序。

讨论

在下面的示例中我们使用phusion/baseimage Docker镜像,一个设计用来运行多个进程的镜像。
第一步是运行镜像并使用docker exec进入到其bash环境:

  1. user@docker-host$ docker run -d phusion/baseimage
  2. 3c3f8e3fb05d795edf9d791969b21f7f73e99eb1926a6e3d5ed9e1e52d0b446e
  3. user@docker-host$ docker exec -i -t 3c3f8e3fb05d795 /bin/bash
  4. root@3c3f8e3fb05d:/#

在这段代码中,docker run命令后台启动一个镜像(第一行),默认命令启动镜像并返回了新建容器的ID(第二行)。
然后传容器ID给docker exec命令(第三),这个命令是在已运行的容器中启动一个新的进程。-i参数允许你与新进程交互,-t参数设置一个TTY,允许你在容器内部创建一个终端(/bin/bash)(第四行)。
如果你等一分钟然后查看进程列表,输出类似如下:


你可以看到容器启动起来很像一个主机,初始化服务如cron和sshd使它看起来像一个标准的Linux主机。这对于给新的Docker工程师初始演示很有用。
这是否构成违反“一个容器一个服务”的微服务原则是Docker社区内部的一个争论。类主机镜像支持者认为这不违反这一原则,因为容器仍然可以实现其运行所在的系统的单个离散函数。

标签:容器Docker 发布于:2019-11-20 22:16:23