요즘 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 환경은 모두 날아갈 것 같습니다ㅠㅠ
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를 설치해준다는 점을 제외하고는 동일한 과정을 거친다는 점을 확인할 수 있습니다.
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 옵션을 사용하였는데, 이는 볼륨이라는 옵션으로 컨테이너 내부의 디렉토리와 컨테이너 외부 디렉토리를 연결하기 위한 옵션입니다.
정상적으로 실행됨을 확인할 수 있었습니다.
Webhook이랑... Github 설정은 다시 해오겠습니다...
https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/