在具有虚拟化网络的 Docker >= 1.10 中,HTTPS 请求失败

在具有虚拟化网络的 Docker >= 1.10 中,HTTPS 请求失败

我遇到一个问题,无法从版本 1.10.3 或 1.11.2 的 Docker 容器内部建立 HTTPS 连接。

我尝试使用 apt-get、curl 和 wget,但只要建立 HTTPS 连接,它们都会失败。

例如,以下命令失败:

$ docker run -it ubuntu-curl curl -v https://www.google.com
[...]
* gnutls_handshake() failed: Error in the pull function.
* Closing connection 0

Docker 镜像ubuntu-curl基于ubuntu:latest,唯一的变化是apt-get update ; apt-get install curl

如果我使用 HTTP 而不是 HTTPs,它就可以正常工作。如果我从主机发出相同的命令,它也可以正常工作。如果我启动容器无需网络虚拟化(docker run --net="host"),它能正常工作。如果我降级 Docker(我尝试了 1.6.2 和 1.9.1),它也能正常工作。

有什么提示可能出了什么问题?我尝试了两台主机,Ubuntu 14 LTS 和 CoreOS 稳定版,没有相关的定制 - 都在 OpenStack 集群内运行。

主机的 iptables(虽然我不明白为什么 iptables 应该只阻止 HTTPs 流量):

$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER-ISOLATION  all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:12345

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

答案1

我得到了一个解决方案Docker 社区

OpenStack 网络似乎使用较低的 MTU 值,并且 Docker 不会从主机的网卡推断 MTU 设置自 1.10 起

要使用自定义 MTU 设置运行 docker daemon,你可以按照以下方法操作这篇博文, 说的是:

$ cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service

在新文件中编辑一行,如下所示:

ExecStart=/usr/bin/docker daemon -H fd:// –mtu=1454

MTU 1454 似乎是 OpenStack 中常见的值。您可以使用 ifconfig 在主机中查找它。

最后重启Docker:

$ sudo systemctl daemon-reload
$ sudo service docker restart

相关内容