我在网上找不到答案,因此我的问题是:为什么Docker守护程序只打开一个IPv6套接字?如何强制它使用双堆栈或仅使用IPv4的插槽?
# docker version
:
Client:
Version: 17.06.2-ol
API version: 1.30
Go version: go1.8.3
Git commit: d02b7ab
Built: Fri Oct 6 00:02:23 2017
OS/Arch: linux/amd64
Server:
Version: 17.06.2-ol
API version: 1.30 (minimum version 1.12)
Go version: go1.8.3
Git commit: d02b7ab
Built: Fri Oct 6 00:03:48 2017
OS/Arch: linux/amd64
Experimental: false
/etc/sysconfig/docker-network
文件(它是Oracle Linux系统):
DOCKER_NETWORK_OPTIONS=-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376
# sysctl net.ipv6.bindv6only
:
net.ipv6.bindv6only = 0
我试图在系统范围内设置--ipv6=false
,或者完全禁用IPv6。仍然,正如ss
或netstat
所示,Docker只打开一个IPv6套接字:
LISTEN 0 128 :::2376 :::* users:(("dockerd",pid=2677,fd=6))
在主机上没有相应的IPv4或IPv4映射的IPv6套接字。
来自不同主机的Docker客户端调用使用IPv4地址,不会从服务器获得任何响应,tcpdump
表示该守护进程根本不响应它们。如果我使用nc
打开IPv4套接字,两个主机可以正常通信。
我的问题当然可能是另一个原因,但是现在我想排除这种可能性。有没有人有任何想法?
不要认为这是一个Docker问题,如果你授权所有人没有任何限制或只有端口,它将显示为打开的ipv6端口,但它仍然可用于ipv4。
这只意味着开放而不限制端口号......这里的答案比我的更清楚:https://unix.stackexchange.com/questions/152612/netstat-why-are-ipv4-daemons-listening-to-ports-listed-only-in-a-inet6