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

Container

Avatar for Buzzvil Buzzvil
November 24, 2021

 Container

By Bale Do

Avatar for Buzzvil

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를 사용