FALE COM UM ESPECIALISTA

4004-2122

Atendimento: 9:00h às 18:00h, 2ª a 6ª

Criando Containers com SYSTEMD-NSPAWN

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 RocketDocker, 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.

Diagrama Macro de Funcionamento

Diagrama Macro de Funcionamento

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!

Pronto?

Você está Pronto?

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/
Container Criado

Container Criado

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
Registro de senha de root e contas não-privilegiadas

Registro de senha de root e contas não-privilegiadas

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
Acessar o container com a conta admin

Acessar o container com a conta admin

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:

Desligando o container

Desligando o container

# systemctl poweroff

Iniciar o container através da gerência do Systemd

Iniciar o container pelo systemd

Iniciar o container pelo 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.

Acesso via machinectl

Acesso via machinectl

# 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.

Container Virtual Ethernet

Container Virtual Ethernet

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.

Instalar Apache no Container

Instalar Apache no Container

# 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.

Visão do HTTP no Hospedeiro

Visão do HTTP no Hospedeiro

# 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 Control Group List

Systemd Control Group List

# systemd-cgls
Systemd Control Group Top

Systemd Control Group Top

# 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. 😉

Comments are closed.