Eai 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.
O supervisord para quem não conhece é 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 e é muito simples de se utilizar, ele possuí 2 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 nesse post, 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 por exemplo 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 esquece 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 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>
Através 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, 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 2 serviços diferentes dentro do mesmo container, e o melhor, eles reiniciarão sozinhos quando entrarem em failed state, legal não?
Espero ter ajudado, e já sabe, tendo dúvida entre em contato conosco ou deixe sua dúvida no fórum que o pessoal pode te ajudar :), quer nos ajudar? Divulgue o mundodocker.com.br e vamos conversando.
Abraço!
: