我遇到了一个问题,即无法从版本为 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Docker 社区给了我一个解决方案
OpenStack 网络似乎使用较低的 MTU 值,Docker自 1.10 起不再从主机的网卡推断 MTU 设置。
要使用自定义 MTU 设置运行 docker 守护进程,您可以关注此博客文章,其中说:
$ cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
Run Code Online (Sandbox Code Playgroud)
编辑新文件中的一行,如下所示:
ExecStart=/usr/bin/docker daemon -H fd:// –mtu=1454
Run Code Online (Sandbox Code Playgroud)
1454 的 MTU 似乎是 OpenStack 常见的值。您可以使用 ifconfig 在您的主机中查找它。
最后重启Docker:
$ sudo systemctl daemon-reload
$ sudo service docker restart
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1768 次 |
最近记录: |