Tecnologias de contêineres no Fedora: conheça o systemd-nspawn

Bem-vindo à série “tecnologias de contêineres no Fedora”. Este é o primeiro artigo de uma série de artigos que irá explicar como você pode usar as várias tecnologias de contêineres disponíveis no Fedora. Este primeiro artigo vai lidar com systemd-nspawn.

O que é um container?

Um contêiner ou recipiente é um espaço que o usuário  pode usar para executar um programa ou um sistema operacional de forma isolada a partir do sistema de hospedagem do recipiente (o chamado sistema host). A ideia é muito semelhante ao de um chroot ou uma máquina virtual. Os processos em execução em um recipiente são geridos pelo mesmo kernel que o sistema operacional hospedeiro, mas eles são isolados do sistema de arquivos host e de outros processos.

O que é systemd-nspawn?

O projeto systemd considera tecnologias de contêineres como algo que deve ser fundamentalmente parte da área de trabalho e que deve integrar com o resto dos sistemas do usuário. Para este fim, o systemd fornece o systemd-nspawn, uma ferramenta que é capaz de criar contêineres (recipientes) que utilizam várias tecnologias Linux. Ele também fornece algumas ferramentas de gestão de recipiente.

O systemd-nspawn é semelhante ao chroot de vários aspectos, mas é muito mais poderoso. Ele virtualiza o sistema de arquivos, árvore de processo e de comunicação entre processos do sistema convidado. Muito do seu apelo reside no fato de que ele fornece uma série de ferramentas, tais como machinectl, para o gerenciamento de recipientes. Containers executados por systemd-nspawn irá integrar com os componentes Systemd em execução no sistema host. Como exemplo, os lançamentos podem ser registrados a partir de um recipiente no diário do sistema host.

No Fedora 24, systemd-nspawn foi dividido a partir do pacote systemd, então você vai precisar instalar o pacote systemd-container. Como de costume, você pode fazer isso com um dnf install systemd-container.

Criando um contêiner

A criação de um contêiner com systemd-nspawn é  simples e fácil. Vamos dizer que você quer criar um contêiner para o Debian, só que você ja tentou criar em outros sistemas e não funcionou bem. Isso não é um problema, nós podemos fazer um contêiner no fedora! Para configurar um recipiente com a última versão do Debian (versão nesse momento é Jessie), você precisa escolher um diretório para configurar o sistema. Vou estar usando ~ /DebianJessie por agora.

Uma vez que o diretório foi criado, você precisa executar o debootstrap, que você pode instalar a partir dos repositórios do Fedora. Para o Debian Jessie, você execute o seguinte comando para inicializar um sistema de arquivos Debian.

$debootstrap --arch=amd64 stable ~/DebianJessie

Isso é claro que a sua arquitetura deva ser x86_64. Se não for, você deve alterar amd64 para o nome de sua arquitetura. Você pode encontrar a arquitetura de sua máquina com o comando uname -m.
Uma vez que seu diretório raiz está configurado, você vai iniciar o seu contêiner com o seguinte comando.

$systemd-nspawn -bD ~/DebianJessie

Você vai ver que a instalação e o funcionamento em questão de segundos. Você vai notar algo assim que você tentar faze login: você não pode usar quaisquer contas em seu sistema. Isso ocorre porque systemd-nspawn virtualiza usuários. A correção é simples: remove o -b do comando anterior. Você vai iniciar diretamente para o shell de root no contêner. A partir daí, você pode apenas usar passwd para definir uma senha para o root, ou você pode usar o adduser para adicionar um novo usuário. Assim que você tiver feito isso, vá em frente e coloque o parâmetro -b de volta. Você vai arrancar para o console de login e que você faça o login com as credenciais que você definir.

Tudo isto se aplica para qualquer distribuição que você deseja executar no recipiente, mas para você criar um sistema você precisa estar usando o gerenciador de pacotes correto. Para configurar um sistema mínimo no Fedora, você pode executar o seguinte comando, substituindo o caminho absoluto com onde quer que você deseja que o recipiente seja.

$ sudo dnf --releasever=24 --installroot=/absolute/path/ install systemd passwd dnf fedora-release

Configurando a rede

Você vai notar um problema se você tentar iniciar um serviço que se liga a uma porta atualmente em uso no seu sistema host. O recipiente está usando a mesma interface de rede. Felizmente, systemd-nspawn fornece várias maneiras para alcançar a rede separada da máquina host.

Rede local

O primeiro método usa o parametro –private-network, que só cria um dispositivo de auto-retorno por padrão. Isto é ideal para ambientes onde você não precisa de rede, tais como sistemas de compilação e outros sistemas de integração contínua.

Várias interfaces de rede

Se você tiver vários dispositivos de rede, você pode dar um para o recipiente com o parametro –network-interface. Para dar ENO1 ao meu recipiente, gostaria de acrescentar o parametro –network-interface = ENO1. Enquanto uma interface é atribuído a um recipiente, o hospedeiro não pode usá-lo ao mesmo tempo. Quando o recipiente é completamente desligado, ele estará disponível para o host novamente.

Compartilhando interfaces de rede

Para aqueles de nós que não têm dispositivos de rede, existem outras opções para fornecer acesso para o contêiner. Uma delas é o parametro –port. Este parametro encaminha uma porta no recipiente para o anfitrião. O formato é o protocolo: host: recipiente, onde o protocolo é TCP ou UDP, host é um número de porta válido no host, e o recipiente é uma porta válida no recipiente. Você pode omitir o protocolo e especificar apenas host: recipiente. Costumo usar algo semelhante, tipo –port = 2222: 22.

Você pode ativar o host somente em rede com o parametro –network-veth, o que cria uma interface Ethernet virtual entre o hospedeiro e o recipiente. Você também pode preencher duas conexões com –network-ponte.

Usando componentes Systemd

Se o sistema em seu recipiente tem D-Bus, você pode usar utilitários fornecidos de Systemd para controlar e monitorar o seu recipiente. O Debian não incluem dbus na base instalada. Se você quiser usá-lo com o Debian Jessie, você vai querer correr apt instalar dbus.

Machinectl

Para gerenciar facilmente recipientes, systemd fornece o utilitário machinectl. Usando machinectl, você pode efetuar login em um recipiente com nome de login machinectl, verificar o estado com o nome de estado machinectl, reinicie com o nome machinectl reinicialização, ou desligá-lo com o nome machinectl poweroff.

Deixem suas sugestões nos comentários a baixo.

Saiba Mais