O que são Containers?
Containers são tecnologias que permitem empacotar e isolar aplicativos com todo o seu ambiente de tempo de execução, incluindo todos os arquivos necessários para executar aplicativos. É possível obter um grande nível de portabilidade através do uso de containers.
A tecnologia de container é útil para realizar o confinamento de aplicações ou de um sistema operacional inteiro, de forma que o mesmo não tenha um contato direto com o sistema que o abriga.
A motivação para uso de um container varia, e normalmente esta técnica é adotada para aumento de segurança, maior controle de alterações, divisão do trabalho entre equipes, realização de testes em ambiente controlado, e etc.
Hummm. Parece complicado… Mas não é!
Existem outros tipos de container?
Existem diversas tecnologias no mercado, como Rocket, Docker, LXC e Systemd-Nspawn. Ainda existem outros, mas estes são os mais comuns.
O Systemd-Nspawn
Neste post falaremos sobre Systemd-Nspawn, que é uma tecnologia embutida nas distribuições Linux que possuem Systemd.
A diferença fundamental entre o systemd-nspawn e outras tecnologias de container, é que o systemd-nspawn possui a capacidade de executar múltiplos aplicativos dentro de um único container, onde nas demais tecnologias costuma-se executar apenas um aplicativo.
Caso você tenha em seu parque um SO que já conte com o Systemd para gerenciamento de boot e serviços (Como o CentOS 7 ou RedHat 7), então está apto a seguir sem a necessidade de instalar pacotes adicionais.
Chega de falar. Mão na massa!
No exemplo a seguir, usei um CentOS 7.3 Minimal, com todos os pacotes atualizados.
Criando um Container
Caso esteja utilizando uma instalação mínima do CentOS 7/RedHat 7, serão necessários instalar 2 pacotes para gerenciamento da rede, pois estes não fazem parte da instalação mínima:
# yum install systemd-resolved.x86_64 systemd-networkd.x86_64 # systemctl enable systemd-networkd.service # systemctl enable systemd-resolved.service # systemctl start systemd-networkd.service # systemctl start systemd-resolved.service
Atenção: Caso você não tenha experiência com SELinux, deixe o mesmo em modo permissive antes de seguir com a criação e configuração do container (eu avisei).
# setenforce 0
Agora basta seguir com a criação do container.
# yum -y --releasever=7 --nogpg --installroot=/var/lib/machines/cos7container install systemd passwd yum centos-release vim-minimal systemd-sysv systemd-units systemd-resolved iputils # cat /var/lib/machines/cos7container/etc/centos-release # ls -lZ /var/lib/machines/cos7container/
Dica: Caso esteja usando RedHat 7.3, você precisará substituir os seguintes parâmetros:
- releasever=7.3
- redhat-release
Realizar a primeira inicialização para criar as contas de usuário essenciais:
# systemd-nspawn -D /var/lib/machines/cos7container # passwd (definir a senha de root do container) # useradd admin (adicionar uma conta não privilegiada) # passwd admin (definir a senha da conta admin do container) # exit
OBS: Não precisa ser necessariamente uma conta chamada “admin”. Precisa ser apenas uma conta não-privilegiada.
Iniciar o container manualmente para testar as contas criadas
# systemd-nspawn -D /var/lib/machines/cos7container -b
Utilize a conta “admin” para acesso. O acesso direto como “root” não funciona. Após conseguir o acesso, escale para a conta “root”, e desligue o container:
# systemctl poweroff
Iniciar o container através da gerência do Systemd
# systemctl start systemd-nspawn@cos7container.service # systemctl status systemd-nspawn@cos7container.service
Também é possível utilizar o comando “machinectl” para obter informações e também acessar o container. Aquele mesmo, utilizado para gerenciamento de máquinas virtuais.
# machinectl -a # machinectl login cos7container
Rede do Container
Quando um container systemd-nspawn é criado, uma Virtual Ethernet (VE) é associada ao mesmo. É possível obvervar tal interface no SO Hospedeiro (fora do container). Por padrão, esta VE não possui IP associado.
Para que o container tenha acesso a rede, será necessário associar um IP a sua respectiva VE. Exemplo:
# ip addr add 10.0.0.1/24 dev host0 # ip link set dev host0 up
OBS: O IP do default gateway será “herdado” do hospedeiro.
Uma outra alternativa, é fazer com que o container utilize a rede do hospedeiro. Para isso, é necessário fazer um “override” da configuração padrão dos containers. Caso esta alternativa seja utilizada, uma VE não será criada.
# systemctl edit systemd-nspawn@cos7container.service
Insira o seguinte código na tela que irá aparecer, para criar o arquivo de override:
[Service] ExecStart= ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --machine=%I
Atenção: O container precisará ser reiniciado para que o override seja aplicado.
# systemctl stop systemd-nspawn@cos7container.service # systemctl start systemd-nspawn@cos7container.service
Após logar no container, experimente instalar um pacote, como o Apache por exemplo.
# yum install httpd.x86_64 # systemctl enable httpd.service # systemctl start httpd.service
Saia do terminal do container e retorne ao hospedeiro para verificar os serviços em execução.
Dica: Para sair do terminal, pressionar 3X: control + ç ou control + ]
Após sair do container, estando no SO base, rode um comando “ss” ou “netstat” para observar o serviço httpd ativo.
# ss -ta # netstat -tnlp
É possível customizar e dedicar interfaces virtuais ou VLANs para um container. Consulte o manual do systemd-nspawn para mais informações.
Ativar o boot automático do container, para que seja iniciado com o SO
# systemctl enable systemd-nspawn@cos7container.service
Encerrar o container através do SO
# machinectl terminate cos7container Ou # systemctl stop systemd-nspawn@cos7container.service
Comandos úteis para o monitoramento dos control groups
# systemd-cgls
# systemd-cgtop
Parabéns! Você criou o seu primeiro container!
Caso queira aprender mais sobre o systemd-nspawn, visite a Wiki do projeto.
Agora vá estudar SELinux Enforcement para aumentar ainda mais a segurança de seus containers. 😉