Docker 无法使用系统代理。

3

我正在尝试在公司防火墙后使用Docker。

enter image description here

我希望强制Docker使用系统代理,但这个选项不可用。如何使Docker使用系统代理。

enter image description here


你对Docker的了解较少,是否在使用命令行界面?那么我有一个解决方案。 - venkata krishnan
是的,我在Windows上使用PowerShell。 - clockworks
3个回答

5
我写了一篇关于使用奇怪的DummyDesperatePoitras虚拟开关作为CNTLM锚点的博客文章,解决了我之前提到的一些问题(例如每次IP更改都必须更改Docker代理地址等): http://mandie.net/2017/12/10/docker-for-windows-behind-a-corporate-web-proxy-tips-and-tricks/ 截至2017年11月,这个功能在Windows版的Docker上仍未实现:https://github.com/docker/for-win/issues/589 我发现的最佳解决方案是CNTLM,但我并不满意,因为:
1)CNTLM已经有五年没有更新了。
2)您需要在Docker GUI中设置代理IP,这使得它很难自动化。Docker for Windows GUI从MobyLinux VM而非Windows注册表、配置文件或Windows环境变量读取代理设置。在Windows中设置HTTP_PROXY和HTTPS_PROXY根本不会影响Docker。我没有找到任何可编程设置代理值的方法;MobyLinux VM不接受ssh连接。如果有人能够找到从命令行或脚本执行此操作的方法,我将十分感激。
3)将代理IP设置为127.0.0.1是不起作用的,因为这将使Docker运行在其自己的接口上,而不是运行CNTLM的主机PC上。我也尝试过DockerNAT接口IP,即10.0.75.1,但没有成功。
4)这意味着代理IP需要是您当前外部网络接口的活动IP地址。如果您经常在建筑物之间移动,每次想要使用Docker时都需要检查这个。
  • 将CNTLM设置为监听0.0.0.0的3128端口,而不仅仅是3128或127.0.0.1的3128。这样做可以避免每次PC获得新IP地址时都更新此IP地址的麻烦。只有端口号可以防止来自运行Docker的VM的流量被“听到”。
  • 计算NTLMv2哈希并将其存储在配置文件中,而不是用户名和密码。这对于每个PC和用户帐户都是不同的,因此除非您想被锁定,否则不要与另一台PC共享未编辑的配置文件。下次更改Windows密码时,您需要更新此存储的哈希。
  • 在对其配置文件进行任何更改后重新启动cntlm Windows服务。
  • 在cmd.exe或PowerShell中运行ipconfig以查找您当前的IP地址。如果您正在使用企业VPN,请使用WiFi或以太网适配器的IP地址,而不是VPN的IP地址。
  • 在“Web服务器(HTTP)”框中输入http://ipfromipconfig:3128/。确保选中“两者使用相同”的复选框。

3

使用CNTLM可以自动处理代理问题。它允许我们在没有任何凭据的情况下指定IP地址,因此安全性更好,每当我们更改密码时,我们只需要在一个地方更改即可。我们还可以指定不应被代理的URL。

自18.03版Docker起,有一个特殊的DNS名称:host.docker.internal。这允许从Docker容器连接到主机。现在,当我们在cntlm.ini中设置我们的CNTLM代理以便它监听0.0.0.0:3128时:

Listen 0.0.0.0:3128

然后我们可以在Docker设置中使用host.docker.internal:3128地址指定代理,该地址将被转换为我们机器的相应和当前本地地址。


这个答案适用于2020年。我认为接受的答案已经不再可行,因为作者在她自己的帖子上发表了评论:https://stackoverflow.com/questions/46669115/docker-on-windows-with-a-proxy/47788248 - EnE_
请注意,我处于NATLMv2环境中。这个答案很有帮助,但我不得不将CNTLM指向另一个端口(0.0.0.0:53128),因为否则CNTLM服务将无法启动。之后,我还在Docker GUI中添加了代理设置,使用http://myusername:mypassword@docker.for.win.localhost:53128。同时,包含特殊字符(如#、!、?)的密码有时会由于URL编码而导致严重问题。 - Dominik Sand

-1

您可以设置两个环境变量 http_proxy 和 https_proxy

http_proxy 的值为 http://username:password@proxyIp:proxyport

例如,在我的情况下,它是 http://venkat_krish:password@something.ad.somthing.com:80

您可以将同样的方式用于 https 代理

注意:

如果用户名或密码中含有除 _ & . 以外的特殊字符,则需要对 URL 进行编码。请访问此链接进行 URL 编码 https://grox.net/utils/encoding.html

例如,如果您的密码是 abc@123,则应编写为 abc%40123


仅添加环境变量是否足够,还需要在Docker上进行任何配置吗? - clockworks
如果您设置了环境变量,它将通过代理在命令提示符后提供Internet访问。因此,在Docker中不需要任何其他设置。我在Node包管理器(npm)中使用相同的方法,对我来说效果很好。 - venkata krishnan
我已将HTTP_PROXY和HTTPS_PROXY添加为环境变量,但仍出现相同的错误。 - clockworks
你能否在你的PowerShell中检查是否可以读取它们?例如echo命令echo %http_proxy%。 - venkata krishnan
你尝试过这个链接吗?https://www.zerrouki.com/working-behind-a-proxy/ - venkata krishnan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接