如何在一個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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM