Https

使用虛擬化網路的 Docker >= 1.10 中的 HTTPS 請求失敗

  • June 25, 2016

我遇到一個問題,無法從 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 stable,沒有相關的定制——它們都在 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

Docker 社區給了我一個解決方案

OpenStack 網路似乎使用較低的 MTU 值,並且 Docker從 1.10 開始就不會從主機的網卡推斷 MTU 設置。

要使用自定義 MTU 設置執行 docker daemon,您可以關注此部落格文章,其中說:

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

編輯新文件中的一行,如下所示:

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

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

最後重啟 Docker:

$ sudo systemctl daemon-reload
$ sudo service docker restart

引用自:https://serverfault.com/questions/785768