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

Laravel

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

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

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

比如是下面这个shell脚本

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

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

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

- END -

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

Docker容器的单进程模型相关推荐

  1. 用Docker容器自带的tensorflow serving部署模型对外服务

    相信很多人和我一样,在试图安装tensorflow serving的时候,翻遍了网上的博客和官网文档,安装都是以失败而告终,我也是一样,这个问题折磨了我两个星期之久,都快放弃了.幸运的是在同事的建议下 ...

  2. 用Docker容器自带的tensorflow serving部署模型对外服务(成功率100%)

    前传: 相信很多人和我一样,在试图安装tensorflow serving的时候,翻遍了网上的博客和官网文档,安装都是以失败而告终,我也是一样,这个问题折磨了我两个星期之久,都快放弃了.幸运的是在同事 ...

  3. 机器学习开发的灵药:Docker容器

    来源:机器之心 本文约4300字,建议阅读10分钟 转向容器化机器学习开发是应对众多挑战的一种途径. 大多数人都喜欢在笔记本电脑上做原型开发.当想与人协作时,通常会将代码推送到 GitHub 并邀请协 ...

  4. k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)

    在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster  Cluster 是计算.存储和网络资源的集合,Kubernetes 利用 ...

  5. Docker 容器的网络连接

    2019独角兽企业重金招聘Python工程师标准>>> 文章首发于公众号<程序员果果> 地址:https://mp.weixin.qq.com/s/DzF-ZwaY4Qt ...

  6. Docker容器的原理与实践(上)

    本文来自网易云社区. 虚拟化 是一种资源管理技术,将计算机的各种资源予以抽象.转换后呈现出来, 打破实体结构间的不可切割的障碍,使用户可以比原本更好的方式来应用这些资源. Hypervisor 一种运 ...

  7. 《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——2.2 容器式Linux系统的Docker配置...

    本节书摘来自异步社区<Docker容器:利用Kubernetes.Flannel.Cockpit和Atomic构建和部署>一书中的第2章,第2.2节,作者: [美]Christopher ...

  8. docker容器学习笔记

    docker是通过内核虚拟化技术来提供容器的资源隔离与安全保障. docker组成: docker client.docker server.docker组件(镜像(image).容器(contain ...

  9. docker容器 cpu memory 资源限制

    目录 背景 cgroup简介 内存限制 内存限制相关的参数 用户内存限制 Memory reservation OOM killer 核心内存 Swappiness CPU 限制 概述 CPU 限制相 ...

最新文章

  1. 过滤所有用户的行车轨迹查找在某一区域内的用户
  2. muduo之EPollPoller
  3. ReactOS 架构
  4. 自己实现spring核心功能 一
  5. boost::iterators::minimum_category用法的测试程序
  6. DNN、CNN、RNN、LSTM的区别
  7. .NET-记一次架构优化实战与方案-前端优化
  8. android 更改edittext内容,Android如何实时更改edittext的内容
  9. Android之IPC机制
  10. 未定义函数或变量_变量提升:JavaScript是顺序执行,为什么变量在定义之前执行不会报错而是报Underfined...
  11. 2019.5.25 Noip模拟测试2 T1题解
  12. centos7查看当前系统时间、_CentOS 7修改系统时间及硬件时间
  13. JAVA王思聪吃热狗程序_王思聪吃热狗小游戏, 程序员开发路上
  14. PDF解密去水印工具
  15. 雷电模拟器Android obb,exagear模拟器数据obb包
  16. 学生信息管理系统(Java+JSP+MySQL)
  17. Python 一个好用到爆炸的IP端口扫描工具类
  18. STM8L051之通过ADC1与DMA读取内部参考电压,求取VDD电源电压---库函数版
  19. gym102028 problem E Resistors in Parallel (大数)
  20. 深圳地铁回应女高管猝死:工作人员不能贸然救助

热门文章

  1. OPPO R17引领渐变色手机潮流,15步技术处理工艺出众
  2. CSS cursor 和 opacity 属性
  3. 《Adobe Flash Professional CC经典教程》——1.15 复习
  4. Mysql ERROR 2002 (HY000) Can't connect to local MySQL server through socket
  5. MVVM架构~knockoutjs系列之验证信息自定义输出~续
  6. Windows services相关命令
  7. 优秀博客 --敏感词汇过滤
  8. Stooge排序与Bogo排序算法
  9. 使用C#实现Form窗体的淡入淡出效果
  10. Windows中命令提示符被禁用的解决方法