들어가며
최근 AWS 기반으로 CI/CD 파이프라인이 구축되어 있던 것을 온프레미즈로 옮기고 있기도 하고, 현재 일하는 곳에서 젠킨스를 이용한 CI/CD 파이프라인을 구축해야할 일이 있었다.
젠킨스에 대해서 자세하게 다뤄본 적은 없었으나, 컨테이너를 통하여 젠킨스를 띄우고 젠킨스에서 다른 컨테이너를 컨트롤 하는 상황일 때, 꽤나 잔 에러가 많이 난다고 듣기만 하고서 선뜻 다뤄보지 못했다.
이번 포스팅에서는 docker를 통해 젠킨스를 띄우는 방법에 대해서 다룰 예정이며, dood 방식으로 진행한다. 파이프라인 구성에 대한 자세한 부분은 담지 않는다.
본론
DinD? DooD?
DinD ( Docker in Docker )
먼저 DinD는 말 그대로 Docker를 컨테이너 안에 설치하여 실행하는 방법이다. 즉, 하나의 Docker 컨테이너 냅에서 또 다른 Docker 데몬이 동작하여 그 안에서 추가적인 컨테이너를 생성하고 관리할 수 있다.
즉 도커 가상환경 위에 또 도커 가상환경을 올리는 셈이다. 이러한 방법은 딱 보아도 문제가 많아보일 수 있는데, 호스트에서 docker ps 등의 명령으로 제대로 찍히지 않는다는 점이다. 이러한 DinD 방식은 설정 및 관리가 복잡하기 때문에 디버깅이 어렵다는 점이 있다.
DooD( Docker out of Docker )
다음으로 DooD는 Docker out of Docker의 앞글자를 따서 만들어졌으며, 호스트 도커 데몬이 사용하는 socket을 공유하여 도커 클라이언트 컨테이너를 호스트 컨테이너에서 실행하는 것이다. 이러한 행동이 필요한 Docker 컨테이너를 만들 때, docker run 명령어와 함께 Socket을 물고 뜨도록 설정해줄 수 있다. 아래와 같은 파라미터를 추가한다.
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
위 명령어를 통해 호스트의 도커 데몬을 -v 파라미터를 넣어줌으로써 직접 호스트 레벨의 도커를 제어하는 것이 가능하다. 이러한 방법은 성능이 우수하고 관리가 편하지만 앞서 보였던 DinD에 비해서 격리성은 당연히 떨어질 수 밖에 없다.
이러한 DinD와 DooD의 장단점을 표 나타내면 아래와 같다.
특징 | DinD | DooD |
구성 방식 | 컨테이너 내에 Docker 데몬 실행 | 호스트의 Docker 데몬을 사용 |
격리성 | 호스트와 격리된 독립 환경 | 호스트와 공유되는 환경 |
성능 | 오버헤드 존재 | 성능 우수 |
보안 | --privileged로 인한 보안 위험 | 소켓 마운트로 인한 보안 위험 |
복잡성 | 설정 및 관리 복잡 | 설정 간단 |
사용 사례 | 독립된 테스트 환경 필요 시 | CI/CD 파이프라인 등에서 빠른 빌드 필요 시 |
위와 같이 장단점이 각각 있으나, 사실 Docker에서 권장하는 방법은 DooD라고 한다. 관리의 문제가 있기도 하고 특별한 상황이 아니라면 DooD가 보편적인 것 같다.
Jenkins에서의 DooD 구현
Jenkins를 통해서 DooD 구현은 어떻게 할 수 있을까? 먼저 아래의 명령어를 통해서 Jenkins를 docker로 띄울 수 있다.
docker run -d --name jenkins \
-u jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkins/jenkins:lts
-v 볼륨 파라미터를 통해서 소켓은 연결하여 띄운 것이다. 그 후 다음과 같이 컨테이너에 직접 연결하여 docker를 설치 및 설정해야한다.
# Jenkins 컨테이너로 접속
docker exec -it jenkins /bin/bash
# Docker CLI 설치
apt-get update && apt-get install -y docker.io
# Docker 소켓의 그룹 ID를 확인
ls -l /var/run/docker.sock
# 위 명령어로 얻은 그룹 ID를 바탕으로, Jenkins 컨테이너 내에서 Docker 그룹을 생성
groupadd -for -g <GROUP_ID> docker
usermod -aG docker jenkins
위 명령어를 통해서 jenkins 유저에게 docker에 대한 권한을 부여하게 되면 jenkins에서 정상적으로 docker 호스트 데몬을 이용할 수 있고 DooD 구조로 사용할 수 있게 된다.
이제 jenkins 대시보드에서 직접 파이프라인을 통해 같은 레이어에 다른 docker 컨테이너를 만들 수 있게 된다.
마치며
감사합니다.
'DevOps > docker' 카테고리의 다른 글
docker의 경량화 버전인 enroot (0) | 2024.07.13 |
---|---|
docker를 사용하는 이유 (0) | 2023.09.03 |
dockerfile 스크립트를 작성하는 방법 (0) | 2023.09.01 |