ネットワークリンクをDockerコンテナに排他的にバインドする

ネットワークリンクをDockerコンテナに排他的にバインドする

Docker を使用して、ホスト ネットワーク リンクを Docker コンテナーに排他的にバインドすることは可能ですか?

言い換えると、eth1コンテナに (または何でも) 移動して、そのコンテナでのみ使用可能にします。ホストや、ホスト上で実行されている他のコンテナ/仮想マシンなどは、それにアクセスできないようにします。

physLinux コンテナー (LXC) ではこれは簡単です。まさにこれを実行するネットワーク タイプがあります。

物理:によって指定された既存のインターフェースlxc.net.[i].linkがコンテナに割り当てられます。

私はそうではないルーティングについて尋ねるまたはmacvlanを使用するかその他のハック

理想的には、これは標準の Docker コマンドを使用して可能になりますが、私が読んだところによると、Docker のネットワーク実装ではこれがサポートされていないようです。ipコマンドを使用して回避策を講じることができれば、何もないよりはましでしょう。

答え1

これは標準的なネットワークコマンドでは不可能です。これを簡単にする機能は数年前にDockerによって明確に拒否されました(https://github.com/moby/moby/pull/8216)。

もちろん、インターフェースを Docker コンテナのネットワーク名前空間に手動で移動することもできますが、これにはさまざまな問題が伴います。たとえば、コンテナを再起動したり再作成したりするたびに、ネットワークを再設定する必要があります。


コンテナのネットワーク名前空間にインターフェースを追加するには:

  1. コンテナの PID を取得します。

    container_pid=$(docker inspect <container_name_or_id> -f '{{ .State.Pid }}')
    
  2. コンテナの名前空間にインターフェースを割り当てます。

    ip link set netns ${container_pid} dev ${device}
    

これでほぼ完了です。

インターフェイスを名前空間に追加した後に構成する場合は、次のいずれかを実行する必要があります。

  • 追加の権限でコンテナを実行します。おそらく だけですが、テスト中に--cap-add=NET_ADMIN使用することもできます。--privileged

  • nsenterコンテナの外部から構成を実行するために使用します。

    nsenter -t ${container_pid} -n ip addr ...
    

これはすべて機能しますが、私が指摘した制限のため、何らかの理由でコンテナー内に物理インターフェイスが必要な場合は、ドライバーを使用することをお勧めします。または、この特定のタスクを簡単にするまたはその他のコンテナー化ツールmacvtapを使用します。lxcsystemd-nspawn

関連情報