docker 동작원리

BackEnd_Ash.log·2020년 5월 12일
0

docker

목록 보기
4/5

https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90
https://opensource.com/resources/what-docker
https://tech.osci.kr/docker/2018/09/10/45749387/
http://blog.drakejin.me/Docker-araboza-1/

docker 란 무엇인가 ??

왜 그토록 사람들이 docker docker 라고 하는걸까 ??
docker 는 Go언어로 작성된 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이라고 합니다.
무슨말일까......컨테이너 ..?

컨테이너 란??

컨테이너 철로 된 박스 아시죠 ?? 그거라고 생각하시면 되는데요 .
철판으로 만들어져 재사용이 가능한 규격화된 통으로 화물을 옮길때 사용한다고 하네요 ....네... 그렇군요

컨테이너란 어플리케이션이 동작하기 위해서 필요한 요소 ( 실행 파일, 어플리케이션 엔진등 ) 을 패키지화하고 격리 하는 기술을 말합니다.

포장 을 해서 어디다가 격리를 시킨다... ?? 음...
그래서 전체 인프라를 쉽고 빠르게 관리 할 수 있다고 하는데 ...

컨테이너라는 녀석이 철로 된 박스인데 , 어떠한 비슷하거나 같은 물건들이 한 컨테이너에 담는것인데 ,
그래서 컨테이너라 하는걸까 ???

이 필요한 요소라는것들이 비슷한 물건 ?? 같은 목적을 담은 요소라서 컨테이너에 담는걸까?? 라는 생각을 가지면서 더 공부를 했습니다.

https://www.youtube.com/watch?time_continue=87&v=n-JwAM6XF88&feature=emb_logo

매우 이해가 잘되게 설명을 해주셨습니다 .

Container 의 작동 원리

컨테이너는 Cgroup 와 namespace 와 같은 커널 기반의 기술을 이용해서 프로세스를 완벽하게 격리하여 분리된 환경을 만들고 실행하도록 만듭니다.

Cgroup

Cgroup 은 Control Group 의 약자로 , 시스템의 CPU 시간 , 시스템 메모리 , 네트워크 대역폭과 같은 지원을 제한하고 격리 할 수 있는 커널 기능입니다.

" CentOS 7 - Cgroup 내용"

#
/sys/fs/cgroup
# ls -la
합계 0
drwxr-xr-x 13 root root 340  7월  6 23:23 .
drwxr-xr-x  5 root root   0  7월  6 23:23 ..
drwxr-xr-x  5 root root   0  7월  6 23:23 blkio
lrwxrwxrwx  1 root root  11  7월  6 23:23 cpu -> cpu,cpuacct
drwxr-xr-x  5 root root   0  7월  6 23:23 cpu,cpuacct
lrwxrwxrwx  1 root root  11  7월  6 23:23 cpuacct -> cpu,cpuacct
drwxr-xr-x  3 root root   0  7월  6 23:23 cpuset
drwxr-xr-x  5 root root   0  7월  6 23:23 devices
drwxr-xr-x  3 root root   0  7월  6 23:23 freezer
drwxr-xr-x  3 root root   0  7월  6 23:23 hugetlb
drwxr-xr-x  5 root root   0  7월  6 23:23 memory
lrwxrwxrwx  1 root root  16  7월  6 23:23 net_cls -> net_cls,net_prio
drwxr-xr-x  3 root root   0  7월  6 23:23 net_cls,net_prio
lrwxrwxrwx  1 root root  16  7월  6 23:23 net_prio -> net_cls,net_prio
drwxr-xr-x  3 root root   0  7월  6 23:23 perf_event
drwxr-xr-x  3 root root   0  7월  6 23:23 pids
drwxr-xr-x  5 root root   0  7월  6 23:23 systemd

네 모두가 잘 알고있는 centos 입니다.
경로를 보면 cgroup 으로 되어있는데요 .
cgroup 이라는 경로에 많은 시스템 자원을 제한하고 격리를 할 수 있습니다.

Cgroup 으로 인해 device 서비 시스템 자원을 제한할 수 있습니다.

# cd /sys/fs/cgroup/devices
# mkdir shell
# cd shell/
# ls
cgroup.clone_children  cgroup.procs   devices.deny  notify_on_release
cgroup.event_control   devices.allow  devices.list  tasks
# cat tasks
# cat devices.list
a *:* rwm                      " 모든 권한 활성화 "

# cat tasks
#

" 다른 세션 PID: 8403 을 cgroup으로 지정 "
# echo "8403" > tasks  
# cat tasks
8403
# echo "cgroup test \
> Hello Cgroup! \
> end" > /dev/pts/2
#
# echo $$
8403
# w
 15:24:14 up 54 days, 16:00,  4 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      06 7월18 16days  0.04s  0.04s -bash
root     pts/0    192.168.0.83     14:38   14.00s  0.04s  0.02s ssh root@192.168.13.131
root     pts/2    192.168.0.83     15:24    4.00s  0.00s  0.00s w
root     pts/3    192.168.13.131   15:23   14.00s  0.01s  0.01s -bash
# cgroup test Hello Cgroup! end

위와 같이 pid : 8403 세션에 echo 명령으로 넣은 내용이 나오는 것을 보실 수 있습니다.

Cgroup 을 이용해서 시스템 자원을 제한 해보도록 합니다

# echo "a *:* rwm" > devices.deny

pid:8403 세션에 모든 장치에 대해 deny 하는 내용을 선언합니다.

# echo $$
8403
# echo "Dent test" > /dev/pts/2
-bash: /dev/pts/2: 명령을 허용하지 않음
# echo "Dent test" > /dev/pts/2
-bash: /dev/pts/2: 명령을 허용하지 않음

pid : 8403 세션에 대해 모든 장치가 deny 된것을 확인 할 수 있습니다.

프로세스의 장치를 제한하고 격리하는것이 Cgroup 이라는것은 알겠는데요 .
그럼 namespace 는 뭘까 ??
흠.. 무엇일까? ?

namespace

namespace 도 시스템 리소스를 프로세스의 전용 자원처럼 보이게 하고 ,
다른 프로세스와 격리시키는 기능을 한다고 하네요 ..
뭔가 Cgroup 과 하는 역할이 겹쳐보이네요 .

이러한 namespace 에는 총 6가지 namespace 가 있습니다.

Mount namespacaes : 파일시스템의 Mount 를 분할하고 격리합니다.
PID namespacaes : 프로세스를 분할 관리합니다.
Network namespacaes : Network 관련된 정보를 분할 관리합니다.
IPC namespacaes : 프로세스간 통신을 격리합니다.
UTS namespacaes : 독립적인 hostname 할당합니다
USER namespacaes : 독립적인 UID를 할당합니다.

namespace 를 이용하여 각 프로세스를 격리 할 수 있습니다.

# echo $$
6467
# mkdir /imsi
# ls -la /proc/6467/ns/mnt
lrwxrwxrwx 1 root root 0  8월 30 16:48 /proc/6467/ns/mnt -> mnt:[4026531840]

 "신규 Mount Namespace 생성"
# unshare -m /bin/bash  
# echo $$
6523
# mount -t tmpfs tmpfs /imsi
# mount | grep imsi
tmpfs on /imsi type tmpfs (rw,relatime)
# df | grep imsi
tmpfs                     1941000       0   1941000   0% /imsi
# ls -la /proc/6523/ns/mnt
lrwxrwxrwx 1 root root 0  8월 30 16:50 /proc/6523/ns/mnt -> mnt:[4026532457]

" 다른 세션에서 Mount 확인 "
# echo $$
21889
# mount | grep imsi

namespace 를 통해 프로세스가 시스템 자원을 전용으로 사용하는것을 확인 할 수 있습니다.

이처럼 컨테이너는 Cgroup 과 namespace 의 기술을 이용한 프로세스 격리 기술입니다 .

그래서 컨테이너를 이용하여 프로세스별로 각가의 운영하는것과 격리 효과를 할 수 있는것이 컨테이너 입니다. !!

Docker

오키 그래서 docker 는 뭔데 ?
처음에 얘기했던 부분을 다시 보면

docker 는 Go언어로 작성된 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이라고 합니다.

라고 적혀있네요 .
아~~~ 그니깐 Docker 는 컨테이너 기반을 하는 오픈소스 가상화 플랫폼인데 ,
이 컨테이너라는 녀석은 Group 과 namespace 의 기술을 이용한 프로세스 격리 기술입니다.

아하 ~~~

그러니깐 Docker 는 Container 기반인건데 이 컨테이너 는 Group 과 namespace 의 기술을 이용하여 프로세스 격리 기술을 이용하게 될텐데 ,
그 격리를 어디서한다 ?? 가상화 로 하게 된다 ~~~
그 가상화 라는것은 우리 가 사용했었던

OS 위에 게스트 OS 가 각각 존재하는것이 아니라 host 위에 마치 이미지화된 파일 형식처럼 컨테이너로 담아서 격리를 시키는 기술입니다.
^^

profile
꾸준함이란 ... ?

0개의 댓글