[Docker 1] Background

Sinaenjuni·2023년 7월 9일
0

Docker

목록 보기
1/4

chroot (Change Root Directory)

root dir을 특정 디렉터리로 변경하는 명령어이다. UNIX 명령과 system call로 존재한다. 예를들어 '/user/code' 디렉터리로 이동한다면, 기본 시스템에서는 '/user/code'로 이동하지만, chroot를 통해 root 디렉터리를 '/temp'로 변경 한 상태에서 똑같이 '/user/code'로 이동한다면 chroot가 변경된 스세템에서는 '/temp/user/code'로 이동한다.

위와 같은 특성을 이용해 시스템 보안을 구성하거나 동일한 프로그램을 설치하는 경우에 응용딜 수 있다.

Isolation (격리)

시스템의 한정된 자원을 효과적으로 분배하여 가용성을 높일 수 있다. 현대의 운영체제는 프로세스에게 독립적인 공간을 할당한다. 이는 프로세스의 동작에 필요한 독립적인 공간을 할당받기 때문에 공격이나 다른 시스템의 동작으로 인한 예상치 못한 오류를 방지할 수 있다. 하지만 외부와 통신을 통해 데이터를 주고 받아야 하기 때문에 통신 비용이 증가하는 단점을 가지고 있다.

특히 여러 프로세스와 협업해야하는 DBMS나 server system같은 경우에 한 시스템의 디렉터리나 포트를 독점해서 사용하기 때문에 충돌의 가능성이 있다.

Name space

mount: 디렉터리 관련된 부분
UST: 유닉스 시분할 시스템
IPC: 
network
PID
user
cgroup: group 별로 가상화된 공간을 만들고 자원을 제약할 수 있는 기능을 제공

unshare

고유의 공간을 만들고 그 안에서 프로그램을 실행시킨다.

unshare -pf --mount-proc /bin/bash

-p --pid: 프로세스 아이디를 호스트 OS와 격리시키는 옵션이다.
-f --fork: 자식 프로세스를 만들어서 관리하는 옵션이다.
-n
--mount-proc: PCB을 고유한 공간에 만들어서 관리한다.

process 격리 예시

sin@Ubuntu1804:~$ sudo unshare -pf --mount-proc /bin/bash 
root@Ubuntu1804:~# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   57 pts/0    00:00:00 ps
root@Ubuntu1804:~# 

network 격리 예시

sin@Ubuntu1804:~$ nc -l 5000 > nc_host_output.txt &
[1] 5780
sin@Ubuntu1804:~$ ss -nlpt
State  Recv-Q  Send-Q     Local Address:Port     Peer Address:Port                                 
LISTEN 0       1                0.0.0.0:5000          0.0.0.0:*      users:(("nc",pid=5780,fd=3))  
LISTEN 0       128        127.0.0.53%lo:53            0.0.0.0:*                                    
LISTEN 0       128              0.0.0.0:22            0.0.0.0:*                                    
LISTEN 0       5              127.0.0.1:631           0.0.0.0:*                                    
LISTEN 0       128                 [::]:22               [::]:*                                    
LISTEN 0       5                  [::1]:631              [::]:*                                    
sin@Ubuntu1804:~$ 
sin@Ubuntu1804:~$ sudo unshare -n /bin/bash
root@Ubuntu1804:~# ss -nlpt
State      Recv-Q       Send-Q              Local Address:Port             Peer Address:Port       
root@Ubuntu1804:~# 

host에서 리스닝 중인 5000번 포트에 대한 내용이 unshare로 격리된 공간에서 나타나지 않는다.

lssn

Namespace의 목록을 출력한다.

root@Ubuntu1804:~# ps
  PID TTY          TIME CMD
 6369 pts/0    00:00:00 sudo
 6370 pts/0    00:00:00 bash
 6718 pts/0    00:00:00 ps
sin@Ubuntu1804:~$ sudo lsns
[sudo] sin의 암호: 
        NS TYPE   NPROCS   PID USER             COMMAND
4026531835 cgroup    261     1 root             /sbin/init
4026531836 pid       261     1 root             /sbin/init
4026531837 user      261     1 root             /sbin/init
4026531838 uts       261     1 root             /sbin/init
4026531839 ipc       261     1 root             /sbin/init
4026531840 mnt       250     1 root             /sbin/init
4026531861 mnt         1    43 root             kdevtmpfs
4026531898 net       259     1 root             /sbin/init
4026532098 mnt         1   525 root             /lib/systemd/systemd-udevd
4026532134 mnt         1   774 systemd-timesync /lib/systemd/systemd-timesyncd
4026532156 mnt         1   832 systemd-network  /lib/systemd/systemd-networkd
4026532157 mnt         1   897 systemd-resolve  /lib/systemd/systemd-resolved
4026532158 mnt         1  1015 root             /usr/sbin/ModemManager --filter
4026532160 mnt         1  1175 root             /usr/sbin/NetworkManager --no-d
4026532161 mnt         1  3678 root             /usr/lib/fwupd/fwupd
4026532163 net         1  6370 root             /bin/bash
4026532221 net         1  2305 rtkit            /usr/lib/rtkit/rtkit-daemon
4026532275 mnt         1  2305 rtkit            /usr/lib/rtkit/rtkit-daemon
4026532332 mnt         1  2392 root             /usr/lib/aarch64-linux-gnu/bolt
4026532333 mnt         1  2516 colord           /usr/lib/colord/colord
sin@Ubuntu1804:~$ 

위에 격리된 bash의 프로세스 아이디 6370이 lsns 명령을 통해 확인할 수 있다.

Virtualization

Full virtualization(Hypervisor) 사용

소프트웨어로 가상화된 하드웨어를 통해 완전히 격리된 공간을 제공한다. 때문에 보안이나 호환성에 관련된 문제를 대부분 해결된다. 하지만 독점적인 자원 점유로 인해 낮은 성능은 물론 Host OS와 Guest OS간의 자원 공유가 어렵고 효율성이 떨어진다(오버헤드 문제).

lightweight container

단지 격리가 목적이라면 굳이 VM을 쓸 필요가 없다. Nativa application의 내부를 추상화 했으므로, 사실상 겉으로는 Navive application과 동일하기 때문에 오버헤드가 적다. Host OS 입장에서는 단지 격리 개념만 추가된 프로세스 임로 공유 자원을 사용할 수도 있고 사용하지 않을 수도 있다.

0개의 댓글

관련 채용 정보