nsenter에서 Linux 네임 스페이스를 터치합니다.

6219 단어 도커리눅스

네임스페이스 나열


lsns 에서 네임스페이스 목록을 볼 수 있습니다. 컨테이너에서 bash 를 실행하는 컨테이너를 만든 상태에서 lsns 를 실행한 결과가 아래와 같습니다. 여러 TYPE의 네임 스페이스가 만들어 졌음을 알 수 있습니다.
# lsns -o NS,TYPE,PATH,NPROCS,PID,PPID,COMMAND,UID,USER
        NS TYPE   PATH               NPROCS   PID  PPID COMMAND                       UID USER
4026531835 cgroup /proc/1/ns/cgroup     126     1     0 /sbin/init                      0 root
4026531836 pid    /proc/1/ns/pid        124     1     0 /sbin/init                      0 root
4026531837 user   /proc/1/ns/user       126     1     0 /sbin/init                      0 root
4026531838 uts    /proc/1/ns/uts        124     1     0 /sbin/init                      0 root
4026531839 ipc    /proc/1/ns/ipc        124     1     0 /sbin/init                      0 root
4026531840 mnt    /proc/1/ns/mnt        120     1     0 /sbin/init                      0 root
4026531861 mnt    /proc/19/ns/mnt         1    19     2 kdevtmpfs                       0 root
4026531993 net    /proc/1/ns/net        124     1     0 /sbin/init                      0 root
4026532157 mnt    /proc/446/ns/mnt        1   446     1 /lib/systemd/systemd-udevd      0 root
4026532167 mnt    /proc/490/ns/mnt        1   490     1 /lib/systemd/systemd-networkd 100 systemd-network
4026532168 mnt    /proc/518/ns/mnt        1   518     1 /lib/systemd/systemd-resolved 101 systemd-resolve
4026532193 mnt    /proc/27142/ns/mnt      2 27142 27104 bash                            0 root
4026532194 uts    /proc/27142/ns/uts      2 27142 27104 bash                            0 root
4026532195 ipc    /proc/27142/ns/ipc      2 27142 27104 bash                            0 root
4026532196 pid    /proc/27142/ns/pid      2 27142 27104 bash                            0 root
4026532198 net    /proc/27142/ns/net      2 27142 27104 bash                            0 root

컨테이너 내에서 실행 중인 프로세스의 PID(이 예에서는 27142)가 lsns와 일치함을 알 수 있습니다.
# docker ps
CONTAINER ID   IMAGE               COMMAND   CREATED          STATUS          PORTS     NAMES
ef0425afad12   nicolaka/netshoot   "bash"    54 minutes ago   Up 54 minutes             vigilant_hopper
# docker inspect --format {{.State.Pid}} ef0425afad12
27142

네임스페이스로 들어가기


nsenter 커멘드를 사용하면(자) namespace 안에 들어가 커멘드를 실행할 수 있어 편리합니다. 예를 들어, 컨테이너 내에는 netstat 명령이 들어 있지 않지만, 실행하고 싶을 때는 이하와 같이, --target PID 로 대상 프로세스를 지정합니다.network namespace 에 들어가는 경우는 --net 지정합니다.
# nsenter --target 27142 --net netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 172.17.0.2:53400        172.217.175.238:80      TIME_WAIT
--mount를 지정하면 mount namespace가됩니다. --all 로 모든 타입의 namespace 에 들어갑니다.
# nsenter --target 27142 --all cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.13.2
PRETTY_NAME="Alpine Linux v3.13"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"

네트워크 계층 구조 모델 및 네임 스페이스



네임 스페이스의 영향을받는 것


netstat 명령은 namespace 에 의해 보이는 범위가 바뀝니다. 예를 들어, 컨테이너 내에서 curl http://google.com/ 를 실행한 직후의 상태입니다.
# nsenter --target 27142 --all netstat -ant | grep 80
tcp        0      0 172.17.0.2:34148        216.58.197.206:80       TIME_WAIT

# netstat -ant | grep 80
#   何も表示されない
arp 명령도 마찬가지입니다.
# nsenter --target 27142 --all arp
? (172.17.0.1) at 02:42:b0:b9:9b:50 [ether]  on eth0
# arp
Address                  HWtype  HWaddress           Flags Mask            Iface
172.17.0.2               ether   02:42:ac:11:00:02   C                     docker0
10.0.2.3                 ether   52:54:00:12:35:03   C                     eth0
_gateway                 ether   52:54:00:12:35:02   C                     eth0

네임 스페이스의 영향을받지 않는 것



반면에 tcpdump 명령은 네임스페이스의 영향을 받지 않습니다. 컨테이너내에서 curl http://google.com/ 를 실행했을 때의 결과입니다. tcpdump 는 보다 낮은 레이어(데이터 링크 레이어 L2)의 정보를 취득하기 때문입니다.
# コンテナ内部で tcpdump を実行した結果
13:19:41.076077 IP a8c89c57d8ef.40442 > nrt12s36-in-f14.1e100.net.80: Flags [P.], seq 0:74, ack 1, win 64240, length 74: HTTP: GET / HTTP/1.1

# コンテナ外部で tcpdump を実行した結果
13:19:41.076207 IP vagrant.40442 > nrt12s36-in-f14.1e100.net.http: Flags [P.], seq 0:74, ack 1, win 64240, length 74: HTTP: GET / HTTP/1.1

컨테이너 외부에서 iptraf-ng를 사용하면 컨테이너 내에서 긴 TCP 연결을 나열할 수 있어 편리합니다.


참고



htps : // 코 m / 미나미 조요 / ms / 9d d59109 9 1000
htps : // 기주 b. 코 m / 니코 / 네 t 쇼오 t

좋은 웹페이지 즐겨찾기