web-dev-qa-db-ja.com

Dockerコンテナーをローカルネットワークに接続する

私がやろうとしていること

コンテナーをdocker Hostだけでなく、すべてのデバイスでネットワークに使用できるようにしようとしています。

情報

  • ネットワークサブネットは9.158.143.0/24です
  • 私のゲートウェイは9.1158.143.254です
  • 私のドッカーのホストIPは9.158.143.52プライマリインターフェイス(ens160)です
  • 私のコンテナIPは9.158.143.65です
  • docker-pidはdocker process idです
  • docker idはdocker ipです

私がやろうとしていること

コンテナーをdocker Hostだけでなく、すべてのデバイスでネットワークに使用できるようにしようとしています。

ネットワーク内のどこからでもDockerにアクセスできるように(私の場合はSSH)、Dockerの構成を作成したいと思います。

これまでの手順

  1. 新しいブリッジデバイスを作成することから始めます。

    • brctl addbr br-em1

    • ip link set br-em1 up

  2. このデバイスをブリッジに追加します

    • brctl addif br-em1 ens160
  3. Ens160に属していたアドレスでブリッジを構成する

    • ip addr del 9.158.143.52/24 dev ens160

    • ip addr add 9.158.143.52/24 dev br-em1

  4. デフォルトルートをブリッジに移動する

    • ip route del default
    • ip route add default via 9.158.143.254 dev br-em1

この時点まで、すべてが機能します。 dockerホストはネットワークに接続しています

  1. docker run -itd --name web ubuntu

  2. Vethインターフェイスのペアを作成します。

    • ip link add web-intタイプvethピア名web-ext
  3. brctl addif br-em1 web-ext

  4. そして、コンテナーの名前空間にweb-intインターフェースを追加します。

    • ip link set netns $(docker-pid web)dev web-int
  5. nsenter -t $(docker-pid web)-n ip link set web-int up

  6. nsenter -t $(docker-pid web)-n ip addr add 9.158.143.65/24 dev web-int

今までvethはdockerコンテナー内に作成され、インターネットはコンテナー内で動作しています

  1. nsenter -t $(docker-pid web)-n ip route del default

  2. nsenter -t $(docker-pid web)-n ip route add default via 9.158.143.254 dev web-int

問題

これらは従うステップです。最後の2つのステップの後で、インターネットはコンテナで動作しなくなります。ネットワーク内の他のマシン(以前は機能していた)からdocker Hostマシンにpingを実行できません。

これらの手順とは別に追加する必要があるiptablesルールはありますか?もしそうなら助けてください。

PS:私のdocker0 ipは172.17.0.1使用リンク: http://blog.oddbit.com/2014/08/11/four-ways-to-connect-a-docker/ (linuxブリッジデバイス)

使用されているUbuntuイメージはsshサービスが稼働しています。

5
Ashish Karki

同様の設定をするときに私が取ったアプローチは、静的に各コンテナーにIPアドレスを割り当てることでした。次に、ブリッジのインターフェースでセカンダリIPとしてIPアドレスを「スタック」しましたvmbr0

私のネットワーク設定:

$ ip a l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope Host lo
    inet6 ::1/128 scope Host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:22:15:91:XX:XX brd ff:ff:ff:ff:ff:ff
    inet6 fe80::222:15ff:fe91:XXXX/64 scope link
       valid_lft forever preferred_lft forever
3: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:22:15:91:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global vmbr0
    inet 192.168.1.101/24 scope global secondary vmbr0
    inet 192.168.1.103/24 scope global secondary vmbr0
    inet6 fe80::222:15ff:fe91:c12d/64 scope link
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0

私はこれらのセカンダリIPを次のように追加しました:

$ ip addr add 192.168.1.101/24 dev vmbr0
$ ip addr add 192.168.1.101/24 dev vmbr0

私は私のように私のコンテナを実行します:

$ docker run --name='bind' -d \
    -p 192.168.1.101:53:53/udp \
    -p 192.168.1.101:10000:10000 sameersbn/bind:latest
1
slm