web-dev-qa-db-ja.com

複数のネットワークインターフェイスでコンテナを開始する

1.9では、2つ以上のネットワークインターフェイスでコンテナを直接起動する方法はありますか?

コンテナが「docker network connect」で起動された後にそれを行うことができますが、それはプロセスがすでに実行中であり、新しいものの作成を見逃す可能性があることを意味します。

31
Robert

この質問は、ドッカーと複数のネットワークインターフェースに関する検索を行っているトップです。質問の必須バージョンではありませんが、ここにいくつか情報を残します:

Docker 1.12+では、複数のネットワークインターフェイスをdockerコンテナーに追加できますが、最初にコンテナーを作成してから、コンテナーを開始する前に2番目(およびサブシーケンス)のネットワークNICを接続する必要があります。

$ docker create --network=network1 --name container_name containerimage:latest
$ docker network connect network2 container_name
$ docker start container_name

最初にネットワークを作成する必要があります。

$ docker network create --driver=bridge network1 --subnet=172.19.0.0/24
$ docker network create --driver=bridge network2 --subnet=172.19.1.0/24

また、docker runで--network = Host引数を使用して、dockerhostネットワークインターフェイスをアタッチするコンテナを起動できます。

$ docker run --net=Host containerimage:latest
42
methadata

@gesellixが答えたように、現在は不可能です。

この問題は https://github.com/docker/docker/issues/1775 で見つけることができます

この領域にはいくつかの保留中の改善があります。議論からわかるように、現在のアイデアは、コンテナを作成し(docker createを使用)、ネットワークを接続し(docker network connect)、次に開始します(docker start)。

https://github.com/docker/docker/pull/17796 のコメントで推論を確認できます。

UPD:#17750は閉じられており、1.10で利用可能になります

5
Alex

いいえ、これは不可能です。ドキュメントには、必要なコマンドラインオプション--netが単一のネットワーク名のみを受け入れることも示されています。 http://docs.docker.com/engine/reference/run/#network-settings

また、Docker 1.9はコンテナ内の/etc/hostsファイルを常に更新するため、実行中のプロセスがそのファイルの初期状態に依存できないことにも留意してください。最善の方法は、/etc/hostsファイルを手動で読み取るか、dnsサーバーを照会することにより、プロセスに更新を認識させることです。そうすれば、2番目のネットワークが接続されるときに問題は発生しません。

1
gesellix

誰かがまだこの問題の答えを探していますか?これを行うには2つの解決策があります:最初はここでほぼ完全に詳細なものですが、現在のドッカーリリースで動作します-完全なチュートリアルはここで見つけることができます docker hub forum

解決策2は、すべてを最下層で行うことです。上記のリンクの詳細コメントセクションを含めましたが、これもここにコピーします。DockerはLinuxのネットワーク名前空間も使用しているため、これを岩底レイヤーでも行うことができます。残念ながら、Dockerはこれをユーザーから隠そうとしますが、名前空間はまだ内部に存在しています。それらをip netnsツールで管理するには、次の手順を実行します。

  1. 実行中のコンテナーのプロセスID(pid)を取得します。

$ Sudo docker inspect -f '{{.State.Pid}}' <container name>

<container name>はあなたのlabel:tag名ではなく、コンテナが起動されるとdockerが自動的に割り当てる名前です-docker psコマンドであなたのものを取得し、最後の列(NAME)を探します。

  1. / proc /ファイルシステムから/ var/run/2.1へのシンボリックリンクを作成します。最初に、/ var/run/$ Sudo mkdir -p /var/run/netnsにnetnsディレクトリを作成します

2.2。取得したPIDを使用して、シンボリックリンク$ Sudo ln -sf /proc/<PID>/ns/net /var/run/netns/<YOUR DESIRED NETNS NAME FOR YOU CONTAINER>を作成します

これで、ip netns listを実行すると、コンテナのネットワーク名前空間が表示されます。

これからは、Docker固有のものはありません。vethペアを作成し、それらを起動し、その一端をコンテナに接続するだけで問題ありません:$ Sudo ip link add veth1_container type veth peer name veth1_root

$ Sudo ifconfig veth1_container up

$ Sudo ifconfig veth1_root up

$ Sudo ip link set veth1_container netns <YOUR NETNS NAME>

$ Sudo ip netns exec <YOUR NETNS NAME> ifconfig veth1_container up

最後のコマンドは少し複雑すぎるかもしれませんが、コンテナ内でこのインターフェイスをネイティブに起動することは、権限がないため不可能なようです:)

MACアドレスは、ソリューション1で示したのと同じ方法で変更できます。コンテナにアタッチする前、または後-実際には問題ではなく、異なるコマンドを使用するだけです(上記のアクセス許可の問題を思い出してください)。

役に立てば幸いです。

0
cs.lev