O que o Docker adiciona ao lxc-tools (as ferramentas LXC do espaço do usuário)?

398

Se você der uma olhada nos recursos do Docker, a maioria deles já é fornecida pelo LXC.

Então, o que o Docker adiciona? Por que eu usaria o Docker sobre o LXC comum?

Flimm
fonte

Respostas:

550

Nas Perguntas frequentes do Docker :

O Docker não substitui o lxc. "lxc" refere-se aos recursos do kernel do linux (especificamente espaços para nome e grupos de controle) que permitem processos de sandboxing uns dos outros e controlam suas alocações de recursos.

Além dessa base de baixo nível dos recursos do kernel, o Docker oferece uma ferramenta de alto nível com várias funcionalidades poderosas:

  • Implantação portátil em máquinas.O Docker define um formato para agrupar um aplicativo e todas as suas dependências em um único objeto que pode ser transferido para qualquer máquina habilitada para o docker e executado lá com a garantia de que o ambiente de execução exposto ao aplicativo será o mesmo. O Lxc implementa o processo de sandbox, que é um pré-requisito importante para a implantação portátil, mas isso por si só não é suficiente para a implantação portátil. Se você me enviasse uma cópia do seu aplicativo instalado em uma configuração lxc personalizada, ele certamente não seria executado na minha máquina da mesma forma que na sua, porque está vinculado à configuração específica da sua máquina: rede, armazenamento, registro, distribuição, etc. O Docker define uma abstração para essas configurações específicas da máquina, para que o mesmo contêiner do docker possa ser executado - inalterado - em muitas máquinas diferentes,

  • Centrado no aplicativo. O Docker é otimizado para a implantação de aplicativos , ao contrário de máquinas. Isso se reflete em sua API, interface do usuário, filosofia de design e documentação. Por outro lado, os scripts auxiliares do lxc focam nos contêineres como máquinas leves - basicamente servidores que inicializam mais rapidamente e precisam de menos memória ram. Achamos que há mais contêineres do que apenas isso.

  • Construção automática . O Docker inclui uma ferramenta para que os desenvolvedores montem automaticamente um contêiner a partir de seu código-fonte, com controle total sobre as dependências de aplicativos, ferramentas de construção, empacotamento etc. Eles são livres para usar make, maven, chef, fantoche, salt, pacotes debian, rpms, source tarballs ou qualquer combinação dos itens acima, independentemente da configuração das máquinas .

  • Versionamento. O Docker inclui recursos semelhantes ao git para rastrear versões sucessivas de um contêiner, inspecionando a diferença entre versões, enviando novas versões, revertendo etc. O histórico também inclui como um contêiner foi montado e por quem, para que você tenha total rastreabilidade no servidor de produção todo o caminho de volta ao desenvolvedor upstream. O Docker também implementa uploads e downloads incrementais, semelhantes ao "git pull", para que novas versões de um contêiner possam ser transferidas apenas enviando diffs.

  • Reutilização de componentes. Qualquer contêiner pode ser usado como uma "imagem base" para criar componentes mais especializados. Isso pode ser feito manualmente ou como parte de uma construção automatizada. Por exemplo, você pode preparar o ambiente python ideal e usá-lo como base para 10 aplicativos diferentes. Sua configuração ideal do postgresql pode ser reutilizada para todos os seus projetos futuros. E assim por diante.

  • Partilha. O Docker tem acesso a um registro público ( https://registry.hub.docker.com/ ), onde milhares de pessoas fizeram upload de contêineres úteis: qualquer coisa, desde redis, couchdb, postgres a bouncers irc, trilhos para servidores de aplicativos, trilhos de servidores de aplicativos e hadoop para basear imagens para várias distribuições. O registro também inclui uma "biblioteca padrão" oficial de contêineres úteis mantidos pela equipe do docker. O registro em si é de código aberto, para que qualquer pessoa possa implantar seu próprio registro para armazenar e transferir contêineres particulares, por exemplo, para implantações internas de servidores.

  • Ecossistema de ferramentas. O Docker define uma API para automatizar e personalizar a criação e implantação de contêineres. Há um grande número de ferramentas integradas ao docker para ampliar seus recursos. Implantação do tipo PaaS (Dokku, Deis, Flynn), orquestração de vários nós (maestro, sal, mesos, openstack nova), painéis de gerenciamento (docker-ui, horizonte de open -ack, estaleiro), gerenciamento de configuração (chef, fantoche), integração contínua (jenkins, strider, travis) etc. O Docker está se estabelecendo rapidamente como o padrão para ferramentas baseadas em contêineres.

Eu espero que isso ajude!

Solomon Hykes
fonte
3
Quando você diz: "qualquer contêiner pode ser usado como imagem de base", presumo que você queira dizer um contêiner do Docker, não um contêiner LXC criado independentemente do Docker. Pelo que sei, não se pode criar um contêiner do Docker do zero, ele deve sempre herdar de outro contêiner do Docker (questão relacionada: stackoverflow.com/questions/18274088/… ).
Flimm
18
Você pode criar facilmente um novo contêiner a partir de qualquer tarball com "docker import". Por exemplo: "debootstrap raring ./rootfs; tar -C ./rootfs -c. | Docker import flimm / mybase".
Solomon Hykes
3
isso ainda é verdade agora que o Docker possui o libcontainer (que não é um substituto)?
Garet Claborn
3
@GaretClaborn sim, como o libcontainer é apenas sua própria biblioteca para acessar namespaces e cgroups, tudo o que Salomão disse ainda se aplica.
John Morales
10
Um contêiner Linux é o resultado de restringir e isolar um processo usando um conjunto de recursos do Linux: chroot, cgroups e namespaces. O LXC é uma ferramenta de espaço do usuário que manipula essas instalações. O libcontainer é uma alternativa ao LXC que manipula essas mesmas instalações. O Docker usa o libcontainer por padrão, mas pode usar o LXC. Dito isto, o Docker é (muito) mais do que uma camada de compatibilidade sobre o libcontainer / LXC; ele adiciona recursos adicionais listados pelas outras respostas.
User100464
71

Vamos dar uma olhada na lista de recursos técnicos do Docker e verificar quais são fornecidos pelo LXC e quais não.

Recursos:

1) Isolamento do sistema de arquivos : cada contêiner de processo é executado em um sistema de arquivos raiz completamente separado.

Fornecido com LXC comum.

2) Isolamento de recursos : recursos do sistema como CPU e memória podem ser alocados de maneira diferente para cada contêiner de processo, usando cgroups.

Fornecido com LXC comum.

3) Isolamento de rede : cada contêiner de processo é executado em seu próprio namespace de rede, com uma interface virtual e um endereço IP próprio.

Fornecido com LXC comum.

4) Cópia na gravação : os sistemas de arquivos raiz são criados usando a cópia na gravação, o que torna a implantação extremamente rápida, barata na memória e no disco.

Isso é fornecido pelo AUFS, um sistema de arquivos de união do qual o Docker depende. Você pode configurar o AUFS manualmente manualmente com o LXC, mas o Docker o usa como padrão.

5) Log : os fluxos padrão (stdout / stderr / stdin) de cada contêiner de processo são coletados e registrados para recuperação em tempo real ou em lote.

O Docker fornece isso.

6) Gerenciamento de alterações: as alterações no sistema de arquivos de um contêiner podem ser confirmadas em uma nova imagem e reutilizadas para criar mais contêineres. Nenhum modelo ou configuração manual necessária.

"Configuração de modelo ou manual" é uma referência ao LXC, onde você precisaria aprender sobre essas duas coisas. O Docker permite tratar contêineres da maneira que você está acostumado a tratar máquinas virtuais, sem aprender sobre a configuração do LXC.

7) Shell interativo : o docker pode alocar um pseudo-tty e anexar à entrada padrão de qualquer contêiner, por exemplo, para executar um shell interativo descartável.

O LXC já fornece isso.


Apenas comecei a aprender sobre o LXC e o Docker, por isso gostaria de receber quaisquer correções ou respostas melhores.

Flimm
fonte
35
IMHO, esta resposta erra o ponto. O Docker não "fornece" esses recursos; apenas os torna trivialmente fáceis de usar. Se quisermos ser meticulosos, podemos dizer que o LXC não fornece isolamento: os namespaces o fornecem e o LXC é apenas uma ferramenta de userland de commodity para torná-los mais fáceis de usar do que com a unshareferramenta básica (ou diretamente o clone()syscall). Da mesma forma, o Docker torna essas coisas mais fáceis de usar (e traz muitos outros recursos para a mesa, como a capacidade de empurrar / puxar imagens). Meu 2c.
jpetazzo
6
@jpetazzo: LXC é realmente muito fácil, como o Docker facilita (além de adicionar outros recursos, como empurrar e puxar imagens)?
Flimm
31
@Flimm: eu gosto da comparação na edição 16 da Revista Admin , p. 34: O Docker agrupa o LXC em conjunto com algumas outras tecnologias de suporte e o agrupa em uma interface de linha de comando fácil de usar. Usando recipientes é um pouco como tentar usar Git com comandos apenas como update-indexe read-tree, sem ferramentas familiares como add, commit, e merge. O Docker fornece essa camada de "porcelana" sobre o "encanamento" do LXC, permitindo que você trabalhe com conceitos de nível superior e se preocupe menos com os detalhes de nível inferior.
0xC0000022L 09/09
4
Executei os benchmarks do UnixBench dentro de um contêiner docker e um contêiner LXC, executando o mesmo sistema operacional, e o LXC se destacou em pontuação. Sendo docker baseado em LXC, estou muito intrigado com meus resultados.
Gextra # 25/13
7
Parece-me que o desempenho mais lento do Docker estava relacionado à E / S do disco, portanto, talvez causado pela adoção do AUFS.
gextra
16

O post e as respostas acima estão rapidamente ficando obsoletos, à medida que o desenvolvimento do LXD continua aprimorando o LXC . Sim, eu sei que Docker também não ficou parado.

O LXD agora implementa um repositório para imagens de contêineres LXC, das quais um usuário pode enviar / enviar por push para contribuir ou reutilizar.

A API REST do LXD para LXC agora permite a criação / implantação / gerenciamento local e remoto de contêineres LXC usando uma sintaxe de comando muito simples.

Os principais recursos do LXD são:

  • Seguro por design (contêineres sem privilégios, restrições de recursos e muito mais)
  • Escalável (de contêineres no seu laptop a milhares de nós de computação)
  • Intuitivo (API simples e clara e experiência de linha de comando nítida)
  • Baseado em imagem (não há mais modelos de distribuição, apenas imagens boas e confiáveis) Migração ao vivo

Agora existe o plugin NCLXD para o OpenStack, permitindo que o OpenStack utilize o LXD para implantar / gerenciar contêineres LXC como VMs no OpenStack em vez de usar KVM, vmware etc.

No entanto, o NCLXD também permite uma nuvem híbrida de uma mistura de VMs tradicionais de HW e VMs LXC.

O plug-in OpenStack nclxd, uma lista de recursos suportados, inclui:

stop/start/reboot/terminate container
Attach/detach network interface
Create container snapshot
Rescue/unrescue instance container
Pause/unpause/suspend/resume container
OVS/bridge networking
instance migration
firewall support

Quando o Ubuntu 16.04 for lançado em abril de 2016, haverá recursos interessantes adicionais, como suporte a dispositivos de bloco e suporte a migração ao vivo .

bmullan
fonte
4

As janelas de encaixe usam imagens criadas em camadas. Isso adiciona muito em termos de portabilidade, compartilhamento, controle de versão e outros recursos. Essas imagens são muito fáceis de portar ou transferir e, como estão em camadas, as alterações nas versões subseqüentes são adicionadas em forma de camadas sobre as camadas anteriores. Portanto, ao portar várias vezes, você não precisa portar as camadas de base. Os estivadores têm contêineres que executam essas imagens com o ambiente de execução contido; eles adicionam alterações como novas camadas, proporcionando fácil controle de versão.

Além disso, o Docker Hub é um bom registro com milhares de imagens públicas, onde você pode encontrar imagens com SO e outros softwares instalados. Assim, você pode obter um bom avanço para sua aplicação.

div
fonte
Quando você diz "construído em camadas" - o que significa - (A) Uma cópia das camadas base, adaptada e comprometida com uma camada "NOVO". Então, a camada base é desconectada da próxima? (B) A (s) camada (s) base (s) está (s) incluída (s) na camada "NEW" (Nova) e também está vinculada. Portanto, as alterações na camada base são refletidas automaticamente na camada "NEW". Desculpe, se o esclarecimento solicitado é muito ingênuo. :( Kapil
Kapil
As imagens do Docker são construídas em camadas. Para colocar em termos granulares, todas as alterações até um ponto em que uma camada é confirmada estão presentes nas camadas de imagem feitas até esse ponto. Quaisquer alterações feitas depois disso são adicionadas às camadas seguintes e acima. Portanto, a nova camada está vinculada à camada base. Eu não acho que a mesma nova camada possa ser adicionada a uma camada base diferente com alterações adicionais. No entanto, se várias entidades desejam manter a consistência e têm as mesmas camadas base, somente as novas camadas precisam ser fornecidas a essas entidades para atingir o mesmo estado.
div
No entanto, não estou atualizado sobre os desenvolvimentos atuais no docker e pode haver alterações na implementação da imagem do docker que não são abordadas no comentário acima.
div
Para ser mais específico, as camadas são identificadas por uma assinatura (SHA-algo, acredito), o que significa que se você alterar uma camada, é uma camada diferente. @ Kapil: Isso significa que, embora seu comportamento esteja um pouco mais próximo da sua opção (B), na verdade você não pode fazer alterações em uma camada base. (ou qualquer camada, por sinal) Uma imagem é criada a partir de uma lista de camadas, cada uma aplicada em ordem; as camadas podem ser limpas (e acho que são automaticamente limpas pelo próprio docker) quando não forem mais necessárias; ou seja, quando todas as imagens de referência foram excluídas.
Codificadormonkeyfuel
@ Kapil: Sinceramente, sua pergunta provavelmente funcionaria melhor como uma nova pergunta, e não como um comentário sobre ela, uma vez que é útil que as pessoas possam procurar por si mesmas. Se você quiser fazer uma nova pergunta, eu também responderei lá.
Codificadormonkeyfuel
0

Para manter esse nível, isso já foi solicitado e respondido acima .

No entanto, eu daria um passo para trás e responderia de maneira um pouco diferente, o próprio mecanismo de encaixe adiciona a orquestração como um de seus extras e essa é a parte disruptiva. Quando você começa a executar um aplicativo como uma combinação de contêineres executando 'em algum lugar' em vários mecanismos de contêineres, fica realmente emocionante. Robustez, Escala Horizontal, abstração completa do hardware subjacente, eu poderia continuar ...

Não é apenas o Docker que fornece isso; de fato, o padrão de orquestração de contêiner de fato é o Kubernetes, que vem em vários sabores, o Docker, mas também o OpenShift, SuSe, Azure, AWS ...

Então, abaixo do K8S, existem motores de contêineres alternativos; os interessantes são o Docker e o CRIO - recentemente construídos, sem daemon, destinados como um mecanismo de contêiner especificamente para o Kubernetes, mas imaturos. É a competição entre esses que eu acho que será a verdadeira escolha a longo prazo para um mecanismo de contêiner.

Will Rothwell
fonte