zoukankan      html  css  js  c++  java
  • 如何在一个Docker中同时运行多个程序进程?

    我们都知道Docker容器的哲学是一个Docker容器只运行一个进程,但是有时候我们就是需要在一个Docker容器中运行多个进程

    那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOINT 运行一个”东西”,然后再让这个”东西”运行多个其他进程
    简单说来是用Bash Shell脚本或者三方进程守护 (Monit,Skaware S6,Supervisor),其他没讲到的三方进程守护工具同理

    Bash Shell脚本

    入口文件运行一个Bash Shell 脚本, 然后在这个脚本内去拉起多个进程
    注意最后要增加一个死循环不要让这个脚本退出,否则拉起的进程也退出了
    run.sh

    在Dockerfile的入口中运行run.sh

    用Bash Shell 的方式,任意发行版的linux都支持,缺点是不能拉起crash的进程,也就是只能拉起运行不能”守护”
    如果不关心进程crash问题那么可以用这种方式

    三方容器进程初始化之-dumb-init

    dumb-init官方
    A minimal init system for Linux containers
    一个最小化的Linux容器初始化系统
    dumb-init是一个简单的进程监控器和init系统,设计为在最小容器环境(如Docker)中作为PID 1运行。它被部署为一个用C编写的小型静态链接二进制文件。
    Dockerfile 参考

    ServiceMesh的数据平面Envoy Proxy的容器镜像就是使用的dumb-init

    三方容器进程初始化之-tini

    tini官方
    A tiny but valid init for containers
    容器的一个小而有效的init

    三方进程守护之-Monit

    Monit和Supervisor还是有很大区别的,Supervisor管理的都是前台执行的进程,Monit既可以管理前台进程也可以管理后台进程,简单的说,在CentOS中使用service xxx start 启动的程序,使用Monit可以直接管理,这就解决了很多没有前台方式启动的程序不能用Supervisor来管理的问题。
    Dockerfile 参考

    三方进程守护之-Supervisor

    大名鼎鼎的 Supervisor
    如果有多种版本的linux要用那么可以用Supervisor做统一进程守护管理,网上资料一大堆
    注意要以前台程序运行,配置文件中要有,如果是后台的方式docker会退出

    Dockerfile 参考

    三方进程守护之-Skaware S6

    Supervisor是常见的进程守护程序,不过程序文件太大,想要容器镜像尽量小,在特别是用Alpine作为基础镜像的时候推荐使用Skaware S6
    参考这个微服务基础镜像 https://github.com/nicholasjackson/microservice-basebox 他就是用 Skaware 作为进程守护程序运行多个进程的
    如果基础容器镜像是本身就是Alpine,那就再合适不过了
    Dockerfile 参考

    cron.run example

    app.run example

    三方进程守护之-s6-overlay

    s6-overlay 是基于 Skaware S6适用于容器的进程守护工具
    s6-overlay 官网 https://github.com/just-containers/s6-overlay
    Dockerfile 参考

    三方进程守护之-runit

    runit官网http://smarden.org/runit/
    具体的使用方法见官网
    在Docker生态圈, phusion/baseimage-docker, gitlab 在使用runit作为进程管理工具

    下面以要运行cron 和 ssh 为例
    /etc/service/ 为配置文件目录

    /etc/service/sshd 为要运行的程序目录
    /etc/service/sshd/run 为需要运行的程序入口脚本文件
    cat run

    /etc/service/cron 为要运行的程序目录
    /etc/service/cron/run 为需要运行的程序入口脚本文件
    cat run

    Dockerfile 参考

    三方进程守护之-Systemd

    在 docker 中使用 Systemd 需要在 docker run 的时候开启特权模式 –privileged ,所以不推荐
    这个直接放弃了
    Dockerfile 参考

    参考资料

    Alpine里的go应用,你猜他能有多小? http://blog.csdn.net/sisiy2015/article/details/50350261
    如何运行多进程Docker容器? http://dockone.io/article/951
    在Docker Container中启动定时任务 http://dockone.io/article/1070
    Docker容器内多进程管理(一)-Supervisor http://www.linuxprobe.com/docker-process-management1.html
    Docker容器内多进程管理(二)-Monit http://www.linuxprobe.com/docker-process-management2.html
    关于S6和Runit的论坛讨论 S6 or Runit, not systemd https://www.linuxquestions.org/questions/slackware-14/s6-or-runit-not-systemd-4175465428/
    [译] runit 快速入门 https://segmentfault.com/a/1190000006644578

  • 相关阅读:
    不用SMTP服务测试邮件代码[译]
    我的2007鲜有收获,充满彷徨
    AspNet上传文件的几个控件(downmoon收集)
    去掉Firefox的自动缩放记忆(downmoon)
    outlook Menu的一些资源(downmoon收集)
    log4net写入到SQL server的基本配置(downmoon)
    .net读取Windows登录用户信息(downmoon)
    微软提供对汉语拼音的强大升级支持Microsoft Visual Studio International Pack 1.0 SR1
    Access/MSSQL/Oracle/MySql获取当前用户连接数(downmoon收集)
    UML建模的要点总结(一)
  • 原文地址:https://www.cnblogs.com/sunsky303/p/11046681.html
Copyright © 2011-2022 走看看