[Docker] Docker-in-Docker

chrkb1569·2024년 1월 3일
0

Docker

목록 보기
5/5
post-thumbnail

요즘 Github, Jenkins, Docker를 사용하여 CI/CD 환경을 구축하고 있는데, 편의상의 이유로 다음처럼 Docker 컨테이너 위에서 Jenkins를 구동하고 있습니다.

처음 아키텍처를 구상할 때까지만 해도 Jenkins가 Docker 위에서 작업하기 때문에 이미지를 빌드하고 push하는 작업은 무난하게 수행할 줄 알았습니다.

https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

그러나, 제 생각과는 다르게 Docker 컨테이너 내부에서 Docker를 사용하는 방식은 그닥 좋은 방식이 아닌 것 같습니다.

[Reference : https://blog.nestybox.com/2019/09/14/dind.html]

내부에서 실행되는 Docker와 외부에서 실행되는 Docker가 보안적으로 충돌할 수 있으며, 외부에 위치한 Docker는 일반 파일 시스템에서 동작하는 반면, 내부에 위치한 Docker는 외부 Docker가 설정한 환경에서 동작하기 때문에 수행할 수 있는 작업이 한정적이라는 단점이 존재합니다.

따라서, Docker 내부에서 Docker를 동작시키는 방식보다는 다음처럼 컨테이너를 추가하는 방식이 권장됩니다.

[Reference : https://blog.nestybox.com/2019/09/14/dind.html]

이와 같은 방식을 Docker-out-of-Docker라고 하는데, Docker Daemon에게 명령을 내리는 docker.sock을 컨테이너들이 공유하는 방식입니다.

Docker-out-of-Docker 방식을 사용하기 위해서는 Jenkins 이미지를 바탕으로 동작하는 별도의 Dockerfile을 생성해야하기 때문에 이전에 작업했던 Jenkins 환경은 모두 날아갈 것 같습니다ㅠㅠ

Dockerfile 생성

FROM jenkins/jenkins:jdk17 // Jenkins 이미지

USER root

COPY docker_install.sh /docker_install.sh
RUN chmod +x /docker_install.sh
RUN /docker_install.sh // 쉘 스크립트 파일을 통하여 Docker 설치

RUN groupadd -f docker // 그룹 추가
RUN usermod -aG docker jenkins
USER jenkins

Jenkins 이미지만을 사용하여 실행했던 이전과 비교하였을 때, 쉘 스크립트를 통해 Docker를 설치해준다는 점을 제외하고는 동일한 과정을 거친다는 점을 확인할 수 있습니다.

쉘 스크립트 파일 작성

https://get.docker.com

Docker 공식문서에서 제공하는 Linux 환경에 Docker를 설치하는 쉘 스크립트 파일입니다.

양이 좀 많아서 링크를 첨부하였습니다.

링크에 기입된 내용들을 모두 복사하여 쉘 스크립트 파일을 만들어주었습니다.

컨테이너 실행

  sudo docker run -d --name Jenkins \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /home/ubuntu/chrkb1569:/var/jenkins_home \
  -p 8080:8080 \
  jenkins_image

기존에 사용했던 명령어와 다르게 -v 옵션을 사용하였는데, 이는 볼륨이라는 옵션으로 컨테이너 내부의 디렉토리와 컨테이너 외부 디렉토리를 연결하기 위한 옵션입니다.

Jenkins 실행

정상적으로 실행됨을 확인할 수 있었습니다.

Webhook이랑... Github 설정은 다시 해오겠습니다...

Reference

https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

https://blog.nestybox.com/2019/09/14/dind.html

0개의 댓글

관련 채용 정보