Ubuntu 使docker使用IPv4进行端口绑定

Ubuntu 使docker使用IPv4进行端口绑定,ubuntu,docker,port,ipv6,Ubuntu,Docker,Port,Ipv6,我有一个docker主机,里面有一个容器 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.

我有一个docker主机,里面有一个容器

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版本1.5.0,构建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-p40122: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 aux

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

正如@daniel-t在评论中指出的:是关于在
netstat
中仅显示与IPv6的绑定,但这不是问题。正如github发布的声明所述:

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


换句话说,仅仅因为您将其视为仅限IPv6,它仍然能够在IPv4上通信,除非您使用net.IPv6.bindv6only设置将IPv6设置为仅在IPv6上绑定。为了清楚起见,net.ipv6.bindv6only应为0-您可以运行sysctl net.ipv6.bindv6only进行验证。

如果希望容器端口绑定到ipv4地址,只需:

  • 查找设置文件
    • /RedHat上的etc/sysconfig/docker网络
    • /Debian上的etc/default/docker网络
  • 编辑网络设置
    • 添加DOCKER_网络_选项=-ip=xx.xx.xx.xx
    • xx.xx.xx.xx是您真正的ipv4(而不是0.0.0.0)
  • 重新启动docker deamon

在docker 1.9.1上对我有效设置
net.ipv6.conf.all.forwarding=1
将解决此问题

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

默认情况下,docker使用可用于IPv4和ipv6连接的AF_INET6套接字。这会导致netstat报告侦听地址的IPv6地址

从红帽
问题已解决

使用
docker run-it-p80:80--name nginx--net=host-d nginx

这是我们在虚拟机方面面临的问题,而不是网桥网络。请尝试使用适合您的主机

对于CentOS用户


我在CentOS7上遇到了同样的问题,将net.ipv4.ip_设置为1解决了这个问题。有关更多详细信息,请参阅。

您使用了什么命令启动容器?当容器运行时,也发布
docker ps
的输出。您能确认sshd实际上正在容器上运行吗?运行
docker exec-ti 201bde6c839a/bin/bash
,一旦进入,在我的docker主机中发布
ps aux
netstat-taln
的输出,所有docker端口都在侦听IPv6,并且在容器上连接到ssh没有问题。@Danielt。我已经添加了信息。我可以使用exec进行ssh,但我无法使用Mac主机端口40122从外部直接ssh到容器中。如果遇到此问题,我不确定是否已解决。您还可以分享您是如何尝试通过ssh连接的,以及您遇到的错误吗?这实际上是一个大问题。像Azure这样的公共云不能很好地使用IPV6,例如,公共Azure负载平衡器正在尝试将IPV4作为后端。您可能需要在Azure中安装“Docker VM扩展”,并使用Ubuntu 14.04 LTS。但是,我认为ipv6没有问题,因为这只是在本地主机上,而不是在网络上。你是对的,问题出在我的配置中(禁用ipv6不是一个好主意^^)@bigdong你想启用ipv6。@Michael你是我的省时工具。:)这对debian有效吗?是不是应该是/etc/default/docker?@BigDong谢谢你的评论,我使用的是RedHat-like操作系统,所以从一个操作系统到另一个操作系统的路径有点不同。我试图在回答中反映你的评论。这个答案有一个优点:它允许你“修复”问题,而不必重新启动docker守护程序(下面更改docker配置的答案是正确的)。关于顶部,选择的答案:我实际上有
sysctl net.ipv6.bindv6only=0
,因此更改此配置没有帮助。
tcp     0    0 0.0.0.0:80            0.0.0.0:*             LISTEN      - 
tcp6    0    0 :::80                 :::*                  LISTEN      -