Estou executando o Jenkins dentro de um contêiner do Docker. Será que o contêiner Jenkins também é um host do Docker? O que estou pensando é iniciar um novo contêiner do docker para cada compilação de teste de integração do Jenkins (para iniciar bancos de dados, intermediários de mensagens etc.). Os contêineres devem, portanto, ser desligados após a conclusão dos testes de integração. Existe uma razão para evitar a execução de contêineres de docker de dentro de outro contêiner de dockers dessa maneira?
jenkins
docker
docker-dind
Johan
fonte
fonte
Respostas:
A execução do Docker no Docker (também conhecido como dind ), embora possível, deve ser evitada, se possível. (Fonte fornecida abaixo.) Em vez disso, você deseja configurar uma maneira de o seu contêiner principal produzir e se comunicar com os contêineres irmãos .
Jérôme Petazzoni - o autor do recurso que possibilitou a execução do Docker dentro de um contêiner do Docker - na verdade escreveu uma postagem no blog dizendo para não fazê-lo . O caso de uso que ele descreve corresponde ao caso de uso exato do OP de um contêiner do CI Docker que precisa executar tarefas em outros contêineres do Docker.
Petazzoni lista duas razões pelas quais o dind é problemático:
A partir dessa postagem do blog, ele descreve a seguinte alternativa,
fonte
sudo
fazer isso? Graçasdocker
grupo:sudo usermod -aG docker $USER
. Você precisará registrar novamente depois disso./var/run/docker.sock
quando você executa o docker for mac na sua máquina macos./var/run/docker.sock
Eu respondi uma pergunta semelhante antes sobre como executar um contêiner do Docker dentro do Docker .
Portanto, a execução do Docker no Docker foi considerada por muitos como um bom tipo de solução para esse tipo de problema. Agora, a tendência é usar contêineres "irmãos". Veja a resposta de @predmijat nesta página para mais informações.
fonte
Não há problema em executar o Docker-in-Docker (DinD) e, de fato, o Docker (a empresa) tem uma imagem oficial do DinD para isso.
A ressalva, no entanto, é que ele requer um contêiner privilegiado, que, dependendo das suas necessidades de segurança, pode não ser uma alternativa viável.
A solução alternativa de executar o Docker usando contêineres irmãos (também conhecido como Docker-out-Docker ou DooD) não requer um contêiner privilegiado, mas possui algumas desvantagens decorrentes do fato de você estar iniciando o contêiner dentro de um contexto diferente daquele em que está sendo executado (ou seja, você inicia o contêiner de dentro de um contêiner, mas está sendo executado no nível do host, não dentro do contêiner).
Eu escrevi um blog descrevendo os prós / contras de DinD vs DooD aqui .
Dito isso, a Nestybox (uma startup que acabei de fundar) está trabalhando em uma solução que executa o Docker-in-Docker verdadeiro de forma segura (sem usar contêineres privilegiados). Você pode conferir em www.nestybox.com .
fonte
Sim, podemos executar a janela de encaixe na janela de encaixe, precisamos anexar o sockeet unix "/var/run/docker.sock" no qual o daemon do docker escuta por padrão como volume a janela de encaixe pai usando "-v / var / run /docker.sock:/var/run/docker.sock ". Às vezes, podem surgir problemas de permissão para o soquete do daemon do docker, no qual você pode escrever "sudo chmod 757 /var/run/docker.sock".
E também seria necessário executar a janela de encaixe no modo privilegiado, para que os comandos fossem:
sudo chmod 757 /var/run/docker.sock
docker run --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...
fonte