개요
도커 Docs에서 컨테이너에 대한 설명과 더불어 변천사를 설명하는 블로그 글을 보았다.(https://medium.com/@saschagrunert/demystifying-containers-part-i-kernel-space-2c53d6979504)
현재 사용되는 도커 컨테이너는 리눅스의 네임스페이스와 cgroup으로 구현되었다고 한다.
도커 컨테이너의 네임스페이스를 외부(host)에서수정하면 실제 도커 컨테이너에도 반영이 될까?
당시 생각: 도커 컨테이너도 결국 네임스페이스라는 격리된 공간을 활용하는 것에 불과하므로, 해당 공간이 수정되면 그대로 컨테이너에 반영될 거라고 생각했다.
실제로 수행해보면 "도커 컨테이너는 네임스페이스로 이루어졌다"라는 문장을 보다 체감(?)할 수 있을 거 같아 시도해봤다.
1. 테스트용 컨테이너 생성
root@osnie:~# docker run -d --name testbox --rm busybox sleep 3000
c813233b389b3517077dc43560992874e4c88a772e952a1213c6fbaeee459417
root@osnie:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c813233b389b busybox "sleep 3000" 3 seconds ago Up 2 seconds testbox
1. busybox 이미지를 활용하여 명령어를 테스트
2. --rm sleep 3000: 3000초가 지나면 자동으로 컨테이너 삭제(컨테이너를 유지시키기 위한 옵션)
2. 컨테이너 Pid 조회하기
root@osnie:~# docker inspect --format '{{.State.Pid}}' testbox
6037
- inspect의 결과중 State 항목의 Pid를 출력한다.
3. 컨테이너 네임스페이스 조회하기
root@osnie:~# ls -al /proc/6037/ns
total 0
dr-x--x--x 2 root root 0 Apr 7 10:35 .
dr-xr-xr-x 9 root root 0 Apr 7 10:35 ..
lrwxrwxrwx 1 root root 0 Apr 7 10:37 cgroup -> 'cgroup:[4026532397]'
lrwxrwxrwx 1 root root 0 Apr 7 10:37 ipc -> 'ipc:[4026532395]'
lrwxrwxrwx 1 root root 0 Apr 7 10:35 mnt -> 'mnt:[4026532390]'
lrwxrwxrwx 1 root root 0 Apr 7 10:35 net -> 'net:[4026532398]'
lrwxrwxrwx 1 root root 0 Apr 7 10:37 pid -> 'pid:[4026532396]'
lrwxrwxrwx 1 root root 0 Apr 7 10:37 pid_for_children -> 'pid:[4026532396]'
lrwxrwxrwx 1 root root 0 Apr 7 10:37 time -> 'time:[4026531834]'
lrwxrwxrwx 1 root root 0 Apr 7 10:37 time_for_children -> 'time:[4026531834]'
lrwxrwxrwx 1 root root 0 Apr 7 10:37 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Apr 7 10:37 uts -> 'uts:[4026532391]'
프로세스는 자원별 ns(namespace)를 가지고 있고, 어떤 네임스페이스와 매핑되었는지 확인할 수 있다.
UTS 네임스페이스 조작하기
1. 기존의 hostname 확인하기
root@osnie:/home/ubuntu# docker exec -it testbox sh
/ # hostname
c813233b389b
2. 호스트에서 nsenter를 활용해 hostname 수정하기
root@osnie:/home/ubuntu# nsenter -t 6037 -u hostname osnie
3. 확인하기
/ # hostname
osnie
수정사항이 반영되었다. 추가로 네트워크 관련 설정도 시도해보자.
네트워크 네임스페이스 조작하기
1. 기존의 네트워크 확인하기
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 06:56:6f:0c:50:2c brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
2. 네임스페이스에 네트워크 추가하기
root@osnie:~# nsenter -t 6037 -n ip addr add 192.168.50.10/24 dev eth0
3. 변경 확인하기
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 06:56:6f:0c:50:2c brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.50.10/24 scope global eth0
valid_lft forever preferred_lft forever
내용이 추가되었다.
도커 컨테이너의 네임스페이스를 외부(host)에서수정하면 실제 도커 컨테이너에도 반영이 될까?
라는 물음은 그렇다!로 확인되었다.
이 과정에서 실제로 수정한 네임스페이스가 도커 컨테이너에 반영됨을 보고 "도커 컨테이너는 네임스페이스로 이루어졌다" 라는 문장을 조금 더 체감하게 되었다.
참고
https://ko.linux-console.net/?p=14713
https://medium.com/@saschagrunert/demystifying-containers-part-i-kernel-space-2c53d6979504
'알아보자!' 카테고리의 다른 글
| Java String의 hashCode()와 equals()에 대해 알아보기! (3) | 2025.08.11 |
|---|---|
| JAVA 명령어 동작 흐름 알아보기! (JAVA_HOME만 바꿨는데 왜 버전이 바뀔까?) (1) | 2025.07.03 |
| nslookup과 AWS DNS 캐싱에 대한 궁금증 (0) | 2025.03.26 |
| JWT를 이용한 로그아웃 구현 (1) | 2024.02.28 |
| JWT(JSON Web Token) 구성 요소 (0) | 2024.02.24 |