Container Virtual machine https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/about/containers-vs-vm OS: kernel을 포함한 완전한 운영체제 상태로 실행됨, Container 대비 더 많은 리소스가 필요 격리: host OS와 완벽하게 격리 Image Size: GB 단위
kernel을 사용하여 격리된 프로세스로 실행 Virtual Machine vs Container Container https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/about/containers-vs-vm OS: Host OS와 동일 Size: MB 단위
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 실행이 목적
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를 사용
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를 실행하는지? -> ???
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 /
Linux capabilities https://man7.org/linux/man-pages/man7/namespaces.7.html 이전에는 privileged / unprivileged process로만 나누었지만, capabilites를 사용하면 root 권한을 세분화 하여 적용 가능
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) 원칙을 따름.
Union Mount https://markruler.github.io/posts/container/container-study-guide/ 각 컨테이너는 r/w layer를 가지고 read only iamge layer에 대해서 공유하는 형태 100mb의 이미지를 사용하는 여러 컨테이너를 띄워도 100mb + @(각 컨테이너의 r/w layer 크기)를 사용
https://www.tutorialworks.com/difference-docker-containerd-runc-crio-oci/ 컨테이너 이미지, 런타임에 대한 표준 인터페이스 implements runc라는 구현체를 만듬, docker와 CRI-O 모두 runC를 사용