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
前もって感謝します。
EDIT:このソリューションは今では役に立ちません。バージョン1.12以降、Dockerはmacvlanとipvlanの2つのネットワークドライバーを提供します。 LANネットワークから静的IPを割り当てることができます。 以下の回答 を参照してください。
同じ問題を抱えている人 を探した後、回避策に進みました。
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になります、これがルーターです。
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
を追加することにより、ブリッジ名を指定できます。
これで、Dockerによって作成されたブリッジ(br-[a-z0-9]+
)ができました。物理インターフェースにブリッジする必要があります(私の場合はNICが必要なので、そのためにeth1を使用しています)。
brctl addif br-home-net eth1
IPアドレスは必要ないので、ブリッジからIPアドレスを削除できます。
ip a del 192.168.1.200/24 dev br-home-net
IP 192.168.1.200
は、使用しないため削除するため、複数のdocker Hostでブリッジとして使用できます。
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)が発行した論文。
公式の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
(安定版リリース)の代わりに。
このソリューションはもうお勧めしません。そのため、削除されました。 ブリッジドライバとbrctrlを使用 でした。
現在、より良い公式ドライバーがあります。このページの他の回答を参照してください: https://stackoverflow.com/a/36470828/28751
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
バージョン3はgateway
、ip_range
、aux_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"