使docker使用IPv4进行端口绑定

时间:2015-04-30 00:47:02

标签: ubuntu docker port ipv6

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

docker host仅绑定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 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 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

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

已解决问题

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

这是我们有时会遇到VM而不是桥接网络的问题,尝试使用适合您的主机

tcp     0    0 0.0.0.0:80            0.0.0.0:*             LISTEN      - 
tcp6    0    0 :::80                 :::*                  LISTEN      -  

答案 2 :(得分:0)

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

来自RedHat https://access.redhat.com/solutions/3114021

答案 3 :(得分:0)

对于CentOS用户,

我在CentOS7上遇到了同样的问题,将net.ipv4.ip_forward设置为1可解决该问题。请参考Docker Networking Disabled: WARNING: IPv4 forwarding is disabled. Networking will not work了解更多详情。

答案 4 :(得分:0)

2021 年更新:

目前docker默认绑定ipv4和ipv6。

如果您想明确“让 docker 使用 IPv4 进行端口绑定”(例如,只需强制它绑定到 ipv4 端口),请在 0.0.0.0: 的端口之前添加{1}} 选项,如下所示:

-p

完成后结果将如下所示:

$ docker run --publish "0.0.0.0:80:80" --publish "0.0.0.0:443:443" --detach nginx

netstat 结果如下所示:

$ docker ps

CONTAINER ID   IMAGE   COMMAND                  CREATED          STATUS         PORTS                                      NAMES
2459bd225751   nginx   "/docker-entrypoint.…"   4 seconds ago    Up 2 seconds   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   jovial_yonath

当然,浏览或$ sudo netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 22676/docker-proxy tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22698/docker-proxy 到设备以确保其正常工作。

如果您不这样做,它将在两个端口上绑定,并且 curl 将读取 PORTS,出于安全性、控制台垃圾邮件和可预测性原因,这可能是不可取的。

答案 5 :(得分:-1)

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

  • 找到设置文件
      RedHat上的
    • / etc / sysconfig / docker-network
    • Debian ans上的
    • / 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上为我工作