Como posso executar um sistema operacional completo em um contêiner do Docker, sem especificar um comando?

25

Estou seguindo a documentação do CoreOS Docker e menciona o início de contêineres com comandos como:

docker run someImageName /bin/somebinary

Onde someImageNameestá uma imagem. Quando / bin / somebinary sair, a imagem não estará mais sendo executada.

Eu simplesmente gostaria de executar uma imagem, sem especificar binários para executar. Em vez disso, eu simplesmente quero executar os serviços (por exemplo, systemd / sysvinit) que normalmente são executados no sistema operacional das imagens .

Parece a coisa mais comum que alguém poderia querer fazer com o Docker, mas tentar executar uma imagem sem um comando retorna:

2014/02/05 14:49:19 Error: create: No command specified

Como posso iniciar um contêiner do Docker e executar um sistema operacional completo, em vez de especificar um comando ?

mikemaccana
fonte
Esta é uma duplicata desta pergunta stackoverflow.com/questions/19332662/…
Fred, o cão-maravilha mágico
@FredtheMagicWonderDog Não é bem assim, embora a resposta seja a mesma.
Mikemaccana

Respostas:

24

Conforme documentado aqui, você simplesmente executa /sbin/initcomo o comando, como qualquer outro inicializador unix, do modo de usuário único para o modo multiusuário.

/programming/19332662/start-full-container-in-docker

Os contêineres podem ser SOs completos, eles simplesmente não precisam ser (nem as VMs, é apenas mais complicado de configurar e gerenciar).

Eu diria que o objetivo principal do Docker é facilitar os contêineres de aplicativos, para que você só precise configurar um aplicativo, não todo o sistema operacional.

Fred, o Cão Maravilha Mágico
fonte
Obrigado. Depois de iniciar a imagem com / sbin / init, executei docker ps -notruncpara obter o ID do contêiner e depois sudo /usr/sbin/lxc-attach -n containerIDentrar na imagem em execução. Como o outro cartaz menciona, eu realmente não precisa de um segundo de inicialização, então eu vou verificar recipientes de comando único próxima ...
mikemaccana
Dizer que você não precisa executar um SO completo em uma VM é como dizer que não precisa executar um SO completo em uma máquina física, sim, é verdade que o kernel é basicamente apenas um x86 / C comum programa que é executado sem o stdlib e o init, mas é
Lie Ryan
11

O Docker é um sistema para gerenciamento e implantação de contêineres de aplicativos , não de contêineres do sistema operacional . Parece que você está confundindo a execução de um contêiner de docker com a inicialização de um sistema operacional.

Seus contêineres do Docker devem ser aplicativos de finalidade única e de escopo muito restrito que podem ser iniciados com um único comando. Se você está procurando algo mais complexo que isso, o Docker não é a solução que você está procurando. Nesse caso, confira KVM, ESXi, OpenVZ, LXD etc.

Se você estiver apenas procurando como especificar um padrão CMDe ENTRYPOINTseus contêineres, poderá fazê-lo no momento da construção usando um Dockerfile.

EEAA
fonte
5
Estou ciente do que é o Docker. Vou apontar que os contêineres de aplicativos são baseados em sistemas operacionais, por exemplo, Fedora ou Ubuntu. Aplicativos persistentes no Unix - até mesmo os usuários do Unix, como os contêineres do Docker - são iniciados a partir dos scripts inits ou dos arquivos da unidade systemd. Por exemplo, se meu aplicativo travar, eu gostaria que fosse reiniciado automaticamente, com um systemd semelhante ao limite fornecido.
Mikemaccana
5
Você está tentando enfiar muito em seus contêineres - eles não são um sistema operacional. A supervisão do processo deve ser realizada fora de cada recipiente.
EEAA
1
Então, se um processo morrer ... basta reiniciar todo o contêiner? Eu acho que não é tão caro, então pode ser bom. É meio que se sente estranho - meu recipiente tem um / sbin / init, mas nunca se acostuma ...
mikemaccana
1
Sim, essa é a ideia. Seu contêiner possui /sbin/init, mas não precisa . Você provavelmente usou um contêiner ubuntu padrão ou algo assim. Existem muitos bits nesses contêineres que podem ser removidos se você desejar.
EEAA
1
@ValkoSipuli Você certamente é livre para manter essa opinião. Ainda mantenho que a execução de mais de um processo dentro de um contêiner nega grande parte do motivo do uso de contêineres. Existe um local para executar um SO dentro de um contêiner? Provavelmente. Essa é uma exceção, no entanto, e não deve ser feita sem muita deliberação sobre prós / contras.
EEAA 16/02
5

Para executar um sistema operacional completo em um contêiner, crie o seguinte Dockerfile:

FROM fedora:25

CMD /sbin/init

Em seguida, crie e inicie o contêiner e insira um shell dentro dele para explorar os serviços em execução dentro dele:

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash

Serviços completos do sistema dentro do contêiner. Lindo.

Markus Hallmann
fonte
0
docker pull ubuntu

Basta executar a partir da mesma imagem quantas vezes for necessário. Novos contêineres serão criados e poderão ser iniciados e parados, cada um salvando sua própria configuração. Para sua conveniência, seria melhor atribuir um nome a cada um de seus contêineres com "--name".

Fi:

docker run --name MyContainer1 <ubuntu image>
docker run --name MyContainer2 <ubuntu image>
docker run --name MyContainer3 <ubuntu image>

É isso aí.

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

Depois disso, você cria seus contêineres para sempre e pode iniciá-los e pará-los como VMs.

docker start MyContainer1

Para entrar no contêiner e fazer o que você deseja:

docker exec -it MyContainer1 bash
DimiDak
fonte