Dockerを使用してホストネットワークリンクをDockerコンテナに具体的にバインドできますか?
つまり、eth1
そのコンテナでのみ使用できるようにコンテナに移動(または他の方法で)します。ホストやホストで実行されている他のコンテナ/VMなどにアクセスできないはずです。
phys
Linuxコンテナ(LXC)ではこれは簡単で、これを行うネットワークタイプがあります。
物理学:指定された既存のインターフェイスを
lxc.net.[i].link
コンテナに割り当てます。
私はない方向を尋ねるまたはmacvlanを使用するか他のハッカー。
理想的には標準のDockerコマンドを使用してこれが可能ですが、私が読んだ内容によれば、Dockerのネットワーキング実装がそれをサポートしていないことが懸念されます。コマンドを使用して可能な回避策はip
ないよりも優れています。
答え1
これは標準的なネットワークコマンドでは不可能です。数年前、Dockerはこれを簡単にする機能を明示的に拒否しました(https://github.com/moby/moby/pull/8216)。
もちろん、インターフェイスをDockerコンテナのネットワーク名前空間に手動で移動できますが、これは問題が多いです。たとえば、コンテナを再起動または再作成するたびにネットワークを再構成する必要があります。
コンテナのネットワーク名前空間にインターフェイスを追加するには、次の手順に従ってください。
コンテナのPIDを取得します。
container_pid=$(docker inspect <container_name_or_id> -f '{{ .State.Pid }}')
コンテナの名前空間にインターフェイスを割り当てます。
ip link set netns ${container_pid} dev ${device}
あなたは終わりました...ほとんど。
インターフェイスを名前空間に追加した後に設定するには、次のいずれかを実行する必要があります。
追加の権限でコンテナを実行します。おそらくテストにも使用できますが、おそらくそうです
--cap-add=NET_ADMIN
。--privileged
nsenter
コンテナーの外部で構成を実行するには、次のようにします。nsenter -t ${container_pid} -n ip addr ...
これらすべてが動作している間に私が気づいた制限のために、何らかのmacvtap
理由でコンテナの内部に物理インターフェイスが必要な場合は、ドライバを使用します。または、この特定のタスクを簡単にするには、他のコンテナ化ツールをlxc
使用してください。systemd-nspawn