Jenkins를 활용한 CI/CD를 구축하는 과정에서 새로운 개념을 접했다.
어쩌면 생각없이 넘어갈 수 있는 부분이겠지만 '도커 안에 도커라는게 말이 되는건가?', '실무에서 이렇게 배포하는 경우가 존재하는가?' 에 대한 의구심으로 검색해보니 다들 같은 고민을 한 흔적을 많이 볼 수 있었다.
그러던 중 한 블로그에서 아래 게시글을 이해하기 위한 일환으로 정리한 글을 발견했고 그것을 바탕으로 새롭게 알게된 내용을 정리하고자 한다.
Docker in Docker?
Can you run Docker inside a Docker container?
(https://itnext.io/docker-in-docker-521958d34efd)
게시글에서는 Jenkins와 같은 CI/CD 도구를 사용할 때 자주 발생한다고 한다.
Jenkins 자체가 도커 컨테이너로 실행되고 있고 빌드 단계 중 Docker 명령(예: 이미지 빌드)이 필요한 경우 Docker in Docker를 사용하게 되는 것이다.
이제 대충 DinD가 무엇인지 감이 잡힐 것이다. 도커 명령이 필요할 때만이 아니라 도커 컨테이너 내부에 호스트 도커와는 별개의 새로운 도커를 실행시키는 것이다.
작성자의 경우에는 이미지 빌드를 위한 명령어만이 필요했기 때문에 호스트 도커 위에 컨테이너를 올려보진 않았다.
Outer container가 Docker build, pull, run과 같은 Docker client와 Docker daemon 역할을 동시에 수행하는 것이므로 편리해보인다.
그러나 이 방법은 기술적인 결함이 존재하기때문에 권장되지 않는다고 한다. DinD와 같은 목적을 위한 또 다른 방법이 존재하는데 그것이 바로 Docker out of Docker(DooD)이다.
DooD는 Inner Docker를 띄우는 것이 아니라 호스트 도커에 컨테이너들을 병렬로 띄우는 방법이다. 이 방법을 사용하면 인스턴스가 서로 독립적이지 않지만 DinD의 문제를 우회할 수 있다.
호스트 도커 데몬이 사용하는 소켓을 공유하여 컨테이너를 실행시키는 것인데 테스트 환경이 도커 호스트환경과 일치하는 것을 알 수 있다.
실행 방법은 비교적 간단한데 도커 실행시 호스트 도커 소켓을 컨테이너에 마운트 시켜주면 된다.
-v /var/run/docker.sock:/var/run/docker.sock
즉 현재 컨테이너와 동등한 위치에 있는 형제 컨테이너를 실행시키는 것으로 보면 된다고 한다.
[참고]
https://mns010.tistory.com/25
https://velog.io/@donggu/%EB%8F%84%EC%BB%A4-Docker-in-Docker