Docker を使用して、ホスト ネットワーク リンクを Docker コンテナーに排他的にバインドすることは可能ですか?
言い換えると、eth1コンテナに (または何でも) 移動して、そのコンテナでのみ使用可能にします。ホストや、ホスト上で実行されている他のコンテナ/仮想マシンなどは、それにアクセスできないようにします。
physLinux コンテナー (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使用することもできます。--privilegednsenterコンテナの外部から構成を実行するために使用します。nsenter -t ${container_pid} -n ip addr ...
これはすべて機能しますが、私が指摘した制限のため、何らかの理由でコンテナー内に物理インターフェイスが必要な場合は、ドライバーを使用することをお勧めします。または、この特定のタスクを簡単にするまたはその他のコンテナー化ツールmacvtapを使用します。lxcsystemd-nspawn


