家で始めてみました。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
。/run
ip netns
ip netns
プライベート/run/netns
ディレクトリにネットワークネームスペースをインストールします。 Dockerは他のプライベートディレクトリを使用するので、/var/run/docker/netns
Dockerip 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 netns
ip netns delete somenetnsname
ip netns delete somenetnsname