Slide 1

Slide 1 text

Copyright ⓒ All Right Reserved by Buzzvil Container Ad-Engine Bale 2021.11.24

Slide 2

Slide 2 text

Copyright ⓒ All Right Reserved by Buzzvil Intro 어떻게 Docker를 쓰는가?

Slide 3

Slide 3 text

Copyright ⓒ All Right Reserved by Buzzvil Intro 이거 VM이랑 다른게뭐지? 뭔가 마법같은게 있으려니..

Slide 4

Slide 4 text

Copyright ⓒ All Right Reserved by Buzzvil Intro Scratch Image 내가 생각한 Docker.. 그럼 scratch로 어떻게 서비스를 실행하지..?

Slide 5

Slide 5 text

Copyright ⓒ All Right Reserved by Buzzvil Intro “.. more like chroot on steroid ..” chroot

Slide 6

Slide 6 text

Copyright ⓒ All Right Reserved by Buzzvil Virtual Machine vs Container Virtual machine https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/about/containers-vs-vm OS: kernel을 포함한 완전한 운영체제 상태로 실행됨, Container 대비 더 많은 리소스가 필요 격리: host OS와 완벽하게 격리 Image Size: GB 단위

Slide 7

Slide 7 text

Copyright ⓒ All Right Reserved by Buzzvil 격리: Host OS의 kernel을 사용하여 격리된 프로세스로 실행 Virtual Machine vs Container Container https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/about/containers-vs-vm OS: Host OS와 동일 Size: MB 단위

Slide 8

Slide 8 text

Copyright ⓒ All Right Reserved by Buzzvil Container의 종류 System Container vs Application Container https://docs.jelastic.com/what-are-system-containers/ System Container(=OS Container) ● 제안된지 오래되었음 ● Host OS 수준에서 가상화 ● Application Container를 실행하는 것도 가능함 ● stateful Application Container ● 비교적 최근에 제안됨 ● stateless ● 격리된 단일 process 실행이 목적

Slide 9

Slide 9 text

Copyright ⓒ All Right Reserved by Buzzvil Container의 종류 System Container: LXC(LinuX Container) 필요에 따라 Application Container 처럼 사용 가능 https://www.section.io/engineering-education/lxc-vs-docker-what-is-the-difference-and-why-docker-is-better/ OS 수준의 가상화 원조 chroot on steroid 초기 Docker는 LXC를 사용

Slide 10

Slide 10 text

Copyright ⓒ All Right Reserved by Buzzvil Container의 종류 System Container: LXD LXD Containers - Ubuntu Submit 2015 Ubuntu를 소유한 Canonical사에서 주도 자칭 next generation system container LXC를 wrapping하여 더 나은 사용자 경험 제공

Slide 11

Slide 11 text

Copyright ⓒ All Right Reserved by Buzzvil Container의 종류 Application Container: Docker https://www.docker.com/resources/what-container Application Container의 특징을 모두 가짐 Host OS 공유, 단일 프로세스 실행, stateless 등 지금까지, 이전의 오해들을 돌아보면.. Docker image는 OS를 가진다? -> 이미지에 포함시킬 순 있으나, host kernel을 사용 뭔가 마법같은 일들이 VM 처럼 돌게 해준다? -> Application이 host OS위에서 격리된 프로세스로 동작 격리된 프로세스? -> ??? Scratch image로 어떻게 binary를 실행하는지? -> ???

Slide 12

Slide 12 text

Copyright ⓒ All Right Reserved by Buzzvil Docker 그래서.. 이게 어떻게 가능한가? https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/about/containers-vs-vm

Slide 13

Slide 13 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 chroot 특정 process의 root directory를 특정 path로 변경한다 https://man7.org/linux/man-pages/man2/chroot.2.html#top_of_page

Slide 14

Slide 14 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 chroot https://www.44bits.io/ko/post/change-root-directory-by-using-chroot Dir 구성 ➜ chroot new_root /bin/bash chroot: failed to run command ‘/bin/bash’: No such file or directory 실행 파일이 새로운 root dir 아래에 있어야 한다.. ➜ cp /bin/bash new_root/bin/ ➜ chroot new_root /bin/bash chroot: failed to run command ‘/bin/bash’: No such file or directory bash가 다른 의존성이 있어서 같이 옮겨 줘야된다고 한다... ➜ ldd /bin/bash libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000fffdb7080000).. (생략) ➜ ldd 결과로 나온 파일들을 new_root 아래로 copy.. (생략) ➜ chroot new_root /bin/bash ➜ bash-4.2# pwd / ➜ bash-4.2# cd .. ➜ bash-4.2# pwd /

Slide 15

Slide 15 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 chroot https://www.44bits.io/ko/post/change-root-directory-by-using-chroot ➜ chroot new_root ./hello_world.sh chroot: failed to run command ‘./hello_world.sh’: No such file or directory Shell script 실행해보기 해본 시도들 ➜ root chroot new_root ./hello_world hello, world! go로 빌드한 binary 실행해보기 ➜ chroot new_root bin/bash hello_world.sh hello world! 아까 넣어둔 bash로 실행해보기 Kernel 수준에서 실행

Slide 16

Slide 16 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 namespace https://man7.org/linux/man-pages/man7/namespaces.7.html 요약: 커널 수준에서 리소스의 집합을 분리하여, 프로세스 그룹 별로 인지할 수 있는 리소스 및 정보 집합을 나누는 것

Slide 17

Slide 17 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 namespace https://man7.org/linux/man-pages/man7/namespaces.7.html ● Cgroup: cgroup의 집합 (cgroup은 뒤에서 다시..) ● IPC: ipc object의 집합, 프로세스간 통신 격리 ● Network: network device, ip, port, rounting table, filtering table 등의 network resource ● Mount: chroot와 유사, 기능은 유사하지만 chroot보다 더 보안에 강함 ● PID: process ID ● Time: time ● User: user namespace 격리 ● UTS: host name, NIS domain name

Slide 18

Slide 18 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 cgroup https://man7.org/linux/man-pages/man7/namespaces.7.html 요약: cpu, memory, network 대역폭, disk i/o 등을 그룹단위로 제어

Slide 19

Slide 19 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 Linux capabilities https://man7.org/linux/man-pages/man7/namespaces.7.html 이전에는 privileged / unprivileged process로만 나누었지만, capabilites를 사용하면 root 권한을 세분화 하여 적용 가능

Slide 20

Slide 20 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 Union Mount https://man7.org/linux/man-pages/man7/namespaces.7.html

Slide 21

Slide 21 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 Union Mount https://markruler.github.io/posts/container/container-study-guide/ 위에서 보면 합쳐진 것 같더라..

Slide 22

Slide 22 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 Union Mount Layer 1 Layer 2 Layer 3 Layer 4 Layer 5 Layer 6 Layer 7 각 peration(모든 operation은 아니다) 마다 image layer를 생성 https://eqfwcev123.github.io/2020/01/30/%EB%8F%84%EC%BB%A4/docker-image-layer/

Slide 23

Slide 23 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 Union Mount https://markruler.github.io/posts/container/container-study-guide/ step에서 변경사항이 없는 경우 caching된 layer를 그대로 사용 -> build 시간 단축

Slide 24

Slide 24 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 Union Mount https://markruler.github.io/posts/container/container-study-guide/ 일반적인 image layer는 read only, 각 레이어는 다른 container와 공유해서 사용 r/w layer(휘발성)는 비어있음, 하지만 container에 write를 하게 되는 경우에는 CoW(Copy On Write) 원칙을 따름.

Slide 25

Slide 25 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 Union Mount https://markruler.github.io/posts/container/container-study-guide/ 각 컨테이너는 r/w layer를 가지고 read only iamge layer에 대해서 공유하는 형태 100mb의 이미지를 사용하는 여러 컨테이너를 띄워도 100mb + @(각 컨테이너의 r/w layer 크기)를 사용

Slide 26

Slide 26 text

Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술 결론은.. https://markruler.github.io/posts/container/container-study-guide/ docker는 VM이랑 전혀 다르고 Kernel 기능의 집합이 지탱한다..

Slide 27

Slide 27 text

Copyright ⓒ All Right Reserved by Buzzvil TMI Docker performance https://dominoweb.draco.res.ibm.com/reports/rc25482.pdf

Slide 28

Slide 28 text

Copyright ⓒ All Right Reserved by Buzzvil TMI Containerd performance https://www.tutorialworks.com/difference-docker-containerd-runc-crio-oci/ containerd를 쓰는게 더 좋다고 한다

Slide 29

Slide 29 text

Copyright ⓒ All Right Reserved by Buzzvil TMI Container 생태계 https://www.tutorialworks.com/difference-docker-containerd-runc-crio-oci/ docker와 k8s는 독립적으로 성장 k8s에서 CRI(Container Runtime Interface)를 만들게됨 implements

Slide 30

Slide 30 text

Copyright ⓒ All Right Reserved by Buzzvil TMI Container 생태계 https://www.tutorialworks.com/difference-docker-containerd-runc-crio-oci/ 컨테이너 이미지, 런타임에 대한 표준 인터페이스 implements runc라는 구현체를 만듬, docker와 CRI-O 모두 runC를 사용

Slide 31

Slide 31 text

Copyright ⓒ All Right Reserved by Buzzvil Thank you