Passa ai contenuti principali

Docker: usare Monit per gestire i processi

Mi rendo conto che Docker è stato progettato per gestire un solo processo per container (difatti non ha un processo di init come un sistema operativo "normale"), però io preferisco avere sempre una porta aperta per potermi collegare a un container per vedere cosa sta succedendo.
C'è un altro caso in cui ho bisogno di più di un processo: uno dei siti web che amministro si basa su un server node.js a cui Apache passa le richieste tramite mod_proxy. Per ottenere una maggiore alta affidabilità avvio due processi node.js contemporaneamente che si pongono in ascolto su due porte differenti.

Trovo che Monit sia comodo per ottenere questo risultato. L'esempio che segue mostra come costruire un'immagine che avvia Monit per gestire solo un demone SSH.

Come ho descritto in un precedente articolo, io utilizzo uno script di setup per svolgere tutte le operazioni e per mantenere il Dockerfile più piccolo possibile.

Non riporterò qui l'intero Dockerfile, ma solo le parti che sono necessarie per configurare Monit e il demone SSH. Con le istruzioni seguenti copio nel container i file di configurazione di Monit:

ADD ./monitrc /home/monitrc
ADD ./sshd.mon /home/sshd.mon

Esaminerò in dettaglio questi file più avanti.

Poi eseguo nel container lo script setup.sh. Quest'ultimo installa Monit, spostando la sua configurazione dalla directory /home alla posizione definitiva, poi installa SSHD e lo configura.

# =====
# Monit
# =====

# install Monit
yum -y -q install http://pkgs.repoforge.org/monit/monit-5.5-1.el6.rf.x86_64.rpm

# move the Monit configuration from the /home directory where the Dockerfile has copied it to the final location
mv /home/monitrc /etc/monit.conf
chmod 600 /etc/monit.conf

# ====
# SSHD
# ====

# install OpenSSH
yum -y -q install openssh-server.x86_64

# this is the directory where the pid file will go
mkdir /var/run/sshd

# create the host keys: the "-A" option is available only starting from CentOS 7
/usr/bin/ssh-keygen -A

# change the root user password
echo 'root:password' | chpasswd

# enable ssh root user login
sed -i -e 's/#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config

# disable a module that is missing from Docker official CentOS image and prevents SSH to run
sed -i -e 's/\(session \+required \+pam_loginuid.so\)/#\1/' /etc/pam.d/sshd

# move Monit's SSH configuration to the final location
mv /home/sshd.mon /etc/monit.d/

Il file sshd.mon è la parte di configurazione di Monit che riguarda la gestione del processo SSHD.

check process sshd with pidfile /var/run/sshd.pid
      start program = "/usr/sbin/sshd"
      stop program = "/usr/bin/pkill sshd"

Per fare gestire un altro servizio a Monit è sufficiente creare un altro file con l'estensione ".mon" e copiarlo nella directory /etc/monit.d.

Invece la configurazione principale di Monit è in /etc/monit.conf. L'istruzione più importante è "set init": questa istruisce Monit ad agire come il processo "init" in un sistema operativo "normale" ed evita che si sganci in background.

# number of seconds between checks
set daemon 10

# run as a foreground process
set init

# start the administration interface on port 2812 with user "admin" and password "admin"
set httpd
    port 2812
    allow admin:admin

# include the configuration files for each process to manage 
include /etc/monit.d/*.mon

Eseguire e testare il container

Il comando che avvia il containter è:

monit -l - -c /etc/monit.conf

dove "-l -" fa sì che Monit scriva il file di log sullo standard output in modo che "docker logs" possa visualizzarlo.

Per avviare il container si usa il solito:

docker run -P --rm <IMAGE_NAME>

A questo punto se si visualizza la situazione del container con "docker ps" si può vedere la porta esterna al container associata con porta di default (22) del demone SSH che gira nel container. Dovreste trovare qualcosa di simile:

0.0.0.0:49195->22/tcp

Per connettersi via SSH al container si usa il comando:

ssh -p 49195 root@localhost

e al prompt si inserisce la password di SSH impostata con lo script di setup riportato più sopra.

Si può anche controllare lo stato di Monit e dei processi che gestisce utilizzando il browser facendolo puntare all'host su cui gira il container e alla porta specificata nella configurazione monit.conf. Il browser chiederà la login/password scelta in quella configurazione.

Commenti

Post popolari in questo blog

Nuovo sito "Creare programmando" con una sezione per la didattica

Ho organizzato i miei tutorial, fatti con Scratch o altri linguaggi, in un nuovo sito che si chiama "Creare programmando" e che dovrebbe rendere più agevole lo scarico degli stessi. Questo sito contiene anche una sezione dedicata alla didattica tramite il computer in cui voglio raccogliere idee e tutorial che possono trovare applicazione nelle scuole oltre che nei CoderDojo, magari semplicemente perché forniscono degli spunti agli insegnanti sugli argomenti che si possono sviluppare (nel vero senso della parola) tramite il computer. Ho inaugurato la sezione didattica con un nuovo tutorial in Scratch dedicato alle regioni italiane. Cliccate qui per andarlo a vedere.

Un tutorial software per allenarsi all'uso dei sensori hardware

Durante l'ultima sessione di CoderDojo MXP abbiamo proposto ai ragazzi un tutorial che ha lo scopo di impratichirli nei ragionamenti che si rendono necessari quanto ci si trova a dover impostare la traiettoria di una macchinina utilizzando solo un sensore in grado di rilevare il colore della traccia visibile sul pavimento (in scala di grigi). Non avendo (ancora) a disposizione macchinine e sensori "reali" abbiamo iniziato a simulare la situazione disegnando una pista con Scratch utilizzando quattro diversi colori. Il compito dei ragazzi era di riuscire a fare in modo che lo sprite dell'automobilina seguisse la pista senza uscire di strada: le correzioni alla traiettoria avvenivano utilizzando il blocco "sta toccando il colore..." come se ci fosse un sensore in grado di vedere il colore della traccia sotto all'automobile. E se ne sono viste di tutti i colori perché il compito non era facile. Alla fine, per stimolare un po' di competizione tr

Sed: caratteri speciali che si possono usare nel lato destro delle sostituzioni

Il titolo è lungo, ma serve semplicemente per dire che nelle sostituzioni tramite la sed , ovvero quelle realizzate con il comando s/// , è possibile utilizzare alcune sequenze di escape oltre ai soliti backreference dei gruppi "catturati" con le parentesi nell'espressione regolare di sinistra. Nella parte destra dell'espressione (cioè quella dopo la seconda barra /) si possono usare: - \L per trasformare in minuscolo tutto  quello che segue (la L sta per "lowercase"); - \l (è una elle minuscola) per trasformare in minuscolo solo il carattere seguente; - \U per trasformare in maiuscolo tutto  quello che segue (la U sta per "uppercase"); - \u per traformare in maiuscolo solo il carattere seguente; - \E per marcare la fine della trasformazione dei caratteri. Gli "operatori" \L e \U agiscono fino alla fine dell'espressione (delimitata dalla barra / finale) oppure fino alla \E successiva. Quindi, per esempio, per trasformare sol