web-dev-qa-db-ja.com

Dockerは転送されたポートのみをIPv6インターフェースにバインドします

転送されたポートのみをIPv4インターフェースにバインドするようにdockerに指示する方法はありますか?

IPv6を無効にしてDigital Oceanで実行しているマシンがあります。

# echo '1' > /proc/sys/net/ipv6/conf/lo/disable_ipv6  
# echo '1' > /proc/sys/net/ipv6/conf/lo/disable_ipv6  
# echo '1' > /proc/sys/net/ipv6/conf/all/disable_ipv6  
# echo '1' > /proc/sys/net/ipv6/conf/default/disable_ipv6
# /etc/init.d/networking restart

ifconfigは、IPv6対応のインターフェースがないことを報告します。

# ifconfig
docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:1372 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7221 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:88091 (88.0 KB)  TX bytes:10655750 (10.6 MB)

eth0      Link encap:Ethernet  HWaddr 04:01:08:c1:b1:01  
          inet addr:198.XXX.XXX.XXX  Bcast:198.199.90.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:97602 errors:0 dropped:4 overruns:0 frame:0
          TX packets:15362 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:141867997 (141.8 MB)  TX bytes:1376970 (1.3 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lxcbr0    Link encap:Ethernet  HWaddr 9e:51:04:ed:13:d4  
          inet addr:10.0.3.1  Bcast:10.0.3.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

新しいDockerコンテナーを起動し、コンテナーで8000から8000にポートフォワードするように要求すると、IPv6インターフェイスでのみポートフォワードが行われます。 IPv4インターフェースのみにバインドする方法はありますか?

# docker run -p 8000:8000 -i -t colinsurprenant/ubuntu-raring-AMD64 /bin/bash

# lsof -OnP | grep LISTEN
sshd      1275             root    3u     IPv4 ... TCP *:22 (LISTEN)
sshd      1275             root    4u     IPv6 ... TCP *:22 (LISTEN)
dnsmasq   2975      lxc-dnsmasq    7u     IPv4 ... TCP 10.0.3.1:53 (LISTEN)
docker    9629             root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9630        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9631        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9632        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9633        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9634        root    7u     IPv6 ... TCP *:8000 (LISTEN)
docker    9629 9698        root    7u     IPv6 ... TCP *:8000 (LISTEN)
6
Mark L

私は同じ問題を経験しました:

編集/etc/modprobe.d/blacklist.confと:

blacklist ipv6

そして/etc/default/grubと:

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 console=ttyS0"

次にupdate-grubおよびreboot

2
leseb

実際、Dockerはnetfilterファイアウォールを使用して、サービスが利用可能であることを確認しています。 lsofは何も教えてくれません。実行してみてください

iptables -L -t nat
ip6tables -L -t nat

ただし、コンテナが指定されたポートをリッスンしない可能性があります。

Nsenterを使用して、コンテナーを調べて、サービスが予期されるポートをリッスンしていることを確認できます。

nsenter --net -t PID netstat -ltpn

PIDは、コンテナー内で実行されているプロセスのPIDである必要があります。おそらくサービスです。 --netは、ネットワーク名前空間を入力するためのものです。次に、netstatオプション-ltpnはリスニングをリストします(-l)TCP(-t)ソケット。プロセスを表示(-p)、およびポート番号を数値形式で表示します(-n)。

1
Mildred