내 네임스페이스가 감지되지 않는 이유는 무엇입니까?

내 네임스페이스가 감지되지 않는 이유는 무엇입니까?

집에서 시작해서 시도해봤는데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/netnsDocker ip netns에 대해 아무것도 모르고 그 반대의 경우도 마찬가지입니다. 이 두 도구는 사용자가 제공한 의사 파일에서 작동하도록 설계되지 않았으며 이러한 의사 파일을 사용 가능하게 만들지도 않습니다. 사용자가 제공한 이름이나 해시는 이러한 마운트 지점과 직접 혼합되어서는 안 됩니다. 이는 두 도구 모두의 구현 세부 사항이며 공개 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

    한 번 이상 생성회로망올바른 구성을 완료하기 위한 네임스페이스(예: /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

관련 정보