私の名前空間が検出されないのはなぜですか?

私の名前空間が検出されないのはなぜですか?

家で始めてみました。sudo su -

ip netns exec 5bd337503b01 ip addr show
Cannot open network namespace "5bd337503b01": No such file or directory

パスワード表示

/var/run/docker/netns

なぜ?

ベストアンサー1

注:/var/runこれはシンボリックリンクなので、/run以下に書かれたものは重要ではありません。 Dockerと/var/run/runip netns

ip netnsプライベート/run/netnsディレクトリにネットワークネームスペースをインストールします。 Dockerは他のプライベートディレクトリを使用するので、/var/run/docker/netnsDockerip netnsについて何も知らず、その逆も同様です。これら2つのツールは、ユーザーが提供した擬似ファイルで動作するようには設計されておらず、これらの擬似ファイルを使用可能にすることもできません。ユーザーが提供した名前やハッシュは、これらのマウントポイントと直接混在してはいけません。これは両方のツールの実装の詳細であり、公開APIと見なすべきではありません。それにもかかわらず...

/run/netns/FOOできることは、マウントされたネットワーク名前空間を「コピー」(バインドマウントを使用)して、その名前空間も表示されるようにすることです。ip netns exec FOO ...ip -n FOO ...

一つは数:

  • サブコマンドを含む最新ip netnsバージョンattach

    実行中のコンテナのPIDを参照として使用して、PIDの名前空間を別の場所にマウントします(経由で利用可能/proc/PID/ns/net)。以下は、単にネットワークネームスペースマウントポイント名とは異なる方法でコンテナ名を再利用します。これはdocker inspect正しいJSONフィルタを使用してプログラムで実行できます。

    ip netns attach containername $(docker inspect --format '{{.State.Pid}}' containername)
    

    コンテナ名の代わりにDockerの名前付きネットワーク名前空間と同じ名前を使用するには(少なくとも現在)、.NetworkSettings.SandboxKeyその値を使用できます/var/run/docker/XXXXXXXXXXXX

    ip netns attach "$(basename "$(docker inspect --format '{{.NetworkSettings.SandboxKey}}' containername)")" $(docker inspect --format '{{.State.Pid}}' containername)
    
  • 以前のバージョンip netnsはサポートされていません。attach

    1回以上作成ネットワーク正しい設定を完了するための名前空間(たとえば、/run/netns共有伝播によるマウントポイントの作成):

    [ ! -e /run/netns ] && { ip netns add dummy; ip netns delete dummy; } # for correct initial setup
    

    空のファイルを作成し、取得したPIDからマウントネームスペースを参照しますdocker inspect

    touch /run/netns/containername
    mount --bind /proc/$(docker inspect --format '{{.State.Pid}}' containername)/ns/net /run/netns/containername
    

    または、コンテナ名の代わりにDockerネットワーク名前空間名を再利用するバリアントを使用します。

    touch /run/netns/$(basename "$(docker inspect --format '{{.NetworkSettings.SandboxKey}}' containername)")
    mount --bind /proc/$(docker inspect --format '{{.State.Pid}}' containername)/ns/net /run/netns/$(basename "$(docker inspect --format '{{.NetworkSettings.SandboxKey}}' containername)")
    
  • または、プロセスPIDを使用せずに直接使用するか、docker inspect

    たとえば、現在表示されているすべてのDockerインストールネットワークネームスペースを次のユーザーが使用できるようにするには、次の手順を実行しますip netns

    [ ! -e /run/netns ] && { ip netns add dummy; ip netns delete dummy; } # for correct initial setup
    
    for i in /var/run/docker/netns/*; do
        netnsname="$(basename "$i")"
        touch /run/netns/"$netnsname"
        mount --bind "$i" /run/netns/"$netnsname"
    done
    

Dockerが提供するこれらの名前空間は、Dockerおよび(使用)の参照が削除されるまでip netns消えません。 Dockerが引き続き使用しているため、使用は適切にクリーンアップされ、このネットワーク名前空間には影響しません。マウントポイント参照を削除し、すべての参照が削除されるまで何も起こりません。ip netnsip netns delete somenetnsnameip netns delete somenetnsname

おすすめ記事