In this Article
Os containers revolucionaram o desenvolvimento de software, pois resolveram muitos desafios que os programadores enfrentavam. Eles ajudam a entregar produtos que funcionam de forma confiável e consistente em diversos sistemas e dispositivos. O Docker, por sua vez, levou os próprios containers a um novo patamar, já que a plataforma tornou muito mais fácil e rápido construí-los, gerenciá-los e executá-los. O Docker também oferece suporte ao uso de proxies de terceiros e disponibiliza vários métodos para isso. Por que combiná-lo com IPs alternativos, qual método é melhor para o seu caso específico e o que fazer exatamente passo a passo: continue lendo o artigo para saber.
Por que usar proxies com o Docker
Garantir um acesso à internet estável, seguro e controlado é a resposta. Às vezes, para garantir o acesso de qualquer forma.
O Docker precisa de acesso à Web para executar tarefas como baixar imagens, instalar pacotes etc. No entanto, muitas redes corporativas não oferecem uma conexão normal: o tráfego de saída é controlado ou restrito. Razões de segurança são as culpadas; ainda assim, isso atrapalha o trabalho dos desenvolvedores. Proxies aprovados às vezes são a única forma de alcançar a rede e evitar mensagens como “Connection timed out” ou “Unable to access www.example.com“.
Além disso, em alguns casos, é necessária autenticação para usar a rede. O Docker por si só não oferece suporte a autenticação, então um proxy externo é o caminho a seguir.
Aplicações em tempo de execução também podem exigir uma conexão externa. Há situações em que um container precisa se conectar a APIs na nuvem, bancos de dados, serviços de terceiros etc. Se ele estiver protegido por um firewall, um proxy é necessário para alcançar os endpoints de destino.
Há também outras razões para usar proxies. Rotear o tráfego por um servidor alternativo pode resolver problemas de velocidade e ajudar no monitoramento do tráfego para registro em logs, malware, inspeção SSL e mais. Eles também ajudam a manter a consistência da rede entre diferentes tipos de servidores e máquinas, além de mascarar informações internas (endereço IP, solicitações DNS internas e NAT), proporcionando mais segurança.
Como configurar proxies no Docker
Há quatro camadas diferentes nas quais você pode configurar proxies: o Docker Daemon (ou Docker Engine, em outras palavras), o Docker Client, os containers e o nível do sistema operacional. Também há métodos diferentes para definir proxies em cada camada. Dependendo do que você escolher, isso afetará partes diferentes. Todas as opções têm suas vantagens, e você deve escolher de acordo com o seu caso de uso. Vamos discuti-las uma por uma: qual se adapta melhor a quais propósitos e o que fazer exatamente.
Camada 1: Configurar o Docker Daemon
Os proxies configurados nesse nível controlam o download e o envio de imagens e o acesso ao Docker Hub e a registries privados. Eles também são responsáveis por alcançar o Docker Swarm.
Quando escolher esta opção:
- Você precisa que todas as operações com imagens passem por um proxy;
- Comandos como docker pull ou docker push falham;
- Você precisa rotear todo o tráfego da sua máquina por um proxy corporativo;
- O acesso à rede externa só é possível com proxies;
- Com o Docker Swarm.
É estável e previsível e, se você usa o Desktop, é fácil configurar proxies com sua interface gráfica. Por outro lado, em versões mais antigas (< 17.x) e em algumas configurações raras, os ajustes podem afetar todos os containers, o que pode deixar mais lentos os containers que não usam a internet. Nas versões modernas, o proxy do Daemon não afeta os containers, pois as configurações não são herdadas automaticamente.
Há quatro maneiras de configurar o proxy do Docker Daemon.
Método 1 – Usar o daemon.json
Este método é apenas para Linux, e é o recomendado para esse SO. Você configura o comportamento do proxy neste arquivo daemon.json:
{
"proxies": {
"http-proxy": "http://proxy.example.com:3128",
"https-proxy": "https://proxy.example.com:3129",
"no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
Depois de alterar o arquivo, reinicie o Docker para que as mudanças comecem a funcionar:
sudo systemctl restart docker
Método 2 – Via arquivo drop-in do systemd
Isto também funciona apenas no Linux. Você pode executar nos modos normal e rootless.
De qualquer forma, comece criando um diretório do sistema:
sudo mkdir -p /etc/systemd/system/docker.service.d
Em seguida, crie um arquivo com o nome /etc/systemd/system/docker.service.d/http-proxy.conf que adicione as variáveis de ambiente do proxy.
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Se você usa um servidor HTTPS, mude sua variável para “HTTPS_PROXY”. Você pode definir várias variáveis. Depois, salve o arquivo e reinicie o Docker.
sudo systemctl daemon-reload
sudo systemctl restart docker
Método 3 – Usar variáveis de ambiente para o dockerd
O Docker Daemon verifica as variáveis de ambiente antes de ser executado. No entanto, esse método geralmente não é a primeira escolha.
export HTTP_PROXY=...
dockerd
Método 4 – Docker Desktop
Tecnicamente, o Docker Desktop depende de uma máquina virtual Linux leve e a utiliza para configurar o Docker. Você pode ler por aí que o Docker Desktop está disponível apenas para Windows/macOS. Tecnicamente, ele também está disponível para Linux; porém, é algo raro e opcional, e você ainda gerencia o Daemon dentro de uma VM, não em um mecanismo nativo. Portanto, esse método continua sendo preferível para Windows/macOS. Siga este caminho:
Docker Desktop > Settings > Resources > Proxies.
Camada 2: Configurar os proxies do Docker Client (CLI)
O Docker Client usa proxies para fazer solicitações. Isso se aplica às chamadas de API feitas pela CLI e a comandos como docker login, docker pull, docker push.
Quando escolher esta opção:
- Se você precisa que o cliente se autentique por meio de um proxy;
- Quando há restrições da empresa sobre o tráfego de saída;
- Quando você não precisa afetar o daemon nem os containers.
O Client é rápido e fácil de configurar, e não há necessidade de reiniciar o daemon. No entanto, esse método não funcionará se você precisar corrigir problemas de acesso no build ou na execução de containers, ou erros de push e pull do Daemon.
Normalmente, você configuraria o Docker Client usando variáveis de ambiente do shell.
Fica assim para Linux e macOS:
export HTTP_PROXY=http://PROXY:PORT
ou
export HTTPS_PROXY=http://PROXY:PORT
Use isto para Windows:
setx HTTP_PROXY http://PROXY:PORT
Observação: no Windows, quando você usa o CMD, pode haver problemas. O PowerShell funciona.
Há outra maneira, embora raramente usada: configurar por comando.
HTTP_PROXY=http://PROXY docker login
Camada 3: Proxy do container
Se você optar por esse método, as aplicações dentro dos containers usarão proxies. Você pode configurar proxies para builds ou executar containers com proxies.
Quando escolher esta opção:
- Os containers precisam de uma conexão externa;
- Os builds falham ao executar gerenciadores de pacotes;
- Apps dentro dos containers precisam rotear solicitações de API por um proxy externo.
É fácil de definir por container e serve para ambientes mistos, quando alguns containers precisam de proxies e outros não. Também oferece uma separação limpa das configurações do SO e do daemon. No entanto, você terá que configurar os proxies manualmente para cada build e execução. Essa opção também não é a melhor para implantações em grande escala e está associada a riscos de segurança, pois as credenciais do proxy podem vazar.
Método 1 – Configurar proxies por build
docker build \
--build-arg HTTP_PROXY=http://PROXY:PORT \
--build-arg HTTPS_PROXY=http://PROXY:PORT \
-t myimage .
Método 2 – Usar o Dockerfile
O ENV no Dockerfile ou as variáveis de ambiente incorporam suas configurações na imagem. Esse método traz riscos de segurança, e você não deveria usá-lo para builds.
ENV HTTP_PROXY=http://PROXY:PORT
ENV HTTPS_PROXY=http://PROXY:PORT
Método 3 – Configurar proxies por execução
docker run \
-e HTTP_PROXY=http://PROXY:PORT \
-e HTTPS_PROXY=http://PROXY:PORT \
image
Método 4 – Optar pelo Docker Compose
Esta é uma opção segura e recomendada:
environment:
HTTP_PROXY: http://PROXY:PORT
HTTPS_PROXY: http://PROXY:PORT
NO_PROXY: "localhost,127.0.0.1"
Observação: na documentação oficial do Docker, dois conceitos diferentes são chamados de CLI, e isso pode confundir você. Existe um proxy da Docker CLI que afeta o programa cliente. Existem também as flags da Docker CLI: elas injetam configurações de proxy dentro dos containers. Elas afetam os containers, não o cliente. Porém, em ambos os casos, você usa ferramentas de linha de comando.
Camada 4: Proxy do sistema operacional
Você pode configurá-lo para que todo o tráfego do seu dispositivo passe por um servidor proxy. Isso afetará tanto o Docker Daemon quanto o Docker Client; às vezes pode afetar até os containers e todos os outros apps que você usa.
Quando usar esta opção:
- A empresa exige o uso de proxies no nível do sistema;
- Há muitos apps além do Docker que também precisam de proxies.
Esse método é simples e rápido: você configura os proxies uma vez, e essas configurações funcionam para a maioria das partes e apps. No entanto, ele não é específico do Docker e torna a depuração mais difícil. Além disso, preste atenção: é realmente raro que os containers herdem essas configurações automaticamente, então você ainda pode precisar configurá-los separadamente.
Aqui você pode encontrar tutoriais passo a passo sobre a configuração de proxies em vários sistemas operacionais, incluindo macOS e Windows.
Além disso, você pode visitar a documentação oficial fornecida pelo Docker para encontrar mais detalhes sobre cada método e todas as variáveis disponíveis.
Configuração de proxy do Docker Daemon
Como configurar o Docker Client
Como ajustar as mudanças de proxy no Docker Desktop
O Docker tem proxies internos?
O Docker oferece um chamado proxy HTTP(S) interno apenas para builds de imagens, e isso confunde as pessoas, pois alguns acham que proxies externos não são necessários.
O proxy interno do BuildKit é usado apenas para builds, e ele acelera o acesso, elimina problemas de DNS e evita que configurações de DNS vazem para os builds. Porém, ele não pode ajudar a estabelecer conexões de saída seguras. Você não pode usá-lo no lugar de um proxy.
Problemas comuns de configuração e como solucioná-los
Corrigir erros relacionados a proxies no Docker pode ser complicado por causa de suas múltiplas camadas. Aqui estão cinco dos problemas mais comuns e suas correções.
Erro 1: docker pull/docker push falha
Se você percebe que o pull via proxy trava ou expira, ou que a conexão é recusada, significa que o Docker Daemon não sabe do seu proxy. Para corrigir, configure os proxies no nível do engine.
Erro 2: Não há conexão, mesmo com o Daemon funcionando
Ao mesmo tempo, o docker pull funciona, mas os containers não conseguem executar pip install e outras dependências. Erros como Temporary failure resolving podem ocorrer. Essa situação acontece com versões modernas do Docker porque o proxy do Daemon não se aplica automaticamente dentro dos containers. Para se livrar disso, aplique um proxy no nível do container no Dockerfile ou no Docker Compose.
Erro 3: A variável NO_PROXY não funciona
Se você ainda vê que o Docker tenta rotear o tráfego por proxies apesar das suas configurações, que os containers não conseguem se comunicar ou que os espelhos de registry falham, pode ser por causa de sintaxe incorreta. Tente usar entradas separadas por vírgula e não especifique protocolos ao incluir domínios.
NO_PROXY=localhost,127.0.0.1,.corp.example.com,registry.internal
Erro 4: As credenciais do proxy contêm símbolos não suportados
Nesse caso, o Docker pode falhar ao iniciar ou ao rotear o tráfego por proxies. Para resolver, você precisa codificar em URL símbolos como @, #, %, :
Vai ficar assim:
Environment=”HTTP_PROXY=http://user:Pa%%23ss@proxy:8080″
Erro 5: O Docker ignora as configurações de proxy do Desktop
Quando você define proxies usando o Desktop, mas os builds falham e os containers não conseguem estabelecer conexão, pode ser um sinal para usar outra opção de configuração. O Desktop afeta o Daemon, mas não os containers diretamente. Tente definir proxies no nível do container.
Resumindo
Docker e proxies são uma combinação poderosa que garante velocidade, segurança e uma implantação eficaz. Para aproveitar ao máximo, você precisa escolher uma configuração adequada e, claro, optar por proxies de alta qualidade obtidos legalmente. A DataImpulse está ao seu lado nisso: são 90+ milhões de proxies de origem ética ao seu dispor, além de suporte humano 24/7 para ajudar você nas tarefas de desenvolvimento. Fique à vontade para nos escrever em [email protected] ou clique no botão “Try Now” para começar conosco. Clique em “Try now” ou fale conosco em [email protected] para começar.
