Docker 容器的 “单进程模型”

栏目: IT技术 · 发布时间: 5年前

刚开始学 Docker 的时候因为不知道 Docker 跟以前在 VirtualBox 里安的虚拟机还有 Vargrant 有啥区别,我都是习惯性的把开发环境里用的东西往单个容器里塞。后来看网上的教程还有别人分享的案例多了后,才知道把应用容器化的第一步是:要把应用用到的东西拆解放到多个容器里。慢慢地我发现不少人刚开始学 Docker 时候跟我一样都有刚接触时把 Docker 当虚拟机来用的问题,比如我特别早以前发过一篇文章《 用Docker-Compose搭建Laravel开发环境 里,我用三个分别装着 PHP MySQL Nginx 的容器搭建了一个开发环境。有读者就问了这么一个问题:

Docker 容器的 “单进程模型”
Laravel

不过那会儿我对 Docker 的掌握程度也仅限在搭建个开发环境这个级别,很多原理也不太理解所以只是告诉他每个容器里只能有单一的进程,这样更好管理、扩展之类的,希望这个大哥最后找到了正确的学习方法。不过在许多关于 Docker 的博客文章和教程里列举的最佳实践里确实都有:"每个容器只运行一个进程"这样的说法。为什么存在此规则?为什么不在单个容器中运行 Nginx PHP Go 或者更多进程?

通过最近的文章《 容器和虚拟机到底有啥区别? 》我们聊了,容器 不像虚拟机那样拥有独立的操作系统,容器 只是通过 Linux Namespaces Cgroups 实现了进程级别的隔离。虽然在容器里看不见宿主机上的其他进程,但归根结底它还只是一个运行在宿主机上的进程,所以就不具备操作系统的进程管理能力。

每个容器里只运行一个进程这个说法其实不太准确,因为像 Nginx 在启动后主进程会再开启若干个 Worker 进程负责请求的处理, Apache 更是会为每个请求创建一个进程。 容器的"单进程模型",并不是指容器里只能运行"一个"进程,而是指容器没有管理多个进程的能力。这是因为容器里的主进程( PID=1 的进程)就是应用本身,其他的进程都是这个主进程的子进程。可是,用户编写的应用,并不能够像正常操作系统里的 init 进程或者 systemd 那样拥有进程管理的功能。 比如,你的容器启动命令是执行一个 shell 脚本,脚本里依次启动容器里的 Nginx Web应用

比如是下面这个 shell 脚本

sudo su -root -c "nginx -s start && /app/go_web_bin"

那么这个容器里主进程是 sh Nginx Web 应用是子进程。可是,当这个 Nginx 进程异常退出的时候,主进程 sh 是感知不到的,也就没法对 Nginx 进行重启。 Docker 只能识别主进程的状态,如果主进程正常, Docker 的状态就是 Running 所以在容器里不推荐跑多个进程。

所以更确切的说法是每个容器应该只有一个关注点,只有一个单一的功能。将应用程序解耦到多个容器中,可以更轻松地水平缩扩和重复使用容器。例如,一个 Web 应用程序服务可能由三个单独的容器组成,每个容器都有自己的镜像,以松耦合的方式管理 Web 应用程序,数据库和 Redis 缓存。对于这些相互依赖的容器,则使用 Docker 容器网络来保持这些容器的通信。

- END -

关注公众号,获取更多精选技术原创文章

Docker 容器的 “单进程模型”


以上所述就是小编给大家介绍的《Docker 容器的 “单进程模型”》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Open Scene Graph3.0三维视景仿真技术开发详解

Open Scene Graph3.0三维视景仿真技术开发详解

国防工业出版社 / 2012-7-1 / 46.00元

OpenSceneGraph 3.0三维视景仿真技术开发详解,ISBN:9787118081411,作者:杨化斌 著 杨化斌 编一起来看看 《Open Scene Graph3.0三维视景仿真技术开发详解》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具