2022이전/Docker&Kubernetes

[개념] DinD(Docker in Docker)와 DooD(Docekr out of Docker)

바로퇴장 2020. 6. 16. 19:34

Docker의 Cilent-Server 아키텍처

도커를 이용하여 환경을 구축을 하다보면 위 그림과 비슷한 형태의 아키텍처를 따른다.

Docker 시스템 유닛은 크게 3개로 분리되어, Client, Host(Daemon), Registry를 이룬다.

대부분의 현대 CI 도구들(travis, circle, gocd, jenkins)등이 agent를 통해 docker관련 Task를 수행을 하기 때문에 docker daemon은 호스트머신에서 동작하면서 컨테이너로 동작하는 agent들이 docker-client역할을 하는 경우가 많다. 그래서 데브옵스 개발자들은 쉽게 daemon과 client의 분리를 고려하며 docker container에서 agent가 호스트 머신에 위치한 docker daemon에게 어떻게 도커 명령을 전달해야할지 고민하게된다.

Docker In Docker(DinD)

DinD == 도커 안에 도커로 도커데몬 위에 도커데몬이 작동하는 이중 구조이다.

호스트 도커 컨테이너가 privilieged mode로 실행되어야 한다.

$ docker run --privileged --name dind1 -d docker:1.8-dind

privilieged 플래그를 사용한다면 호스트컨테이너가 호스트머신에서 할 수 있는 거의 모든 작업을 할 수 있게 된다.

대표적인 예로 Jenkins 와 같은 여러 서비스들을 관리하기 위한 서비스를 이용할 때 주로 사용된다.

DinD이 과연 옳바른 것인가?

DinD 사용법과 원리

Docker Out of Dokcer(DooD)

도커 외부의 도커는 호스트의 docker socket을 에이전트 컨테이너에 볼륨 세팅을 통해 공유하고
호스트의 도커 데몬을 이용해 CI의 도커 명령을 실행한다.

에이전트를 띄우는 명령문 예시:

$ docker run -v /var/run/docker.sock:/var/run/docker.sock ...

-v옵션으로 호스트의 docker socket을 빌려사용할 수 있다. 소켓통신을 통해 에이전트 컨테이너는 호스트의 daemon에 docker 명령을 전달한다.

대표적으로 이 방식을 이용하는 서비스 대표적인 예로 >> 로드벨런싱, visualize docker 가 있다.

원문 :