web-dev-qa-db-ja.com

DockerでポートバインディングにIPv4を使用する

ドッカーホストがあり、内部に1つのコンテナーがあります。

ドッカーホストは、IPv4ではなく、IPv6インターフェイスのみでポートをバインドします。

これは出力です

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      -

コンテナのポート22とリンクするホストに40122ポートがあります。

そのコンテナに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 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
69
user3214546

@ daniel-tがコメントで指摘しているように、 github.com/docker/docker/issues/2174netstatのIPv6のみへのバインディングを示していますが、それは問題ではありません。 githubの問題の状態:

プロキシを設定するとき、Dockerはループバックアドレス「127.0.0.1」を要求します。LinuxはこれがIPv6に存在するアドレスであると認識し(:: 0)、両方で開きます(ただし、正式にはIPv6ソケットです)。 netstatを実行すると、これが表示され、IPv6であることが示されますが、まだIPv4でリッスンしています。設定を少し試してみた場合、net.ipv6.bindv6only = 1を設定することにより、Linuxが行うこのトリックを無効にした可能性があります。

言い換えると、IPv6のみとして表示されるからといって、net.ipv6.bindv6only設定でIPv6のみにバインドするようにIPv6を設定していない限り、IPv4で通信できます。明確にするために、net.ipv6.bindv6onlyは0でなければなりません-sysctl net.ipv6.bindv6onlyを実行して確認できます。

47
Michael

Net.ipv6.conf.all.forwarding = 1を設定すると、問題が修正されます。私のために働く

5
LuciferJack

コンテナーポートを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デーモンを再起動します

docker 1.9.1で動作します

0
Sylvain