web-dev-qa-db-ja.com

LAN内のDocker 1.10コンテナーのIP

Docker 1.10(およびlibnetworkの更新)以降、ユーザー定義ネットワーク内のコンテナーにIPを手動で与えることができます。

LANのコンテナーにIPアドレスを与えたい(「ブリッジ」モードの仮想マシンでできるように)。私のLANは192.168.1.0/24で、すべてのコンピューターにはIPアドレスがあります。また、LANのどこからでも(NAT/PAT/etcなしで)アクセスできるように、この範囲のIPを持つコンテナーが必要です。

私は明らかにJessie Frazelleの ブログ投稿 を読んでおり、他の多くの人がここやどこにでも投稿しています:

その他にもたくさんありますが、何も出ませんでした。私のコンテナには、まだドッカーホストの「内部」にIPアドレスがあり、LAN上の他のコンピューターからはアクセスできません。

Jessie Frazelleのブログ投稿を読んで、私は(彼女がパブリックIPを使用しているので)私がやりたいことをできると思ったのですか?

Edit:確かに、次のようなことをしたら:

network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet
docker run --rm -it --net homenet --ip 192.168.1.100 nginx

ドッカーホストの新しいインターフェイス(br- [a-z0-9] +)は、ルーターIPである '--gateway' IPを使用します。ネットワーク上の2台のコンピューターに同じIP ... BOOM

前もって感謝します。

20
Jérôme Pin

EDIT:このソリューションは今では役に立ちません。バージョン1.12以降、Dockerはmacvlanとipvlanの2つのネットワークドライバーを提供します。 LANネットワークから静的IPを割り当てることができます。 以下の回答 を参照してください。


同じ問題を抱えている人 を探した後、回避策に進みました。

要約:

  • (V)LANは192.168.1.0/24です
  • デフォルトゲートウェイ(=ルーター)は192.168.1.1
  • 複数のDockerホスト
  • 注:2つのNIC:eth0およびeth1(Docker専用))があります

私達は何が欲しいのか :

NAT/PAT/translation/port-forwarding/etcを使用せずに、192.168.1.0/24ネットワーク(コンピューターなど)にipを持つコンテナーが必要です...

問題

これを行うとき:

network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet

コンテナに目的のIPを提供できますが、butdocker(br-[a-z0-9]+)によって作成されたブリッジはIP 192.168.1.1になります、これがルーターです。

解決

1. Dockerネットワークのセットアップ

DefaultGatewayIPv4パラメーターを使用します。

docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" homenet

デフォルトでは、Dockerはブリッジインターフェース(br-[a-z0-9]+)に最初のIPを与えますが、これは別のマシンによって既に取得されている場合があります。解決策は、--gatewayパラメーターを使用して、任意のIP(利用可能な)を割り当てるようにdockerに指示することです。

docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" --gateway=192.168.1.200 homenet

前のコマンドに-o com.docker.network.bridge.name=br-home-netを追加することにより、ブリッジ名を指定できます。

2.橋を架けろ!

これで、Dockerによって作成されたブリッジ(br-[a-z0-9]+)ができました。物理インターフェースにブリッジする必要があります(私の場合はNICが必要なので、そのためにeth1を使用しています)。

brctl addif br-home-net eth1

3.ブリッジIPを削除します

IPアドレスは必要ないので、ブリッジからIPアドレスを削除できます。

ip a del 192.168.1.200/24 dev br-home-net

IP 192.168.1.200は、使用しないため削除するため、複数のdocker Hostでブリッジとして使用できます。

19
Jérôme Pin

Dockerは、MacvlanおよびIPvlanネットワークドライバーをサポートするようになりました。両方のネットワークドライバーのDockerドキュメントは、 here にあります。

両方のドライバーを使用して、目的のシナリオを実装できます(ブリッジモードで仮想マシンのように動作するようにコンテナーを構成します)。

  • Macvlan:単一の物理ネットワークインターフェース(マスターデバイス)が、それぞれが独自のMACアドレスを持つ任意の数のスレーブデバイスを持つことができます。

    Linuxカーネルv3.9–3.19または4.0+が必要です。

  • IPvlan:マスターデバイス用に、同じMACアドレスを共有する任意の数のスレーブデバイスを作成できます。

    Linuxカーネルv4.2 +が必要です(以前のカーネルのサポートは存在しますが、バグがあります)。

    詳細については、 kernel.org IPVLAN Driver HOWTO を参照してください。

コンテナの接続性は、スレーブデバイスの1つを、構成するコンテナのネットワーク名前空間に配置することにより実現されます。マスターデバイスは、ホストオペレーティングシステム(既定の名前空間)に残ります。

経験則として、外部スイッチ/ルーターに接続されているLinuxホストにポートごとに1つのMACのみを許可するポリシーが構成されている場合は、IPvlanドライバーを使用する必要があります。これは、VMWare ESXi環境でよく見られます!

覚えておくべきもう1つの重要なこと(MacvlanおよびIPvlan):マスターデバイスとの間のトラフィックは、スレーブデバイスとの間で送受信できません。マスターからスレーブへの通信を有効にする必要がある場合は、「IPVLAN – The begin」の「ホストとの通信(default-ns)」セクションを参照してください。 IPvlanの著者の1人(Mahesh Bandewar)が発行した論文。

6

公式のDockerドライバーを使用:

Docker v1.12.0-rc2 の時点で、新しいMACVLANドライバーが公式のDockerリリースで利用可能になりました。

  • MacVlanドライバーは実験段階にありません #23524

これらの新しいドライバーは、 使用者の使用例とともに著者によって文書化されています です。

一日の終わりには、同様の機能を提供し、セットアップが簡単になり、バグやその他の癖が少なくなります。

Dockerホスト上のコンテナを見る:

新しい公式macvlanドライバーの唯一の注意点は、Dockerホストマシンが自身のコンテナーを表示/通信できないことです。あなたの特定の状況に応じて、どちらが望ましいか望ましくないかもしれません。

この問題は、1つ以上のNICがDockerホストマシン上にあり、両方のNICがLANに接続されている場合。A)Dockerホストの1つを専用にすることができます2 nicsはdocker専用です。ホストの残りのNICを使用してLANにアクセスします。

または、B)2番目のNICを介してアクセスする必要があるコンテナのみに特定のルートを追加します。例えば:

Sudo route add -Host $container_ip gw $lan_router_ip $if_device_nic2

方法A)は、Dockerホストからすべてのコンテナーにアクセスする必要があり、複数のハードワイヤードリンクがある場合に便利です。

Wherasの方法B)は、Dockerホストからいくつかの特定のコンテナーへのアクセスのみが必要な場合に便利です。または、2番目のNICがWi-Fiカードであり、すべてのLANトラフィックの処理が非常に遅い場合(ラップトップコンピュータなど)。

インストール:

プレリリースが表示されない場合-rc2 ubuntu 16.04の候補で、この行を一時的に/etc/apt/sources.listに追加または変更して次のように言います。

deb https://apt.dockerproject.org/repo ubuntu-xenial testing

main(安定版リリース)の代わりに。

4
Dreamcat4

このソリューションはもうお勧めしません。そのため、削除されました。 ブリッジドライバとbrctrlを使用 でした。

現在、より良い公式ドライバーがあります。このページの他の回答を参照してください: https://stackoverflow.com/a/36470828/28751

3
Dreamcat4

Macvlanの使用例を次に示します。 http://10.0.2.1/ でWebサーバーを起動します。

これらのコマンドとDocker Composeファイルは、QNAPおよびQNAPのContainer Stationで機能します。 QNAPのネットワークインターフェイスはqvs0であることに注意してください。

コマンド:

ブログ投稿「 Docker macvlanネットワークを使用[1][2] Lars Kellogg-Stedmanがコマンドの意味を説明しています。

docker network create -d macvlan -o parent=qvs0 --subnet 10.0.0.0/8 --gateway 10.0.0.1 --ip-range 10.0.2.0/24 --aux-address "Host=10.0.2.254" macvlan0
ip link del macvlan0-shim link qvs0 type macvlan mode bridge
ip link add macvlan0-shim link qvs0 type macvlan mode bridge
ip addr add 10.0.2.254/32 dev macvlan0-shim
ip link set macvlan0-shim up
ip route add 10.0.2.0/24 dev macvlan0-shim

docker run --network="macvlan0" --ip=10.0.2.1 -p 80:80 nginx

Docker Compose

バージョン3はgatewayip_rangeaux_addressなどの他のネットワーク構成をサポートしないため、バージョン2を使用します。

version: "2.3"

services:
    HTTPd:
        image: nginx:latest
        ports:
            - "80:80/tcp"
            - "80:80/udp"
        networks:
            macvlan0:
                ipv4_address: "10.0.2.1"

networks:
    macvlan0:
        driver: macvlan
        driver_opts:
            parent: qvs0
        ipam:
            config:
                - subnet: "10.0.0.0/8"
                  gateway: "10.0.0.1"
                  ip_range: "10.0.2.0/24"
                  aux_address: "Host=10.0.2.254"
0
XP1