하이퍼바이저 기반 가상화
는 하드웨어에서 전체 컴퓨터를 재생성하며, 이는 다시 전체 OS를 실행한다는 것을 뜻합니다. 이는 전혀 가상화가 없는 것보다는 효율적이지만, 실행하고자 하는 애플리케이션마다 불필요한 코드와 서비스를 여전히 복제하기 때문에 비효율적입니다.
컨테이너 기반 가상화
는 대안적인 접근 방법을 사용합니다. 이는 애플리케이션 및 해당 에플리케이션이 의존하는 소프트웨어 라이브러리 및 환경 변수 등만을 실행하면서 기반 OS 커널을 공유합니다. 따라서 컨테이너는 보다 작아지며 배포 속도가 빨라집니다.
하나의 Host OS에서 돌아간다면 충분히 한 컨테이너가 다른 컨테이너에 간섭할 수 있는 위험이 있지 않을까요?
- 기본적으로 각 APP들은 Cgroup(control groups)과 네임스페이스와 독립된 네트워크로 인해 “Wall”이 존재합니다. 도커 데몬은 이렇게 각각의 컨테이너가 정해진 논리 공간에 쉽게 배정될 수 있게 도와주는 역할을 수행해줍니다.
Docker in Docker(DinD)
방식 : 도커 내에서 도커 데몬을 실행하는 방식입니다.--priviledged
를 사용해 추가 권한을 부여하는 명령이 포함됩니다. 하지만 이로 인해 컨테이너가 호스트 전체 권한을 갖는 치명적인 결함을 가집니다.Docker Out of Docker(DooD)
방식 : 내부에 새로운 도커 컨테이너를 만들지 않고 기존의 사용하던 컨테이너를 추가로 생성합니다./var/run/docker.sock
파일은 도커 데몬과 통신할 수 있는 소켓 파일인데 해당 파일을 컨테이너와 공유하면 이 파일을 통해 도커 명령을 수행할 수 있게 됩니다. 해당 방식은 안전한가 생각이 들 수 있지만 사실은 아닙니다. 왜냐하면 공격하는 방향이 바뀔 뿐 막강한 권한을 갖는 것은 동일합니다.결론적으로 DinD는 컨테이너 안에 새로운 격리된 환경을 만들고 DooD는 컨테이너가 자신이 속한 도커 서비스를 다룰 수 있도록 합니다. 따라서 완전히 별도의 가상환경을 만들 때는 DinD, 가상화된 환경을 다같이 다루고 싶다면 DooD를 선택하시면 됩니다.
Docker 데몬(Docker Daemon)은 Docker 컨테이너를 관리하고 실행하는 백그라운드 서비스입니다. Docker 데몬은 호스트 운영체제에서 실행되며, 사용자가 컨테이너를 생성, 실행, 관리하는 데 필요한 기능을 제공합니다.
컨테이너 안에서 개발을 진행하면서도 쿠버네티스처럼 컨테이너가 컨테이너를 관리한다던지, 구름 IDE처럼 컨테이너를 동적으로 생성해 사용자에게 서비스를 제공한다던지, 클라우드 서비스처럼 사용자 요청에 따라 컨테이너를 동적으로 배치해 서버리스 서비스를 제공하는 등의 다양한 작업이 가능합니다.
이처럼 DinD 방식과 DooD 방식은 보안상의 문제가 있음에도, 컨테이너가 컨테이너를 관리하는 데에는 장점이 있습니다.
🙏 본 개념의 정리에 대한 피드백과 질문은 환영입니다!
본 개념의 다른 정리 및 피드백, 인터뷰 주제의 순서는 테크 인터뷰 스터디 Repository에서 확인 가능합니다.
벨로그 - Docker와 가상화 기술
티스토리 - [Docker Basic] 15. Docker Container 자원 제한
네이버 블로그 - 도커 컨테이너 안에서 도커 실행하기 (Docker in Docker, Docker Out of Docker)
IBM - 가상화란?
AWS - 가상화란 무엇입니까?
블로그 - Docker is not a hypervisor
티스토리 - 가상화의 종류(호스트, 하이퍼바이저, 컨테이너)
블로그 - 도커 컨테이너는 가상머신인가요? 프로세스인가요?
미디엄 - Understanding the Docker Internals
벨로그 - Docker와 VM의 차이
개발 커뮤니티 - Why is Docker-in-Docker considered bad?
티스토리 - Linux) Doker와 Container의 탄생과 설명, 차이점