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 는 Go언어로 작성된 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이라고 합니다.
무슨말일까......컨테이너 ..?
컨테이너 철로 된 박스 아시죠 ?? 그거라고 생각하시면 되는데요 .
철판으로 만들어져 재사용이 가능한 규격화된 통으로 화물을 옮길때 사용한다고 하네요 ....네... 그렇군요
컨테이너란 어플리케이션이 동작하기 위해서 필요한 요소 ( 실행 파일, 어플리케이션 엔진등 ) 을 패키지화하고 격리 하는 기술을 말합니다.
포장 을 해서 어디다가 격리를 시킨다... ?? 음...
그래서 전체 인프라를 쉽고 빠르게 관리 할 수 있다고 하는데 ...
컨테이너라는 녀석이 철로 된 박스인데 , 어떠한 비슷하거나 같은 물건들이 한 컨테이너에 담는것인데 ,
그래서 컨테이너라 하는걸까 ???
이 필요한 요소라는것들이 비슷한 물건 ?? 같은 목적을 담은 요소라서 컨테이너에 담는걸까?? 라는 생각을 가지면서 더 공부를 했습니다.
https://www.youtube.com/watch?time_continue=87&v=n-JwAM6XF88&feature=emb_logo
매우 이해가 잘되게 설명을 해주셨습니다 .
컨테이너는 Cgroup 와 namespace 와 같은 커널 기반의 기술을 이용해서 프로세스를 완벽하게 격리하여 분리된 환경을 만들고 실행하도록 만듭니다.
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 도 시스템 리소스를 프로세스의 전용 자원처럼 보이게 하고 ,
다른 프로세스와 격리시키는 기능을 한다고 하네요 ..
뭔가 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 는 Go언어로 작성된 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이라고 합니다.
라고 적혀있네요 .
아~~~ 그니깐 Docker 는 컨테이너 기반을 하는 오픈소스 가상화 플랫폼인데 ,
이 컨테이너라는 녀석은 Group 과 namespace 의 기술을 이용한 프로세스 격리 기술입니다.
아하 ~~~
그러니깐 Docker 는 Container 기반인건데 이 컨테이너 는 Group 과 namespace 의 기술을 이용하여 프로세스 격리 기술을 이용하게 될텐데 ,
그 격리를 어디서한다 ?? 가상화 로 하게 된다 ~~~
그 가상화 라는것은 우리 가 사용했었던
OS 위에 게스트 OS 가 각각 존재하는것이 아니라 host 위에 마치 이미지화된 파일 형식처럼 컨테이너로 담아서 격리를 시키는 기술입니다.
^^