使docker使用IPv4进行端口绑定


97

我有docker主机,内部有一个容器。

泊坞窗主机仅在IPv6接口上绑定端口,而不在IPv4上绑定端口。

这是输出

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:55082           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::40280                :::*                    LISTEN      -
tcp6       0      0 :::5432                 :::*                    LISTEN      -
tcp6       0      0 :::40122                :::*                    LISTEN      -
tcp6       0      0 :::36378                :::*                    LISTEN      -
tcp6       0      0 :::40543                :::*                    LISTEN      -
tcp6       0      0 :::111                  :::*                    LISTEN      -

现在我在主机上有40122端口,可与容器上的端口22链接。

我想通过SSH进入该容器,但无法绑定到IPv6

这是我的Docker版本 Docker version 1.5.0, build a8a31ef

docker ps

201bde6c839a        myapp:latest   "supervisord -n"    3 weeks ago         Up 2 hours          0.0.0.0:40122->22/tcp, 0.0.0.0:40280->80/tcp, 0.0.0.0:40543->443/tcp   myapp

我跑了 docker run -d -P -p 40122:22

netstat -tlna

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3031          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::6379                 :::*                    LISTEN

ps辅助

root         1  0.0  0.8  52440 16668 ?        Ss   00:53   0:03 /usr/bin/python /usr/bin/supervisord -n
root        49  0.0  0.1  17980  3048 ?        S    01:32   0:00 bash
root        64  0.0  0.1  46632  2712 ?        S    01:32   0:00 su -l vagrant
vagrant     65  0.0  0.1  21308  3760 ?        S    01:32   0:00 -su
root       288  0.0  0.1  17980  3088 ?        S    02:01   0:00 bash
root       304  0.0  0.1  46632  2720 ?        S    02:01   0:00 su -l vagrant
vagrant    305  0.0  0.1  21304  3804 ?        S    02:01   0:00 -su
vagrant    308  0.0  3.7 429616 75840 ?        Sl+  02:01   0:05 python ./manage.py shell_plus
root       654  0.0  0.4  47596  9848 ?        S    03:12   0:01 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       655  0.0  0.3  90280  7732 ?        S    03:12   0:00 nginx: master process /usr/sbin/nginx
www-data   656  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   657  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   658  0.0  0.1  90600  3624 ?        S    03:12   0:00 nginx: worker process
www-data   659  0.0  0.2  90940  4500 ?        S    03:12   0:00 nginx: worker process
root       660  0.0  0.2  61372  5332 ?        S    03:12   0:00 /usr/sbin/sshd -D
root       669  0.0  0.4  37004  8892 ?        Sl   03:12   0:01 redis-server *:6379
root       856  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       857  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       858  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root       859  8.0  2.8 388720 57792 ?        Sl   04:07   0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
vagrant    889  0.0  0.1  18692  2508 ?        R+   04:11   0:00 ps aux

您使用了什么命令来启动容器?同时发布docker ps容器运行时的输出。
Daniel t。

您可以确认sshd实际上在容器上运行吗?docker exec -ti 201bde6c839a /bin/bash进入后,运行,发布ps aux netstat -taln
Daniel t

在我的Docker主机中,所有Docker端口都在侦听IPv6,并且连接到容器上的ssh没问题。
Daniel t。

@Danielt。我已经添加了信息。我可以使用exec SSH,但是我不能使用Mac的主机端口
40122

您可能会遇到这个问题github.com/docker/docker/issues/2174,我不确定是否已解决。您还能分享您尝试通过ssh进行连接的方式以及所收到的错误吗?
Daniel t。

Answers:


72

正如@ daniel-t在评论中指出的那样:github.com/docker/docker/issues/2174是关于仅在中显示对IPv6的绑定netstat,但这不是问题。正如github问题指出的那样:

设置代理时,Docker请求回送地址“ 127.0.0.1”,Linux意识到这是一个存在于IPv6中的地址(如:: 0),并且在两个地址上都打开(但它正式是一个IPv6套接字)。运行netstat时,它会看到并告诉您它是IPv6-但它仍在侦听IPv4。如果您稍微进行了一些设置,则可能已禁用了Linux的这一技巧-通过设置net.ipv6.bindv6only = 1。

换句话说,仅因为您仅将其视为IPv6,否则它仍然能够在IPv4上进行通信,除非您将IPv6设置为仅使用net.ipv6.bindv6only设置绑定到IPv6上。需要明确的是,net.ipv6.bindv6only应该为0-您可以运行sysctl net.ipv6.bindv6only进行验证。


4
实际上,这是一个大问题。像Azure这样的公共云说IPV6不太好,例如,公共Azure负载平衡器正在尝试将IPV4用作后端。
Thomas Decaux

1
似乎您可能需要在Azure中安装“ Docker VM Extension”并使用Ubuntu 14.04 LTS。但是,我不认为ipv6存在问题,因为它仅在本地主机上,而不在网络上。
迈克尔(Michael

没错,问题出在我的配置中(禁用IPV6不是一个好主意^^)
Thomas Decaux 2015年

1
您想要ipv6的@bigdong。
迈克尔

1
@Michael你是我的节约者。:)
lv0gun9 '18年

6

设置net.ipv6.conf.all.forwarding=1将解决此问题。

可以在实时系统上使用 sudo sysctl -w net.ipv6.conf.all.forwarding=1


这个答案有一个优点:它使您无需重新启动docker守护程序即可“解决”问题(以下更改docker配置的答案确实如此)。关于最上面的选定答案:实际上,我不得不sysctl net.ipv6.bindv6only=0更改此配置没有帮助。
pkoperek


0

如果您希望容器端口绑定到您的ipv4地址上,请:

  • 查找设置文件
    • RedHat上的/ etc / sysconfig / docker-network都一样
    • Debian上的/ etc / default / docker-network都一样
  • 编辑网络设置
    • 添加DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx
    • xx.xx.xx.xx是您的真实ipv4(而不是0.0.0.0)
  • 重新启动docker deamon

在docker 1.9.1上为我工作


1
这对debian有用吗?不应该是/ etc / default / docker吗?
Dimitri Kopriwa '16

1
@BigDong感谢您的评论,我和OS一样都在RedHat上,所以从一个OS到另一个OS的路径有些不同,我试图在答案中反映您的评论
Sylvain

-1

禁用SELinux后,我能够访问Docker容器

暂时禁用SELinux #sudo setenforce 0

我的Docker容器在Centos-7上运行

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.