1. 程式人生 > >Docker容器內多程序管理(二)——monit

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映象的打包也是很簡單的,不過有幾個點還是需要注意一下的,

  1. 拷貝monit.conf檔案時注意別拷貝到 /etc/monit.d/目錄了,不然就出現配置檔案迴圈包含了
  2. 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。