Olá, Márcia! Tudo bem?
Vou trazer algumas explicações para ver se consigo esclarecer suas dúvidas.
Pergunta:
"Uma questão que ainda não está clara para mim: mesmo utilizando a opção 1 ou 3, é necessário instalar o cliente do Docker no container do Jenkins?"
Resposta:
Se você subir o Jenkins em um contêiner e instalar o Docker dentro do próprio container do Jenkins, não é necessário instalar o plugin do Docker. Nesse caso, você utilizaria uma imagem base do Jenkins personalizada. A configuração do arquivo docker-compose.yml
ficaria assim:
services:
jenkins:
container_name: jenkins
build:
context: .
ports:
- 8081:8080
networks:
- my_network
volumes:
- jenkins-docker-certs:/certs/client
- jenkins-home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
Perceba que, em vez de passar a imagem base do Jenkins diretamente, foi definido um contexto para que o docker-compose
utilize uma personalização com um arquivo Dockerfile
, que ficaria assim:
FROM jenkins/jenkins
USER root
RUN apt-get update -qq \
&& apt-get install -qqy apt-transport-https ca-certificates vim curl gnupg2 software-properties-common
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
RUN apt-get update -qq \
&& apt-get -y install docker-ce
RUN usermod -aG docker jenkins
WORKDIR /home
Com isso, o Docker já estará configurado dentro do container Jenkins, dispensando o uso do plugin.
Pergunta:
"O plugin (Docker plugin Versão 1.7.0) já solicita uma conexão com um Docker externo. Configurei o Docker Desktop para expor o serviço em tcp://localhost:2375
e configurei no Jenkins utilizando tcp://host.docker.internal:2375
. Recebi um sucesso após essa configuração, mas gostaria de entender melhor."
Resposta:
Mesmo que sua configuração tenha funcionado, gostaria de trazer uma explicação para você a diferença entre tcp://localhost:2375
e tcp://host.docker.internal:2375
. Essa diferença está relacionada à forma como o Docker Desktop e o Windows lidam com redes e acessos entre containers e o host.
Por que tcp://localhost:2375
não funcionou?
Contexto de rede dentro do container:
- Quando você usa
localhost
dentro de um container, ele se refere ao próprio container, e não ao host. - Como o serviço Docker não está rodando no container Jenkins,
tcp://localhost:2375
não funcionará.
Isolamento de rede:
- Containers são isolados por padrão, então é necessário apontar explicitamente para o host do Docker.
Por que tcp://host.docker.internal:2375
funcionou?
Acesso direto ao host do Docker:
host.docker.internal
é um alias DNS fornecido pelo Docker Desktop no Windows e macOS. Ele permite que containers acessem serviços rodando no host.
Solução específica do Docker Desktop:
- Essa funcionalidade foi implementada para facilitar o desenvolvimento em Windows e macOS, permitindo comunicação direta entre containers e o host.
Espero ter ajudado e bons estudos!