Não é possível baixar imagens do Docker atrás de um proxy

330

Instalei o Docker no meu Ubuntu 13.10 (Saucy Salamander) e quando digito no meu console:

sudo docker pull busybox

Estou tendo o erro a seguir:

Pulling repository busybox
2014/04/16 09:37:07 Get https://index.docker.io/v1/repositories/busybox/images: dial tcp: lookup index.docker.io on 127.0.1.1:53: no answer from server

Versão do Docker:

$ sudo docker version

Client version: 0.10.0
Client API version: 1.10
Go version (client): go1.2.1
Git commit (client): dc9c28f
Server version: 0.10.0
Server API version: 1.10
Git commit (server): dc9c28f
Go version (server): go1.2.1
Last stable version: 0.10.0

Estou atrás de um servidor proxy sem autenticação, e este é o meu /etc/apt/apt.confarquivo:

Acquire::http::proxy "http://192.168.1.1:3128/";
Acquire::https::proxy "https://192.168.1.1:3128/";
Acquire::ftp::proxy "ftp://192.168.1.1:3128/";
Acquire::socks::proxy "socks://192.168.1.1:3128/";

O que estou fazendo de errado?

rpayanm
fonte
6
Para usuários do Windows e boot2docker, consulte stackoverflow.com/a/29303930/6309
VonC
1
Um detalhe menor: o apt não suporta proxies do SOCKS. Acquire::socks::proxysignifica definir o proxy para todos os URLs que começam com um socksesquema. Como o seu sources.listnão possui socks://URLs, essa linha é totalmente ignorada.
Hans-Christoph Steiner
Que tal docker-compose?
Mohammad Masoumi

Respostas:

797

Aqui está um link para a documentação oficial do Docker para proxy HTTP: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Um resumo rápido:

Primeiro, crie um diretório drop-in systemd para o serviço Docker:

mkdir /etc/systemd/system/docker.service.d

Agora crie um arquivo chamado /etc/systemd/system/docker.service.d/http-proxy.confque adicione a HTTP_PROXYvariável de ambiente:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"

Se você possui registros internos do Docker que precisam entrar em contato sem fazer proxy, é possível especificá-los por NO_PROXYmeio da variável de ambiente:

Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com"

Alterações de liberação:

$ sudo systemctl daemon-reload

Verifique se a configuração foi carregada:

$ sudo systemctl show --property Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/

Reinicie o Docker:

$ sudo systemctl restart docker
Alexandre Mélard
fonte
3
Isso funciona para o Debian Jessie executando o Docker 1.6.2. De alguma forma, a edição /etc/default/dockernão funciona. Talvez eu deva remover exportcomo o documentado para Centos.
Neurite
2
Para SysV mais antigo, edite o arquivo / etc / sysconfig / docker como em docs.oracle.com/cd/E37670_01/E37355/html/… - Oracle Linux 6.7
SidJ
2
NB: Presumi que o 'daemon-reload' seria suficiente para aplicar alterações ao docker, mas na verdade sudo systemctl restart dockeré estritamente necessário para que ele funcione.
Jose Alban
4
Para o ubuntu 14.04, consulte a resposta do @ n3o: Como systemctl não está disponível para o ubuntu 14.04, ele é usado upstartpara ativar os serviços.
Chinmay
4
Agora está retornando "Autenticação de proxy necessária" ... como configurar nome de usuário e senha?
Pinei
88

Suas configurações de proxy do APT não estão relacionadas ao Docker.

O Docker usa a variável de ambiente HTTP_PROXY, se presente. Por exemplo:

sudo HTTP_PROXY=http://192.168.1.1:3128/ docker pull busybox

Mas, em vez disso, sugiro que você dê uma olhada no seu /etc/default/dockerarquivo de configuração: você deve ter uma linha para descomentar (e talvez ajustar) para que suas configurações de proxy sejam aplicadas automaticamente. Em seguida, reinicie o servidor Docker:

service docker restart
mbarthelemy
fonte
8
No meu caso, o arquivo / etc / default / docker continha um exemplo em minúsculas (http_proxy), mas para que as coisas funcionassem, tive que adicionar a configuração em maiúsculas (HTTP_PROXY).
Mekk
você não deve definir o HTTP_PROXY para o cliente janela de encaixe
thomas.han
3
Não funciona com o docker 1.9.1; veja a resposta abaixo
Peter Dotchev
1
Isso funciona para o Ubuntu 14.04 ao instalar o docker a partir do apt.dockerproject.org.
Michael Kopp
1
Isso não funciona no Debian 8.8, e você precisa configurar o http_proxy em /etc/systemd/system/docker.service.d como mostrado na resposta aceita.
Roman Mik
60

No CentOS, o arquivo de configuração do Docker está em:

/etc/sysconfig/docker

Adicionar a linha abaixo me ajudou a fazer com que o daemon do Docker funcionasse atrás de um servidor proxy:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="http://<proxy_host>:<proxy_port>"
Arun Y
fonte
7
exportar HTTP_PROXY = "http: // <nome de usuário>: <password> @ <proxy_host>: <proxy_port>" para aqueles atrás de proxies corporativos
Nicolas Mommaerts
para mim isso funcionou apenas sem o export. Tem certeza de que isso está correto?
31515
4
Para mim, exportsó funciona no CentOS6 e / ou no CentOS7
#
1
No Centos7 eu também tive que não usar exportação
Banjocat
2
export HTTP_PROXY=...é um Bashism, para shells não Bash (como o que / bin / sh pode ser), use duas linhas HTTP_PROXY=...e, em seguida export HTTP_PROXY , dito isso, eu não precisava disso export.
Cameron Kerr #
42

Se você estiver usando o novo Docker para Mac (ou Docker para Windows ), clique com o botão direito do mouse no ícone da bandeja do Docker e selecione Preferências (Windows: Configurações), vá para Avançado e, em Proxies, especifique suas configurações de proxy. Clique em Aplicar e reiniciar e aguarde até o Docker reiniciar.

Pedro Madrid
fonte
Caso alguém use um proxy vinculado localmente (por exemplo, 127.0.0.1:8787 ) no macOS como eu, aqui está o guia de configuração mais detalhado: Por que um proxy vinculado localmente não funciona
Rockallite
Eu configurei meus proxies via windows: settings, mas esses proxies não estão se propagando para meus contêineres stackoverflow.com/questions/48272933/…
amique
Para mim, eu só precisava colocar no meu servidor DNS e funcionou então. Obrigado.
richin
32

No Ubuntu, você precisa definir o http_proxy para o daemon do Docker, não o processo do cliente. Isso é feito em /etc/default/docker(veja aqui ).

gkephorus
fonte
diz que não tenho permissão para acessar seu grupo. No link
Azizbro 7/10/19
Eu não acho que isso funcione para o Ubuntu 18.04 e superior.
zslim
27

Para estender a resposta de Arun , para que isso funcionasse no CentOS 7, tive que remover os comandos "export". Então edite

/etc/sysconfig/docker

E adicione:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="https://<proxy_host>:<proxy_port>"
http_proxy="${HTTP_PROXY}"
https_proxy="${HTTPS_PROXY}"

Em seguida, reinicie o Docker:

sudo service docker restart

A fonte é esta postagem do blog .

zummed
fonte
2
Somente HTTP_PROXY é necessário (testado no Fedora 20).
sheldonh
Perfeito para Suse 12!
Dean Meehan
14

Por que um proxy vinculado localmente não funciona

O problema

Se você estiver executando um proxy vinculado localmente , por exemplo, ouvindo 127.0.0.1:8989, ele NÃO FUNCIONA no Docker for Mac . Na documentação do Docker :

Quero conectar-me de um contêiner a um serviço no host

O Mac tem um endereço IP alterado (ou nenhum, se você não tiver acesso à rede). Nossa recomendação atual é anexar um IP não utilizado à lo0interface no Mac; por exemplo:, sudo ifconfig lo0 alias 10.200.10.1/24e verifique se o seu serviço está escutando neste endereço ou 0.0.0.0( ou seja, não 127.0.0.1). Em seguida, os contêineres podem se conectar a esse endereço.

O mesmo vale para o servidor Docker. (Para entender o lado do servidor e o cliente do Docker, tente executar docker version.) E o lado do servidor é executado em uma camada de virtualização própria localhost. Portanto, ele não se conectará ao servidor proxy no localhostsistema operacional host.

A solução

Portanto, se você estiver usando um proxy vinculado localmente como eu, basicamente precisará fazer o seguinte para fazê-lo funcionar com o Docker para Mac:

  1. Faça seu servidor proxy escutar em 0.0.0.0vez de 127.0.0.1. Cuidado: você precisará de uma configuração de firewall adequada para impedir o acesso malicioso a ela.

  2. Adicione um alias de loopback à lo0interface, por exemplo 10.200.10.1/24:

    sudo ifconfig lo0 alias 10.200.10.1/24
    
  3. Definir HTTP e / ou HTTPS proxy para 10.200.10.1:8989de Preferências no menu da bandeja Docker (assumir que o servidor proxy está escutando na porta 8989).

Depois disso, teste as configurações de proxy executando um comando em um novo contêiner a partir de uma imagem que não é baixada:

$ docker rmi -f hello-world
  ...

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world

c04b14da8d14: Pull complete 
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
  ...

Aviso: o alias de loopback definido porifconfignão preserva após uma reinicialização. Tornar persistente é outro tópico. Verifique esta postagem do blog em japonês (o Google Translate pode ajudar).

Rockallite
fonte
Obrigado por isso, tenho tentado encontrar uma solução para o último ano ou mais com o SquidMan no Mac ao tentar acessar a rede comercial e externa através do proxy da empresa. Eu consegui isso, ligando-o ao launchd para ser configurado na inicialização. developer.apple.com/library/content/documentation/MacOSX/…
Proctor
Obrigado cara. Finalmente encontrei sua postagem! Funciona. Se você estiver usando o cntlm, não se esqueça de adicionar a ligação 0.0.0.0 à sua configuração. ex .: Listen 0.0.0.0: 8989
Felix
Estou usando cntlm também, e alterá-lo para o modo de porta de entrada
Lee Gary
10

Esta é a correção que funcionou para mim: Ubuntu, Docker versão: 1.6.2

No arquivo /etc/default/docker, adicione a linha:

export http_proxy='http://<host>:<port>'

Reinicie o Docker

sudo service docker restart
n3o
fonte
Trabalhando no Docker v1.12.1 no Ubuntu 14.04 e Mint 17.3
wmarbut
1
Works for 14.04.4 + Docker versão 17.03.1-ce, build c6d412e
okwap
8

Para configurar o Docker para funcionar com um proxy, você precisa adicionar a variável de ambiente HTTPS_PROXY / HTTP_PROXY ao arquivo sysconfig do Docker (/etc/sysconfig/docker ).

Dependendo se você usa init.dou a ferramenta de serviços, você precisa adicionar a instrução "export" (devido aos logs do relatório Debian Bug - # 767441. Exemplos em / etc / default / docker são enganosos quanto à sintaxe suportada ):

HTTPS_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"
HTTP_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"
export HTTP_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"
export HTTPS_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"

O repositório do Docker (Docker Hub) suporta apenas HTTPS. Para que o Docker trabalhe com proxies de interceptação SSL, você deve adicionar o certificado raiz do proxy ao armazenamento confiável dos sistemas.

Para o CentOS, copie o arquivo para /etc/pki/ca-trust/source/anchors/ e atualize o armazenamento confiável da CA e reinicie o serviço Docker.

Se o seu proxy usar autenticação NTLMv2 - você precisará usar proxies intermediários como Cntlm para fazer a ponte da autenticação. Esta postagem do blog explica isso em detalhes .

Marcel Friedmann
fonte
5

Na nova versão do Docker, docker-engine , em uma distribuição baseada em systemd , você deve adicionar a linha de variável de ambiente a /lib/systemd/system/docker.service , conforme mencionado por outros:

Environment="HTTP_PROXY=http://hostname_or_ip:port/"
Mehdi Hamidi
fonte
Isso foi necessário no RHEL7.
precisa saber é o seguinte
adicione a linha à seção [Serviço]
volkit
5

Depois de instalar o Docker, faça o seguinte:

[mdesales@pppdc9prd1vq ~]$ sudo HTTP_PROXY=http://proxy02.ie.xyz.net:80 ./docker -d &
[2] 20880

Em seguida, você pode puxar ou fazer qualquer coisa:

mdesales@pppdc9prd1vq ~]$ sudo docker pull base
2014/04/11 00:46:02 POST /v1.10/images/create?fromImage=base&tag=
[/var/lib/docker|aa088847] +job pull(base, )
Pulling repository base
b750fe79269d: Download complete
27cf78414709: Download complete
[/var/lib/docker|aa088847] -job pull(base, ) = OK (0)
Marcello de Sales
fonte
3

Como ainda não estou autorizado a comentar:

Para o CentOS 7, eu precisava ativar o EnvironmentFile no "docker.service", conforme descrito aqui: Controlar e configurar o Docker com systemd .

Edit: Estou adicionando minha solução, conforme declarado por Nilesh. Eu precisava abrir "/etc/systemd/system/docker.service" e precisei adicionar na seção

[Serviço]

EnvironmentFile = - / etc / sysconfig / docker

Somente então o arquivo "etc / sysconfig / docker" foi carregado no meu sistema.

Maximilian Wollnik
fonte
3

Para resolver o problema de curvatura na construção do Docker, adicionei o seguinte dentro do arquivo Docker:

ENV http_proxy=http://infoprx2:8080
ENV https_proxy=http://infoprx2:8080
RUN apt-get update && apt-get install -y curl vim

Observe que a instrução ENV é ANTES da instrução EXECUTAR.

E para tornar o daemon do Docker capaz de acessar a Internet (eu uso o Kitematic com o boot2docker), adicionei o seguinte em /var/lib/boot2docker/profile:

export HTTP_PROXY=http://infoprx2:8080
export HTTPS_PROXY=http://infoprx2:8080

Em seguida, reiniciei o Docker com sudo /etc/init.d/docker restart.

Bruno Negrão Zica
fonte
3

Se estiver usando o proxy socks5, aqui está o meu teste com o Docker 17.03.1-ce com a configuração "all_proxy" e funcionou:

# Set up socks5 proxy server
ssh sshUser@proxyServer -C -N -g -D \
     proxyServerIp:9999 \
     -o ExitOnForwardFailure=yes \
     -o ServerAliveInterval=60

# Configure dockerd and restart.
# NOTICE: using "all_proxy"
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="all_proxy=socks5://proxyServerIp:9999"
Environment="NO_PROXY=localhost,127.0.0.1,private.docker.registry.com"
EOF

systemctl daemon-reload
systemctl restart docker

# Test whether can pull images
docker run -it --rm alpine:3.5
btpka3
fonte
3

A solução completa para Windows, para definir as configurações de proxy.

< user>:< password>@< proxy-host>:< proxy-port>

Você pode configurá-lo diretamente clicando com o botão direito do mouse em configurações, no ícone do Docker e, em seguida, em Proxies.

Lá você pode configurar o endereço proxy, porta, nome de usuário e senha.

Neste formato:

< user>:< password>@< proxy-host>:< proxy-port>

Exemplo:

"geronimous:[email protected]:8080"

Nada além disso.

user2280949
fonte
2

Simplesmente definir variáveis ​​de ambiente proxy não me ajudou na versão 1.0.1 ... Eu tive que atualizar o /etc/default/docker.ioarquivo com o valor correto para a variável "http_proxy".

Richil
fonte
2

Se você estiver no Ubuntu, execute estes comandos para adicionar seu proxy.

sudo nano /etc/default/docker

E descomente as linhas que especificam

#export http_proxy = http://username:[email protected]:8050

E substitua-o pelo seu servidor proxy e nome de usuário apropriados.

Em seguida, reinicie o Docker usando:

service docker restart

Agora você pode executar comandos do Docker atrás do proxy:

docker search ubuntu
Gary Mendonca
fonte
2

Talvez você precise configurar variáveis ​​em minúsculas. No meu caso, meu arquivo /etc/systemd/system/docker.service.d/http-proxy.conf se parece com o seguinte:

[Service]
Environment="ftp_proxy=http://<user>:<password>@<proxy_ip>:<proxy_port>/"
Environment="http_proxy=http://<user>:<password>@<proxy_ip>:<proxy_port>/"
Environment="https_proxy=http://<user>:<password>@<proxy_ip>:<proxy_port>/"

Boa sorte! :)

Lawrence Ferreira
fonte
2

Eu também estava enfrentando o mesmo problema atrás de um firewall. Siga os passos abaixo:

$ sudo vim /etc/systemd/system/docker.service.d/http_proxy.conf
[Service]
Environment="HTTP_PROXY=http://username:password@IP:port/"

Não use ou remova o arquivo https_prxoy.conf.

Recarregue e reinicie seu contêiner Docker:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557*********************************8
Status: Downloaded newer image for hello-world:latest
abhishek pant
fonte
1

Se você estiver no Ubuntu, você deve executar este comando:

export https_proxy=http://your_name:password@ip_proxy:port docker 

E recarregue o Docker com:

service docker.io restart

Ou vá para o /etc/docker.ionano ...

koff75
fonte
1

No Ubuntu 14.04 (Trusty Tahr) com Docker 1.9.1, apenas descomentei a http_proxylinha, atualizei o valor e reiniciei o serviço Docker.

export http_proxy="http://proxy.server.com:80"

e depois

service docker restart
Neo
fonte
0

No RHEL6.6, apenas isso funciona (observe o uso de export):

/ etc / sysconfig / docker

export http_proxy="http://myproxy.example.com:8080"
export https_proxy="http://myproxy.example.com:8080"

NOTA: Ambos podem usar o httpprotocolo.)

Obrigado a https://crondev.com/running-docker-behind-proxy/

vaughan
fonte
0

Na minha rede, o Ubuntu trabalha atrás de um servidor proxy ISA corporativo. E isso requer autenticação. Eu tentei todas as soluções mencionadas acima e nada ajudou. O que realmente ajudou foi escrever uma linha de proxy no arquivo /etc/systemd/system/docker.service.d/https-proxy.confsem um nome de domínio.

Ao invés de

Environment="HTTP_PROXY=http://user@domain:password@proxy:8080"

ou

Environment="HTTP_PROXY=http://domain\user:password@proxy:8080"

e alguma outra substituição, como @ -> %40ou \ -> \\eu tentei usar

Environment="HTTP_PROXY=http://user:password@proxy:8080"

E isso funciona agora.

Dmitry Polyakov
fonte
0

Tente o seguinte:

sudo HTTP_PROXY=http://<IP address of proxy server:port> docker -d & 
Abdennour TOUMI
fonte
0

Isso não responde exatamente à pergunta, mas pode ajudar, especialmente se você não quiser lidar com arquivos de serviço.

Caso você esteja hospedando a imagem, uma maneira é converter a imagem como um arquivo tar, usando algo como o seguinte no servidor .

docker save <image-name> --output <archive-name>.tar

Basta baixar o arquivo e transformá-lo novamente em uma imagem.

docker load <archive-name>.tar
estilhaços
fonte