컨테이너 환경에서 다시 Docker를 실행하는 방법에는 DinD(Docker-in-Docker)와 DooD(Docker-outside-of-Docker) 두 가지 방식이 있습니다.
특히, CI/CD 파이프라인에서 Jenkins와 Docker를 함께 활용할 때 이 두 개념을 이해하고 적절한 방식을 선택하는 것이 중요합니다.
DinD는 컨테이너 내부에서 별도의 Docker 데몬을 실행하여, 그 내부에서 추가적인 컨테이너를 생성하는 방식입니다.
--privileged
옵션이 필요할 수 있음 docker run --privileged -d --name dind-container docker:dind
위 명령을 실행하면 docker:dind
이미지를 기반으로 DinD 환경을 실행할 수 있습니다.
--privileged
모드 사용 시 권한 상승 가능성) DooD는 컨테이너 내부에 Docker CLI(명령어 인터페이스)만 설치하고, 실제 컨테이너 실행 요청을 호스트 머신의 Docker 데몬으로 전달하는 방식입니다.
/var/run/docker.sock
을 공유하여 Docker 명령을 전달 docker run -v /var/run/docker.sock:/var/run/docker.sock -it docker
위 명령어는 컨테이너 내부에서 Docker CLI를 실행하지만, 실제 컨테이너는 호스트의 Docker 데몬에서 실행됩니다.
/var/run/docker.sock
을 공유하므로 보안 취약점이 발생할 수 있음 Jenkins에서 Docker를 활용하여 CI/CD 파이프라인을 구축할 때, DinD와 DooD 방식 중 어떤 방식을 선택할지 고려해야 합니다.
사용 사례:
예제 (DinD 방식으로 Jenkins 실행)
docker run --privileged -d --name jenkins-dind -p 8080:8080 jenkins/jenkins
장점
✔️ 완전히 독립적인 환경 제공
✔️ Jenkins 에이전트마다 별도 Docker 환경을 제공 가능
단점
❌ --privileged
모드 필요 (보안 취약점 증가)
❌ 성능 오버헤드 발생
사용 사례:
예제 (DooD 방식으로 Jenkins 실행)
docker run -v /var/run/docker.sock:/var/run/docker.sock -d --name jenkins-dood -p 8080:8080 jenkins/jenkins
장점
✔️ 성능이 빠르고 경량화된 방식
✔️ Jenkins 빌드 속도를 높일 수 있음
단점
❌ /var/run/docker.sock
공유로 인해 보안 취약점 존재
❌ Jenkins 컨테이너에서 실행한 Docker 명령이 호스트에 직접 영향을 미침
DinD (Docker-in-Docker) | DooD (Docker-outside-of-Docker) | |
---|---|---|
실행 방식 | 컨테이너 내부에서 Docker 데몬 실행 | 컨테이너 내부에서 Docker CLI 사용하여 호스트의 Docker 데몬과 통신 |
독립성 | 각 컨테이너마다 별도 Docker 환경 제공 | 호스트의 Docker 환경을 그대로 사용 |
성능 | 추가적인 Docker 데몬 실행으로 오버헤드 발생 | 경량화된 방식으로 속도 향상 |
보안 | --privileged 모드 필요, 보안 위험 증가 | /var/run/docker.sock 공유로 보안 위험 존재 |
Jenkins에서 활용 | CI/CD 파이프라인 실행 시 완전한 격리 환경 필요할 때 | 빠른 빌드 속도와 간단한 구성 필요할 때 |
✅ 독립적인 빌드 환경이 필요한 경우 → DinD 사용
✅ 빠르고 간단한 빌드가 필요한 경우 → DooD 사용
✅ 보안이 중요한 환경에서는?
--privileged
사용을 최소화하고, 필요할 경우 Kubernetes 등으로 격리 /var/run/docker.sock
을 공유할 때 읽기 전용(ro
)으로 설정하거나 보안 강화 조치 적용 Jenkins에서 Docker를 활용할 때 DinD와 DooD 방식은 각각 장단점이 있으며, 사용 목적에 따라 적절한 방식을 선택해야 합니다.
DinD
DooD