E aí, gente, tudo tranquilo?
O LXC propriamente dito não foi desenvolvido para ter múltiplos serviços/processos em cada container, o ideal é que você segmente seu ambiente em diversos containers, cada um rodando um parte isoladamente. Mas, Cristiano, eu realmente preciso ter 2, 3 serviços em um mesmo container, o que faço? Bom, se não tem jeito mesmo, você pode utilizar o supervisord para gerenciar seus processos dentro de um container, e garantir que eles iniciem juntamente com o container.
Para quem não conhece, o supervisord é um utilitário que serve para monitorar e reiniciar os serviços nele definidos quando esses serviços entram em um estado de falha. Ele é escrito em Python, é muito simples de se utilizar e possui dois comandos básicos:
- supervisord: É o deamon propriamente dito, responsável por ler o arquivo de configuração e monitorar os serviços definidos.
- supervisorctl: É um subutilitário que serve para poder reiniciar manualmente o serviço ou ainda verificar qual o status do serviço para o supervisord.
Vou mostrar como você pode utilizar o supervisord já com o container rodando, mas como você já viu neste artigo, você pode converter todos esses comandos em um Dockerfile e dar um docker build e gerar um imagem pronta ;). Vamos lá:
1 – Instalando
c45cffcd9126:~# yum install python-setuptools -y c45cffcd9126:~# easy_install pip c45cffcd9126:~# pip install supervisor
2 – Configurando
c45cffcd9126:~# echo_supervisord_conf > supervisord.conf c45cffcd9126:~# cp supervisord.conf /etc/supervisord.conf c45cffcd9126:~# vi /etc/supervisord.conf
Agora basta você adicionar o bloco de comandos referente ao(s) serviço(s) que precisamos que sejam iniciados com o container, como o ssh e o apache como, definido abaixo:
[supervisord] nodaemon=false [program:sshd] command=/usr/sbin/sshd -D [program:apache] command=/usr/sbin/httpd -DFOREGROUND -k start
Ah, claro, não se esqueça de instalar esses serviços. ?
c45cffcd9126:~# yum install openssh-server httpd -y
Agora está no fim; crie um arquivo no / com nome de run.sh com o seguinte conteúdo:
#!/bin/bash /usr/bin/supervisord -c /etc/supervisord.conf /bin/bash
Não se esqueça da permissão de execução: chmod +x /run.sh.
E está pronto o seu container, com o supervisord monitorando e mantendo no ar os serviços definidos, quer testar? Inicie o daemon: /usr/bin/supervisord -c /etc/supervisod.conf e verifique se os serviços que você definiu estão com status de running. Para isso, utilize:
c45cffcd9126:~# supervisorctl apache RUNNING pid 160, uptime 0:00:03 sshd RUNNING pid 161, uptime 0:00:03 supervisor>
O supervisorctl possuir vários recursos, veja como você pode consultar:
supervisor> ? default commands (type help <topic>): ===================================== add exit open reload restart start tail avail fg pid remove shutdown status update clear maintail quit reread signal stop version supervisor>
Por meio dele, você pode parar, iniciar, atualizar entre muitas outras opções. Agora basta você gerar um imagem desse container:
docker commit containerid nomedaimagem
Feito isso, você terá gerado a imagem do container, e agora basta iniciar um novo container baseado nessa imagem:
docker run -d -p 80:80 -p 22:22 nomedaimagem /run.sh
E, pronto, você terá iniciado dois serviços diferentes dentro do mesmo container e, o melhor, eles reiniciarão sozinhos quando entrarem em failed state. Legal, não?
Abraço!