使docker使用IPv4进行端口绑定

use*_*546 77 ubuntu port ipv6 docker

我有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      -
Run Code Online (Sandbox Code Playgroud)

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

我想要SSH到该容器,但我无法将其唯一绑定到IPv6

这是我的泊坞版 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
Run Code Online (Sandbox Code Playgroud)

我跑了 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 51

正如@ 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以验证.

  • 已经是0,但仍然无法在我的盒子里工作:-( (26认同)
  • 实际上这是一个大问题.像Azure这样的公共云并不能很好地说IPV6,例如公共Azure负载均衡器正在尝试将IPV4作为后端. (4认同)
  • @bigdong你想要ipv6。 (3认同)

Dar*_*n S 26

2021 年更新:

\n

目前 docker 默认绑定 IPv4 和 IPv6。

\n

如果您想明确“让 docker 使用 IPv4 进行端口绑定”(例如,绑定在 IPv4 端口上) ,请在/选项0.0.0.0:中的端口之前添加,如下所示:-p--publish

\n
$ docker run --publish "0.0.0.0:80:80" --publish "0.0.0.0:443:443" --detach nginx\n
Run Code Online (Sandbox Code Playgroud)\n

完成后结果将如下所示:

\n
$ docker ps\n\nCONTAINER ID   IMAGE   COMMAND                  CREATED          STATUS         PORTS                                      NAMES\n2459bd225751   nginx   "/docker-entrypoint.\xe2\x80\xa6"   4 seconds ago    Up 2 seconds   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   jovial_yonath\n
Run Code Online (Sandbox Code Playgroud)\n

netstat 结果将如下所示:

\n
$ sudo netstat -tulnp\n\nActive Internet connections (only servers)\nProto Recv-Q Send-Q Local Address Foreign Address State    PID/Program name\ntcp        0      0 0.0.0.0:443   0.0.0.0:*       LISTEN   22676/docker-proxy\ntcp        0      0 0.0.0.0:80    0.0.0.0:*       LISTEN   22698/docker-proxy\n
Run Code Online (Sandbox Code Playgroud)\n

当然,您可以浏览或curl访问该设备以确保其正常工作。

\n

如果您不添加“0.0.0.0”,它将绑定到两个 IP 版本,并且将PORTS读取0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp,出于安全、控制台垃圾邮件或可预测性原因,这可能是不可取的。

\n

  • 这应该是这个旧线程的“新”答案 (6认同)

Luc*_*ack 5

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