Docker容器內多程序管理(二)——monit
注:本文基於CentOS 6.6
背景
上一篇我們介紹了使用supervisor來管理容器內的多程序,但是我們注意到supervisor只能管理到前臺程序,對於一般的服務,沒有終端的程序supervisor無法管理。這就需要請出我們的monit了,相對於supervisor而言,monit的功能更為強大,不僅可以管理前臺、後臺程序,而且還能監控檔案系統,網路的資源。接下來我們就來走進monit。
安裝
直接使用yum方式安裝,但是要先安裝epel yum 源。
yum install -y epel-release && yum install -y monit
配置
monit安裝後,其配置檔案路徑為:/etc/monit.conf。我們剔除註釋部分,選擇最精簡的配置大概瞭解一下monit的配置。
set daemon 30 # check services at 30 seconds intervals set log syslog set pidfile /var/run/monit.pid set idfile /var/.monit.id set statefile /var/.monit.state set httpd port 2812 and use address localhost # only accept connection from localhost allow localhost # allow localhost to connect to the server and allow admin:monit # require user 'admin' with password 'monit' include /etc/monit.d/*
比較重要的是set daemon 這個值,它是配置monit輪訓的間隔時間,這裡設定為30s檢查一次程序狀態。然後設定日誌記錄,pid檔案等存放路徑。往後set httpd欄位是用於monit WEB UI的,我們暫不使用,先不介紹。最後一個也是很重要的,將我們管理的其他程序的配置檔案包含進來,和supervisor一樣,可以每個程序一個單獨的配置檔案,但是記得千萬不要重複包含monit自身的配置檔案。
docker映象打包
我們的需求還是讓sshd和crond程序能夠隨著容器啟動而拉起。
#使用CentOS 6.6官方映象 FROM centos:6.6 #安裝epel源及monit元件 RUN yum install -y epel-release && yum install -y monit #安裝ssh和cron RUN yum install -y openssh-server openssh-clients openssh cronie #暴露sshd使用的22號埠 EXPOSE 22 #設定密碼 RUN echo "root:root" | chpasswd #將配置檔案拷貝至對應目錄 COPY monit.conf /etc/monit.conf RUN chmod 600 /etc/monit.conf COPY sshd.conf /etc/monit.d/ COPY cron.conf /etc/monit.d/ #設定容器啟動時執行的命令 ENTRYPOINT ["/usr/bin/monit", "-I"]
可見,docke映象的打包也是很簡單的,不過有幾個點還是需要注意一下的,
- 拷貝monit.conf檔案時注意別拷貝到 /etc/monit.d/目錄了,不然就出現配置檔案迴圈包含了
- monit對其配置檔案/etc/monit.conf的許可權有限制,不能大於700,否則monit程序會啟動失敗。考慮其作為配置檔案,我們設定為600。
而sshd和crond程序的配置更為簡單,只要設定啟動和停止命令引數即可。
sshd程序配置:
check process sshd with pidfile /var/run/sshd.pid
start program = "/etc/init.d/sshd start"
stop program = "/etc/init.d/sshd stop"
crond程序配置:
check process crond with pidfile /var/run/crond.pid
start program = "/etc/init.d/crond start"
stop program = "/etc/init.d/crond stop"
所以說,monit監控的服務無需前臺執行,使用一般的服務檔案啟動即可。但是有一點限制就是,這個服務必須要有pid檔案,如果某個服務沒有pid檔案,那麼monit也就沒辦法操作了。
效果
使用docker build構建映象後,就可以執行起來了,使用本地8000號埠對映容器的22號埠。
docker run -d --name ccc -h ccc -p 8000:22 aeb71970de6e
執行後檢視容器狀態,以及容器內程序資訊
[[email protected] 6.6-monit]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
debd1f80a334 aeb71970de6e "/usr/bin/monit -I" 3 seconds ago Up 2 seconds 0.0.0.0:8000->22/tcp ccc
[[email protected] 6.6-monit]# docker top ccc
UID PID PPID C STIME TTY TIME CMD
root 25726 1529 0 10:22 ? 00:00:00 /usr/bin/monit -I
root 26048 25726 0 10:22 ? 00:00:00 /usr/sbin/sshd
root 26114 25726 0 10:22 ? 00:00:00 crond
此時容器內sshd和crond程序已經在位,最後我們看下遠端登入的情況,
[[email protected] 6.6-monit]# ssh [email protected] -p 8000
The authenticity of host '[192.168.3.60]:8000 ([192.168.0.6]:8000)' can't be established.
RSA key fingerprint is d1:55:de:94:1f:4e:ed:20:7c:60:**:**:**:**:**:**.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.0.6]:8000' (RSA) to the list of known hosts.
[email protected]'s password:
[[email protected] ~]# exit
logout
Connection to 192.168.0.6 closed.
遠端登入也OK,good。