dockerがポートバインディングにIPv4を使用するようにする


97

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

Dockerホストは、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      -

これで、ホストの40122ポートがコンテナのポート22とリンクしました。

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

コンテナーを起動するためにどのコマンドを使用しましたか?docker psコンテナが実行されているときの出力も投稿します。
ダニエルt。

sshdが実際にコンテナーで実行されていることを確認できますか?実行してdocker exec -ti 201bde6c839a /bin/bash、いったん入ったら、ps aux andnetstat -taln
Daniel tの

私のDockerホストでは、すべてのDockerポートがIPv6でリッスンしており、コンテナーのsshに問題なく接続できます。
ダニエルt。

@ダニエルト。情報を追加しました。私は可能なのsshのexecを使用していますが、私は、Macからホストポート40122を使用して、外部からの直接の容器にsshをすることができません
user3214546

あなたはこの問題github.com/docker/docker/issues/2174を打つ可能性があります、それが解決されたかどうかはわかりません。また、sshを介して接続しようとしている方法と発生しているエラーを共有できますか?
ダニエルt。

回答:


72

@ daniel-tがコメントで指摘しているように、github.com / docker / docker / issues / 2174は、IPv6へのバインディングのみを表示することを目的としていますがnetstat、これは問題ではありません。その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検証のために実行できます。


4
これは実際には大きな問題です。Azureのようなパブリッククラウドは、IPV6をうまく話しません。たとえば、パブリックAzureロードバランサーは、IPV4をバックエンドとして試みています。
Thomas Decaux

1
Azureに「Docker VM Extension」をインストールし、Ubuntu 14.04 LTSを使用する必要があるようです。ただし、ipv6はネットワークではなくローカルホストでのみ発生するため、問題はないと思います。
Michael

あなたは正しい、問題は私の構成にありました(IPV6を無効にすることは良い考えではありません^^)
Thomas Decaux

1
@bigdongはipv6をオンにします。
マイケル、

1
@マイケルあなたは私の時間の節約になります。:)
lv0gun9

6

設定でnet.ipv6.conf.all.forwarding=1問題が解決します。

これは、使用中のライブシステムで実行できます。 sudo sysctl -w net.ipv6.conf.all.forwarding=1


この回答には1つの利点があります。これにより、Dockerデーモンを再起動せずに問題を「修正」できるようになります(以下のdocker configを変更することで回答)。上の選択された答えについて:私は実際に持っていたsysctl net.ipv6.bindv6only=0ので、この構成を変更しても役に立たなかった。
pkoperek


0

コンテナーポートを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 1.9.1で動作します


1
これはdebianで動作しますか?/ etc / default / dockerにすべきではありませんか?
Dimitri Kopriwa 2016年

1
@BigDongコメントをありがとう、私はOSのようなRedHatにいるので、パスはOSごとに少し異なります。回答にコメントを反映させようとしました
Sylvain

-1

SELinuxを無効にした後、Dockerコンテナーにアクセスできました

SELinuxを一時的に無効にするには #sudo setenforce 0

私のDockerコンテナーはCentos-7で実行されていました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.