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:
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.
Il file sshd.mon è la parte di configurazione di Monit che riguarda la gestione del processo 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.
Eseguire e testare il container
Il comando che avvia il containter è:
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:
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:
Per connettersi via SSH al container si usa il comando:
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.
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
Posta un commento