Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Container

Buzzvil
November 24, 2021

 Container

By Bale Do

Buzzvil

November 24, 2021
Tweet

More Decks by Buzzvil

Other Decks in Programming

Transcript

  1. Copyright ⓒ All Right Reserved by Buzzvil Intro 이거 VM이랑

    다른게뭐지? 뭔가 마법같은게 있으려니..
  2. Copyright ⓒ All Right Reserved by Buzzvil Intro Scratch Image

    내가 생각한 Docker.. 그럼 scratch로 어떻게 서비스를 실행하지..?
  3. 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 단위
  4. 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 단위
  5. 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 실행이 목적
  6. 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를 사용
  7. Copyright ⓒ All Right Reserved by Buzzvil Container의 종류 System

    Container: LXD LXD Containers - Ubuntu Submit 2015 Ubuntu를 소유한 Canonical사에서 주도 자칭 next generation system container LXC를 wrapping하여 더 나은 사용자 경험 제공
  8. 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를 실행하는지? -> ???
  9. Copyright ⓒ All Right Reserved by Buzzvil Docker 그래서.. 이게

    어떻게 가능한가? https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/about/containers-vs-vm
  10. 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
  11. 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 /
  12. 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 수준에서 실행
  13. Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술

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

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

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

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

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

    Union Mount https://markruler.github.io/posts/container/container-study-guide/ step에서 변경사항이 없는 경우 caching된 layer를 그대로 사용 -> build 시간 단축
  21. 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) 원칙을 따름.
  22. 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 크기)를 사용
  23. Copyright ⓒ All Right Reserved by Buzzvil Docker를 지탱하는 기술

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

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

    https://www.tutorialworks.com/difference-docker-containerd-runc-crio-oci/ containerd를 쓰는게 더 좋다고 한다
  26. 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
  27. Copyright ⓒ All Right Reserved by Buzzvil TMI Container 생태계

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