Contêineres com LXC – parte 2

lvm-2_lighttpd

Continuando com o uso do LXC. Na primeira tratei mais de demonstrar as diferenças entre ele e seu “quase irmão”, o Docker, ao mesmo tempo que pincelava sobre o o básico da operação dos contêineres.

Agora um pouco mais sobre a a operação da ferramenta.

O que já foi visto

Na primeira parte foram apresentados os seguintes comandos

Comando Descrição
lxc-checkconfig Verifica se os parâmetros do kernel estão compatíveis com o LXC.
lxc-create Cria um novo contêiner a partir de um modelo (template) específico.
lxc-start Inicia a execução de um contêiner.
lxc-stop Encerra a execução um contêiner.
lxc-freeze Pausa a execução de um contêiner.
lxc-info Exibe informações sobre um contêiner.
lxc-console Conecta-se, via console, a um contêiner em execução.
lxc-attach Executa um processo dentro de um contêiner — sem ser informado um nome do processo será aberto um shell.

Destes o único que foi apenas citado foi o lxc-freeze, então irei incluí-lo nos exemplos a seguir.

Informações sobre os contêineres

Precisando saber quais são os contêineres disponíveis basta usar:

# lxc-ls
debian-01  gentoo-01

Mas se preferir um pouco mais de informação, use:

# lxc-ls --fancy
NAME       STATE    IPV4        IPV6  GROUPS  AUTOSTART  
-------------------------------------------------------
debian-01  RUNNING  10.0.3.171  -     -       YES        
gentoo-01  STOPPED  -           -     -       NO         

A parte “boa” é que exibe, quando em execução, os endereços IPv4 e IPv6 em uso pelo contêiner podem ser visualizado. Na coluna “GROUPS” ficam os grupos aos quais aquele contêiner faz parte e a coluna “AUTOSTART” indica quais são os contêineres que serão executados automaticamente durante o boot. Isto é feito acrescentando no arquivo de configuração do contêiner as seguintes linhas:

# grep start /var/lib/lxc/debian-01/config 
lxc.start.auto = 1
lxc.start.delay = 5

Durante a inicialização o comando lxc-autostart se encarrega de verificar quais contêineres estão configurados assim e os inicia automaticamente.

O lxc-top exibe uma visão geral do uso dos recursos por cada contêiner:

Container               CPU      CPU      CPU      BlkIO        Mem#
Name                   Used      Sys     User      Total       Used
debian-01              0.34     0.22     0.11   15.45 MB   33.66 MB
gentoo-01              0.31     0.27     0.14    8.00 KB  964.00 KB
TOTAL 2 of 2           0.65     0.49     0.25   15.46 MB   34.60 MB

Terminando esta parte o lxc-monitor, a função dele é a de monitorar as mudanças de status de um, vários ou todos os contêineres:

# lxc-monitor
'debian-01' changed state to [FREEZING]
'debian-01' changed state to [FROZEN]
'gentoo-01' changed state to [STARTING]
'gentoo-01' changed state to [RUNNING]
'gentoo-01' exited with status [0]
'gentoo-01' changed state to [STOPPING]
'gentoo-01' changed state to [STOPPED]
'debian-01' changed state to [THAWED]

Foram usados, na ordem, os seguintes comandos:

# lxc-freeze -n debian-01 
# lxc-start -n gentoo-01 
# lxc-stop -n gentoo-01 
# lxc-unfreeze -n debian-01

Sim, lxc-freeze e lxc-unfreeze servem para, respectivamente,  suspender (congelar) e retornar (descongelar) a execução de um contêiner.

Criação de (mais) contêineres

Apenas relembrando que o comando lxc-create cria um novo contêiner a partir de modelo pré-definido:

# lxc-create -t ubuntu -n ubuntu-01
Checking cache download in /var/cache/lxc/vivid/rootfs-
amd64 ... 
Installing packages in template: ssh,vim,language-pack-
en,language-pack-pt
Downloading ubuntu vivid minimal
...
##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the
# container.
##

Aparentemente o modelo que instala o contêiner do Ubuntu acha interessante nos privar do “prazer” de criar o primeiro usuário. Nos modelos disponíveis há um bem interessante chamado “download” que acrescenta mais algumas opções e variações:

# lxc-create -t download -n ...
Setting up the GPG keyring
Downloading the image index
---
DIST    RELEASE ARCH    VARIANT BUILD
---
centos  6       amd64   default 20151206_02:16
centos  6       i386    default 20151206_02:16
centos  7       amd64   default 20151206_02:16
debian  jessie  amd64   default 20151205_22:42
debian  jessie  armel   default 20151205_22:42
debian  jessie  armhf   default 20151205_22:42
debian  jessie  i386    default 20151205_22:42
...
ubuntu  wily    ppc64el default 20151206_03:49
ubuntu  xenial  amd64   default 20151206_03:49
ubuntu  xenial  armhf   default 20151206_03:49
ubuntu  xenial  i386    default 20151206_03:49

Daí é escolher a distribuição, versão e arquitetura desejada.

Instantâneos

Assim como nos hipervisores é possível tirar um instantâneo (ou snapshot) da máquina virtual, o inconveniente é que o contêiner não esteja em execução:

# lxc-stop -n debian-01
# lxc-snapshot -n debian-01 
lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3209 Snapshot of directory-backed container requested.
lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3210 Making a copy-clone.  If you do want snapshots, then
lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3211 please create an aufs or overlayfs clone first, snapshot that
lxc-snapshot: lxccontainer.c: do_lxcapi_snapshot: 3212 and keep the original container pristine.

Desejando saber quais são os instantâneos de um determinado contêiner use:

# lxc-snapshot -n debian-01 --list
snap0 (/var/lib/lxc/debian-01/snaps) 2015:12:06 19:04:12

Com o instantâneo criado vou instalar o nginx:

giovanni@debian-01:~$ sudo apt-get install nginx
Construindo árvore de dependências       
Lendo informação de estado... Pronto
...
Configurando nginx (1.6.2-5) ...
A processar 'triggers' para libc-bin (2.19-18+deb8u1) ...
A processar 'triggers' para systemd (215-17+deb8u2) ...

Pronto, o nginx está rodando:

LXC-2_nginx

Só para depois voltar o instantâneo:

# lxc-stop -n debian-01
# lxc-snapshot -n debian-01 --list
snap0 (/var/lib/lxc/debian-01/snaps) 2015:12:06 19:04:12
# lxc-snapshot -n debian-01 --restore=snap0
# lxc-snapshot -n debian-01 --destroy=snap0
# lxc-snapshot -n debian-01 --list
No snapshots
# lxc-start -n debian-01

Aproveitei para também para apagar o instantâneo  já que não precisarei mais dele. Agora não há mais nginx no contêiner:

LXC-2_no_httpd

Ou seja, este exemplo é idêntico ao que se pode fazer em um hipervisor e não teria sido muito diferente se eu o fizesse, por exemplo, no KVM ou VirtualBox. Mas há uma outra maneira.

Contêiner efêmero

Uma alternativa interessante ao exemplo acima é usar o contêiner efêmero, isto é, um contêiner que deixará de existir ao término da execução. Seguindo a mesma lógica, digamos que eu precise testar a instalação do lighttpd naquele contêiner com Gentoo:

# lxc-start-ephemeral -o gentoo-01 -n gentoo-efem
setting rootfs to .%s. /var/lib/lxc/gentoo-efem/rootfs
Connected to tty 1
...
This is gentoo-efem. (Linux x86_64 3.19.0-37-generic) 19:58:51

gentoo-efem login: giovanni
Password: 
Last login: Sat Dec  5 11:27:46 BRST 2015 from 10.0.3.1 on pts/5
giovanni@gentoo-efem ~ $ sudo emerge lighttpd
 * IMPORTANT: 15 news items need reading for repository 'gentoo'.
 * Use eselect news read to view new items.
Calculating dependencies... done!
>>> Verifying ebuild manifests
>>> Emerging (1 of 1) www-servers/lighttpd-1.4.35-r1::gentoo
...

Como é no Gentoo, lá vamos nós… 🙂

Enquanto o programa é compilado, uma informação importante sobre os contêineres que existem agora:

# lxc-ls --fancy
NAME         STATE    IPV4        IPV6  GROUPS  AUTOSTART  
---------------------------------------------------------
debian-01    RUNNING  10.0.3.171  -     -       YES        
gentoo-01    STOPPED  -           -     -       NO         
gentoo-efem  RUNNING  10.0.3.23   -     -       NO         
ubuntu-01    STOPPED  -           -     -       NO 

O programa compilou normalmente, o serviço subiu, fiz os testes que precisava, encerrei a sessão e pressionei  «Ctrl»+«A» e  «Q» para sair  do console:

giovanni@gentoo-efem ~ $ exit

This is gentoo-efem. (Linux x86_64 3.19.0-37-generic) 20:11:16
gentoo-efem login: # _

E então verificar o que aconteceu com o contêiner efêmero:

# lxc-ls --fancy
NAME       STATE    IPV4        IPV6  GROUPS  AUTOSTART  
-------------------------------------------------------
debian-01  RUNNING  10.0.3.171  -     -       YES        
gentoo-01  STOPPED  -           -     -       NO         
ubuntu-01  STOPPED  -           -     -       NO

Deixou de existir, tal qual como acontece nos contêineres do Docker quando eles são terminados. Mas é claro que o Docker não apaga o contêiner quando encerrado, ele apenas o “esconde” e você pode reusá-lo se desejar.

Se quiser que o contêiner efêmero não seja totalmente destruído, basta acrescentar o parâmetro “–keep-data” na linha de execução do lxc-start-ephemeral.

Clonando contêineres

Havendo necessidade é possível clonar um contêiner já existente utilizado o lxc-clonenão esqueça de desligar o contêiner antes! — com:

# lxc-clone debian-01 debian-02
Created container debian-02 as copy of debian-01

Pronto, dois contêineres idênticos rodando:

# lxc-ls --fancy
NAME       STATE    IPV4        IPV6  GROUPS  AUTOSTART  
-------------------------------------------------------
debian-01  RUNNING  10.0.3.171  -     -       YES        
debian-02  RUNNING  10.0.3.172  -     -       YES        
gentoo-01  STOPPED  -           -     -       NO
ubuntu-01  STOPPED  -           -     -       NO

Repare que o contêiner “debian-02” herdou também a execução automática.

Destruindo contêineres

Usando o lxc-destroy você remove um contêiner:

# lxc-destroy -n debian-02

Se o contêiner estiver em execução acrescente o parâmetro “-f” para forçar sua destruição mas repare não nenhum tipo de pergunta extra sobre ter certeza da da ação, portanto CUIDADO!

Fim da segunda parte

E aqui é  fim da segunda parte, com mais alguns comandos do LXC apresentados e menos citações ao Docker desta vez. Na terceira parte, ao qual ainda não decidir se será última ou penúltima, será a vez de fazer ajustes e configurações nos contêineres e, claro, explicar a história do contêiner não privilegiado que foi citado na primeira parte..

Anúncios

3 comentários sobre “Contêineres com LXC – parte 2

  1. Pingback: Contêineres com LXC – parte 2 - Peguei do

  2. Pingback: Contêineres com LXC – parte 3 | giovannireisnunes

  3. Pingback: Contêineres com LXC – parte 4 | giovannireisnunes

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s