Blog Agility

LXC – Linux Containers

LXC – Linux Containers

O LXC, Linux Containers, é uma nova forma de “virtualização”, onde máquinas Linux, os guests, na virtualização tradicional, são executados de forma isolada e segura em um Host Linux. Os conceitos por trás do LXC não são novos. Já existem implementações como o OpenVZ e outros sistemas como o Solaris, já oferecem funcionalidades similares.

As diferenças do LXC em sistemas Linux em arquitetura x86 são a segurança, a simplicidade e a programabilidade fornecida por APIs.

Esta “virtualização” é mais leve, pois não é necessário criar uma máquina virtual completa. O Container utiliza funções do kernel como cgroups e name spaces para prover o isolamento. Como cada container consome menos recursos que uma máquina virtual, é possível rodar uma quantidade de containers bem maior do que máquinas virtuais. Alguns estudos preliminares sugerem algo como 14 vezes, ou seja, se um Host for capaz de rodar 8 máquinas virtuais tradicionais, este mesmo host poderia rodar cerca de 112 containers.

Como se pode notar, o uso de containers introduz uma densidade de sistemas virtuais por máquina física altamente escalável. Para ambientes de nuvem (cloud computing), que tem como premissa oferecer “scale out”, containers serão uma realidade muito em breve.

Por este motivo, começo a escrever uma série de artigos sobre esta tecnologia que está evoluindo rapidamente, buscando sempre apresentar como você pode utilizar a tecnologia em seus estudos ou ambiente de testes e desenvolvimento, e quem sabe até em produção.

Neste primeiro artigo sobre LXC, demonstramos como instalar e começar a utilizar containers, e para isto vou utilizar o Ubuntu Linux 14.04 LTS.

Instalando o LXC

Para instalar o LXC, execute o comando “sudo apt-get install –y lxc”.

2015_06_Jose_Valente_LXC-01
Figura 1 – Instalando o LXC

Uma vez instalado o LXC, note que uma bridge foi instalada e configurada e um endereço IP atribuído para a interface do host foi associada a esta bridge.

2015_06_Jose_Valente_LXC-02
Figura 2 – Bridge “lxcbr0”

Esta Bridge não tem nenhuma interface física (nic) associda, mas o processo de instalação também cria regras de tradução de endereços (NAT). Desta maneira os containers podem acessar o mundo externo, como a internet, por exemplo. Mas o mundo externo não consegue se conectar diretamente a estes containers. Além disso, o dnsmasq é configurado para fornecer entrega de IPs (DHCP) e resolução de nomes para os containers.

Se você quiser colocar os containers no mesmo segmento de rede que a máquina física, poderíamos criar uma nova bridge, associar uma interface física a esta bridge, e modificar os containers para utilizarem esta nova bridge. Mas isto será mostrado em outro Tech Tip.

2015_06_Jose_Valente_LXC-03
Figura 3 – Configuração da Interface lxcbr0

Agora vamos parar por um minuto para mais um pouquinho de teoria.

Usos de Containers

Os containers podem ser utilizados de duas formas. A primeira é a privilegiada, ou seja, com privilégios de root, e a segunda é a forma não privilegiada, ou seja, um usuário normal do sistema. Neste Tech Tip vamos trabalhar com a forma privilegiada. Em um próximo Tech Tip vou entrar em detalhes e mostrar como configurar um container com usuário não privilegiado.

De volta à prática, podemos agora criar nossos containers. Como você deve imaginar, o comando para criar containers LXC é o “lxc-create”. Existem duas formas de invocá-lo, de forma interativa, onde perguntas serão feitas e ao final do término dos questionamentos o container é criado, ou de forma não interativa, onde passa-se todos os parâmetros na linha de comando.

Para seguir com a forma interativa, vamos invocar o comando “sudo lxc-create –template download –name <nome_container>

2015_06_Jose_Valente_LXC-04
Figura 4 – Invocando a criação de um container de forma interativa

O sistema faz o download da lista de imagens disponíveis, e apresenta uma lista para você escolher que sistema operacional Linux deseja para o seu container.

Abaixo, a lista completa de sistemas Linux disponível no dia em que este Tech Tip foi escrito.

DIST RELEASE ARCH VARIANT BUILD

centos 6 amd64 default 20150604_02:16
centos 6 i386 default 20150604_02:16
centos 7 amd64 default 20150604_02:16
debian jessie amd64 default 20150603_22:42
debian jessie armel default 20150608_06:09
debian jessie armhf default 20150608_06:09
debian jessie i386 default 20150603_22:42
debian sid amd64 default 20150603_22:42
debian sid armel default 20150608_06:09
debian sid armhf default 20150608_06:09
debian sid i386 default 20150603_22:42
debian squeeze amd64 default 20150603_22:42
debian squeeze armel default 20150608_06:09
debian squeeze i386 default 20150603_22:42
debian wheezy amd64 default 20150603_22:42
debian wheezy armel default 20150608_06:09
debian wheezy armhf default 20150608_06:09
debian wheezy i386 default 20150603_22:42
fedora 19 amd64 default 20150524_01:27
fedora 19 armhf default 20150608_06:09
fedora 19 i386 default 20150524_01:27
fedora 20 amd64 default 20150524_01:27
fedora 20 armhf default 20150608_06:09
fedora 20 i386 default 20150524_01:27
gentoo current amd64 default 20150523_14:12
gentoo current armhf default 20150608_06:09
gentoo current i386 default 20150523_14:12
oracle 6.5 amd64 default 20150604_11:40
oracle 6.5 i386 default 20150604_11:40
plamo 5.x amd64 default 20150603_21:36
plamo 5.x i386 default 20150603_21:36
ubuntu precise amd64 default 20150604_03:49
ubuntu precise armel default 20150608_06:09
ubuntu precise armhf default 20150608_06:09
ubuntu precise i386 default 20150604_03:49
ubuntu trusty amd64 default 20150604_03:49
ubuntu trusty arm64 default 20150604_03:49
ubuntu trusty armhf default 20150608_06:09
ubuntu trusty i386 default 20150604_03:49
ubuntu trusty ppc64el default 20150605_03:49
ubuntu utopic amd64 default 20150604_03:49
ubuntu utopic arm64 default 20150605_03:49
ubuntu utopic armhf default 20150608_06:09
ubuntu utopic i386 default 20150604_03:49
ubuntu utopic ppc64el default 20150605_03:49
ubuntu vivid amd64 default 20150604_03:49
ubuntu vivid arm64 default 20150604_03:49
ubuntu vivid armhf default 20150608_06:09
ubuntu vivid i386 default 20150604_03:49
ubuntu vivid ppc64el default 20150605_03:49
ubuntu wily amd64 default 20150604_03:49
ubuntu wily arm64 default 20150604_03:49
ubuntu wily armhf default 20150608_06:09
ubuntu wily i386 default 20150604_03:49
ubuntu wily ppc64el default 20150605_03:49

Lista 1 – Lista de sistemas operacionais disponíveis para uso no container

Seguindo com processo, o sistema solicita a distribuição, Release e Arquitetura desejados. Fique atento com a escolha da arquitetura.

2015_06_Jose_Valente_LXC-05
Figura 5 – Finalizada a configuração, início da preparação do container

O sistema irá então fazer o download e criar o container para você. Ao término, uma mensagem é exibida.

2015_06_Jose_Valente_LXC-06
Figura 6 – Mensagem sobre a finalização do container e detalhes do sistema

Se você quisesse executar o comando de forma a passar todos os parâmetros, para não ter de rodar o script interativamente, o comando para criar uma máquina com a mesma distribuição, flavor de S.O. e arquitetura seria:

sudo lxc-create --template download --name <nome_do_container>   --   --dist ubuntu --release trusty --arch amd64

Observe o “–” depois do nome do Container. Isto não é um erro, é assim mesmo

2015_06_Jose_Valente_LXC-07
Figura 7 – Criação não interativa do container

Por segurança, nas imagens fornecidas não existem contas de usuários acessíveis, e o usuário ‘root’ não tem uma senha configurada. Neste caso, o serviço SSH não está disponível, teremos de instalá-lo.

Para que seja possível criar usuários, definir suas senhas, a senha do root e configurar o sudo, se desejado, deve-se utilizar o comando “lxc-attach” ou, se já estiver acostumado, executar o ‘chroot’. Para que possamos fazer isso, o container deve estar em execução, então vamos ver como iniciá-lo, mas antes, vamos listar nossos containers! 🙂

Listando os Containers

Para listar os containers, utilize o comando “sudo lxc-ls –fancy”. Utilizando o parâmetro ‘–fancy’, informações detalhadas sobre o estado do container (em execução ou parado), endereço IP, etc. são exibidos. Se omitido, somente os nomes dos containers serão exibidos.

2015_06_Jose_Valente_LXC-08
Figura 8 – Listando os containers

Iniciando os Containers

Para iniciar o container, execute o comando “sudo lxc-start –name <nome_container> –daemon”. Se omitido o parâmetro ‘–daemon’, o container é iniciado em primeiro plano e você verá a tela de login do sistema.

2015_06_Jose_Valente_LXC-09
Figura 9 – Iniciando o container

Agora o container “Teste” está em execução e tem endereço IP 10.0.3.183, que está no mesmo segmento da interface da ‘lxcbr0’.

2015_06_Jose_Valente_LXC-10
Figura 10 – Lista de containers com container iniciado

Acessando os Containers

Para acessar o container como root para iniciar a configuração, digite o comando

sudo lxc-attach –name <nome_do_container

Note que o prompt muda para “root@Teste”.

2015_06_Jose_Valente_LXC-11
Figura 11 – Acessando o container

Uma vez dentro do container, pode-se instalar pacotes usando ‘apt-get’, adicionar usuários, instalar pacotes, enfim, qualquer ação desejada no novo sistema.

Depois de criar um usuário e incluir no grupo do sudo, instalando o OpenSSH.

2015_06_Jose_Valente_LXC-12
Figura 12 – Instalação do OpenSSH no container

Desligando o Container

Como um S.O. tradicional, você pode desligá-lo utilizando o comando “shutdown”, mas se estiver no Host e precisar desligar o container, pode utilizar o comando “sudo lxc-stop –name <nome_do_container>”.

2015_06_Jose_Valente_LXC-13
Figura 13 – Desligando o container

O comando “lxc-stop” pode desligar a máquina, mas também tem outros usos interessantes, que serão abordados em outros Tech Tips.

Neste Tech Tip, foi introduzido superficialmente o conceito do LXC, Linux Containers, e como criar, iniciar e acessar os containers.

Por favor fique à vontade para comentar se este Tech Tip foi útil, agregou valor ao seu trabalho ou compartilhar ideias e sugestões para os próximos Tech Tips.

Referências

Para a escrita deste Tech Tip, as fontes a seguir foram consultadas: