É possível iniciar o contêiner LXC dentro do contêiner LXC?

21

É possível iniciar o contêiner LXC dentro de outro contêiner LXC?

Mikhail
fonte
1
Você realmente tem um motivo real para fazer isso? Lembre-se de que as perguntas aqui devem ser sobre problemas reais que você enfrenta .
precisa
6
Eu acho que o lxc deve ser capaz de simplificar a migração da VM (e backup + recuperação também). Mas não tenho certeza dos casos, quando não há acesso ao sistema operacional host (vps baratos, por exemplo).
Mikhail

Respostas:

45

Vou dissipar alguns mitos aqui.

Esta é apenas uma má ideia. Eu sinto Muito. - Jacob 5 de março às 20:30

Não vejo como isso é uma má ideia. É realmente apenas um chroot dentro de um chroot. Por um lado, isso pode diminuir o desempenho de alguma maneira desprezível (nada comparado à execução de uma VM dentro de uma VM). Por outro lado, é provável que seja mais seguro (por exemplo, mais isolado do sistema host raiz e de seus constituintes).

Você realmente tem um motivo real para fazer isso? Lembre-se de que as perguntas aqui devem ser sobre problemas reais que você enfrenta. - Zoredache 5/03 às 21:52

Concordo 100% com o seguinte comentário do pôster. Além disso, acho seguro presumir que todos que postam uma pergunta aqui provavelmente pensam que têm um motivo real para fazê-lo.

Eu acho que o lxc deve ser capaz de simplificar a migração da VM (e backup + recuperação também). Mas não tenho certeza dos casos, quando não há acesso ao sistema operacional host (vps baratos, por exemplo). - Mikhail 6/03 às 11:17

Na verdade, deparei com essa pergunta em junho, quando mergulhei no LXC para projetos PaaS / IaaS, e estava particularmente interessado na capacidade de permitir que os usuários emulassem ambientes de nuvem para fins de desenvolvimento.

LXCeption. Nós somos muito profundos. - Tom O'Connor 6/03 às 22:46

Eu ri um pouco quando li este, mas não é esse o caso :)

Enfim, acabei configurando um ambiente VirtualBox com uma instalação de estoque do Ubuntu 12.04 LTS Server Edition depois de ler tudo isso, pensando que isso era 100% possível. Após instalar o LXC, criei um novo contêiner e instalei o LXC dentro do contêiner com o apt-get. A maior parte da instalação progrediu bem, mas resultou em erro devido a um problema com o pacote cgroup-lite, cuja tarefa inicial não pôde ser iniciada após a instalação do pacote.

Depois de um pouco de pesquisa, me deparei com este excelente artigo em stgraber.org (os brindes estão escondidos na seção "Aninhamento de contêineres"):

sudo apt-get install lxc
sudo lxc-create -t ubuntu -n my-host-container -t ubuntu
sudo wget https://www.stgraber.org/download/lxc-with-nesting -O /etc/apparmor.d/lxc/lxc-with-nesting
sudo /etc/init.d/apparmor reload
sudo sed -i "s/#lxc.aa_profile = unconfined/lxc.aa_profile = lxc-container-with-nesting/" /var/lib/lxc/my-host-container/config
sudo lxc-start -n my-host-container
(in my-host-container) sudo apt-get install lxc
(in my-host-container) sudo stop lxc
(in my-host-container) sudo sed -i "s/10.0.3/10.0.4/g" /etc/default/lxc
(in my-host-container) sudo start lxc
(in my-host-container) sudo lxc-create -n my-sub-container -t ubuntu
(in my-host-container) sudo lxc-start -n my-sub-container

Instalar essa política do AppArmor e reiniciar o daemon fez o truque (no entanto, não se esqueça de alterar os intervalos de rede!). Na verdade, eu pensei que esse snippet em particular era tão importante que eu o espelhei @ http://pastebin.com/JDFp6cTB para o caso de o artigo ficar offline.

Depois disso, sudo /etc/init.d/cgroup-lite startconseguiu e foi bom velejar.

Então, sim, é possível iniciar um contêiner LXC dentro de outro contêiner LXC :)

Adam Eberlin
fonte
1
Essa configuração praticamente desativa a proteção do AppArmor (executando o contêiner sem limites). O AppArmor é "destinado a proteger o host contra uso indevido acidental de privilégios dentro do contêiner". Essa configuração está praticamente abrindo o host lxc a ser explorado pelo seu contêiner lxc aninhado. O host LXC aninhado também pode não oferecer proteção aos seus contêineres. Em geral, desabilitar essa proteção não é recomendado.
Reece45
existe uma abordagem segura viável para executar o lxc dentro do lxc?
Mascarpone
10
Caso de uso do mundo real: tenho um contêiner LXC executando o jenkins e quero que o jenkins possa executar contêineres do LXCs antes de executar testes de integração. Alternativas: execute jenkins fora do LXC ou crie contêineres LXC no host via ssh (feio).
Giovanni Toraldo
13

Com o Ubuntu 14.04 (confiável), você pode simplesmente adicionar o seguinte na configuração do contêiner pai:

lxc.mount.auto = cgroup
lxc.aa_profile = lxc-container-default-with-nesting

referência: https://help.ubuntu.com/lts/serverguide/lxc.html#lxc-basic-usage (procure por "aninhamento)

Certifique-se de ter uma rede pré-configurada antes da inicialização para evitar uma longa pausa antes que a tela de login apareça!

HTH

Lester Cheung
fonte
1
Funciona perfeitamente - obrigado! Para usuários como eu, que talvez ainda não tenham uma configuração de contêiner pai na qual colocar as linhas acima, adicionar um arquivo ~/.config/lxc/default.confna conta do usuário que cria o contêiner e adicionar essas duas linhas funciona perfeitamente.
Brandon Rhodes
Em 2017! Recentemente eu tenho que estivador configuração dentro lxc de um aplicativo "empresa-y" - funciona bem, mas não pergunte ...
Lester Cheung
1

Além disso ... você sabia que agora pode instalar TODO o Openstack em um único contêiner LXC. Cada um dos "serviços" do Openstack (nova, swift etc.) são todos instalados em contêineres lxc "aninhados" dentro do contêiner "mestre / pai".

Demora um pouco para instalar tudo, mas, quando terminar, você tem um bom ambiente de teste do OpenStack em seu laptop ou desktop para experimentar.

Se você deseja interromper o OpenStack, basta lxc-stop o contêiner principal / pai mesmo para reiniciar o Openstack.

consulte: Instruções do Openstack Single Installer

bmullan
fonte
1

Sim, você pode criar contêineres LXC aninhados e, apesar do primeiro comentário, há momentos e casos de uso em que os contêineres aninhados são certamente úteis. Consulte o blog LXC de 10 partes de Stephane Graber, mas em particular a seção Aninhamento de contêineres -

Série de 10 partes de Stephane Graber no LXC

casos de uso: suponha que você queira um ambiente LXC multilocatário. Crie 1 contêiner mestre para cada pessoa ou organização, certificando-se de ativar o aninhamento adicionando os 2 cmds ao arquivo de configuração do contêiner LXC. Em seguida, em cada contêiner Mestre, crie seus subconjuntos aninhados, onde você instala os aplicativos, áreas de trabalho, etc, que cada grupo exige. Observe que, enquanto a rede padrão para os contêineres mestre será 10.0.3.x, os contêineres aninhados serão 10.0.4.x por padrão (você pode alterar se necessário).

Qual é a maior vantagem que tive usando o Nested LXC? Se você parar o lxc do contêiner Master e cloná-lo no lxc .. você clonará não apenas o mestre, mas todos os sub-contêineres ... isso é útil para backups rápidos. Essa abordagem também é útil se você desejar fazer a migração ao vivo do LXC com CRIU. Quando você migra um dos contêineres Mestre para outra Máquina ... você está realmente migrando ele e todos os contêineres aninhados.

Por fim, para um exemplo interessante de aninhamento de LXC, use Stephane Graber e outros construíram um simulador para "A Internet" usando LXC, BPG e OSPF, tudo em um contêiner LXC. Dentro desse 1 contêiner LXC "mestre ou pai" LXC, existem 512 contêineres LXC aninhados, cada um executando o Quagga para roteamento BGP / OSPF. Juntos, esses 512 "nós" da Internet simulam a Internet. Essa implementação foi usada na conferência de segurança NSEC de 2014 para todos os participantes experimentarem a segurança na Internet.

A fonte para isso está no Githug em: 2014 NSEC LXC simulator for The Internet github code

bmullan
fonte