无法在代理后面下载Docker镜像

rpa*_*anm 297 proxy docker

我在我的Ubuntu 13.10(Saucy Salamander)上安装了Docker,当我输入我的控制台时:

sudo docker pull busybox
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我在没有身份验证的代理服务器后面,这是我的/etc/apt/apt.conf文件:

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/";
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ale*_*ard 723

以下是代理HTTP的官方Docker文档的链接:https: //docs.docker.com/config/daemon/systemd/#httphttps-proxy

快速概述:

首先,为Docker服务创建一个systemd插件目录:

mkdir /etc/systemd/system/docker.service.d
Run Code Online (Sandbox Code Playgroud)

现在创建一个名为的文件/etc/systemd/system/docker.service.d/http-proxy.conf,添加HTTP_PROXY环境变量:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
Run Code Online (Sandbox Code Playgroud)

如果您有内部Docker注册表,您需要联系而无需代理,您可以通过NO_PROXY环境变量指定它们:

Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com"
Run Code Online (Sandbox Code Playgroud)

同花顺变化:

$ sudo systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

验证是否已加载配置:

$ sudo systemctl show --property Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/
Run Code Online (Sandbox Code Playgroud)

重启Docker:

$ sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

  • 适用于Ubuntu 16.04. (30认同)
  • 也在CentOS 7工作.谢谢! (12认同)
  • 致力于RHEL 7.1.谢谢. (6认同)
  • 对于ubuntu 14.04,请参阅@ n3o的回答,因为`systemctl`不适用于ubuntu 14.04,它使用`upstart`来启动服务. (4认同)
  • 这适用于运行Docker 1.6.2的Debian Jessie.以某种方式编辑`/ etc/default/docker`不起作用.也许我应该像Centos记录的那样删除`export`. (3认同)
  • 现在它返回"需要代理身份验证"...如何配置用户名和密码? (3认同)
  • 对我来说,这对选定的答案起了作用.Ubuntu 15.10 (2认同)
  • 对于较旧的SysV编辑/ etc/sysconfig/docker,如https://docs.oracle.com/cd/E37670_01/E37355/html/section_kfy_f2z_fp.html - Oracle Linux 6.7 (2认同)
  • 注意:我认为'daemon-reload'足以将更改应用到docker,但是实际上,必须使用`sudo systemctl restart docker`才能正常工作。 (2认同)
  • 另外,如果您想添加袜子代理,您可能需要添加以下内容:`ALL_PROXY=socks5://<host>:<port>` (2认同)

mba*_*emy 88

您的APT代理设置与Docker无关.

Docker使用HTTP_PROXY环境变量(如果存在),例如:

sudo HTTP_PROXY=http://192.168.1.1:3128/ docker pull busybox
Run Code Online (Sandbox Code Playgroud)

但相反,我建议您查看一下您的/etc/default/docker配置文件:您应该有一行来取消注释(并可能调整)以自动应用您的代理设置.然后重启Docker服务器:

service docker restart
Run Code Online (Sandbox Code Playgroud)

  • 在我的情况下,/ etc/default/docker包含小写示例(http_proxy),但为了让工作正常,我必须在那里添加大写设置(HTTP_PROXY). (8认同)
  • 不适用于docker 1.9.1,请参阅下面的[此答案](http://stackoverflow.com/a/28093517/2091399) (3认同)
  • 这在 Debian 8.8 上不起作用,您需要在 /etc/systemd/system/docker.service.d 中设置 http_proxy,如接受的答案所示 (2认同)

Aru*_*n Y 54

在CentOS上,Docker的配置文件位于:

/etc/sysconfig/docker

添加以下行帮助我让Docker守护程序在代理服务器后面工作:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="http://<proxy_host>:<proxy_port>"
Run Code Online (Sandbox Code Playgroud)

  • 导出HTTP_PROXY ="http:// <用户名>:<密码> @ <proxy_host>:<proxy_port>"为公司代理背后的人 (6认同)
  • 对我来说,`export`只适用于CentOS6,而不适用于CentOS7 (3认同)
  • `export HTTP_PROXY=...` 是一个 Bashism,对于非 Bash shell(比如 /bin/sh 可能是什么),使用两行 `HTTP_PROXY=...` 然后`export HTTP_PROXY` 那就是说,我没有根本不需要`export`。 (2认同)

Ped*_*rid 37

如果您正在使用新的Docker for Mac(或Docker for Windows),只需右键单击Docker托盘图标并选择首选项(Windows:设置),然后转到高级,然后在代理下指定您的代理设置.单击Apply并重新启动并等待Docker重新启动.


gke*_*rus 32

在Ubuntu上,您需要为Docker守护进程设置http_proxy,而不是客户端进程.这是在/etc/default/docker(见这里)完成的.

  • 它说我无权访问您的群组。在链接中。 (2认同)

小智 25

为了扩展Arun上面的答案,为了在CentOS 7中工作,我不得不删除"export"命令.所以编辑

/etc/sysconfig/docker
Run Code Online (Sandbox Code Playgroud)

并添加:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="https://<proxy_host>:<proxy_port>"
http_proxy="${HTTP_PROXY}"
https_proxy="${HTTPS_PROXY}"
Run Code Online (Sandbox Code Playgroud)

然后重启Docker:

sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

源是这个博客帖子.

  • 只需要HTTP_PROXY(在Fedora 20上测试). (2认同)

Roc*_*ite 13

为什么本地绑定的代理不起作用

问题

如果您正在运行本地绑定的代理,例如监听127.0.0.1:8989,它将无法在Docker for Mac中运行.从Docker文档:

我想从容器连接到主机上的服务

Mac具有更改的IP地址(如果您没有网络访问权限,则为无).我们目前的建议是将未使用的IP lo0连接到Mac上的界面; 例如:sudo ifconfig lo0 alias 10.200.10.1/24,并确保您的服务正在侦听此地址或0.0.0.0(即不是127.0.0.1).然后容器可以连接到此地址.

类似的是Docker服务器端.(要了解Docker的服务器端和客户端,请尝试运行docker version.)服务器端运行在具有自己的虚拟化层上localhost.因此,它不会连接到localhost主机OS 上的代理服务器.

解决方案

所以,如果你使用像我这样的本地绑定代理,基本上你必须做以下事情才能使它适用于Docker for Mac:

  1. 让您的代理服务器监听0.0.0.0而不是127.0.0.1.警告:您需要正确的防火墙配置以防止恶意访问它.

  2. lo0接口添加环回别名,例如10.200.10.1/24:

    sudo ifconfig lo0 alias 10.200.10.1/24
    
    Run Code Online (Sandbox Code Playgroud)
  3. 10.200.10.1:8989从Docker托盘菜单中的"首选项"设置HTTP和/或HTTPS代理(假设代理服务器正在侦听端口8989).

之后,通过从未下载的映像在新容器中运行命令来测试代理设置:

$ 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
  ...
Run Code Online (Sandbox Code Playgroud)

注意:设置的环回别名ifconfig在重启后不会保留.使其持久是另一个主题.请用日语查看此博客文章(谷歌翻译可能会有所帮助).


n3o*_*n3o 9

这是对我有用的修复:Ubuntu,Docker版本:1.6.2

在文件中/etc/default/docker,添加以下行:

export http_proxy='http://<host>:<port>'
Run Code Online (Sandbox Code Playgroud)

重启Docker

sudo service docker restart
Run Code Online (Sandbox Code Playgroud)


Mar*_*ann 8

要将Docker配置为使用代理,您需要将HTTPS_PROXY/HTTP_PROXY环境变量添加到Docker sysconfig文件(/etc/sysconfig/docker)中.

根据您是否使用init.d或服务工具,您需要添加"export"语句(由于Debian Bug报告日志 - #767441./ etc/default/docker中的示例对于支持的语法有误导性):

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>"
Run Code Online (Sandbox Code Playgroud)

Docker存储库(Docker Hub)仅支持HTTPS.要使Docker使用SSL拦截代理,您必须将代理根证书添加到系统信任库.

对于CentOS,将文件复制到/etc/pki/ca-trust/source/anchors/并更新CA信任库并重新启动Docker服务.

如果您的代理使用NTLMv2身份验证 - 您需要使用Cntlm之类的中间代理来桥接身份验证.这篇博文详细解释了它.


Mar*_*les 5

安装Docker之后,请执行以下操作:

[mdesales@pppdc9prd1vq ~]$ sudo HTTP_PROXY=http://proxy02.ie.xyz.net:80 ./docker -d &
[2] 20880
Run Code Online (Sandbox Code Playgroud)

然后,您可以拉动或做任何事情:

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)
Run Code Online (Sandbox Code Playgroud)


小智 5

在 Docker 的新版本 docker -engine 中,在基于systemd的发行版中,您应该将环境变量行添加到/lib/systemd/system/docker.service,正如其他人提到的:

Environment="HTTP_PROXY=http://hostname_or_ip:port/"
Run Code Online (Sandbox Code Playgroud)

  • 将行添加到 [Service] 部分 (2认同)