도커 안에서 도커를 사용하는 방법은 크게 3가지가 있습니다.
우리는 첫 번째 방식인 Docker-outside-of-Docker(DooD)를 사용해 볼 것입니다.
상세사항은 아래 아티클을 참고해 주세요.
https://devopscube.com/run-docker-in-docker/
호스트에 도커를 설치하고
호스트의 /var/run/docker.sock(아웃사이드)을 도커 컨테이너의 /var/run/docker.sock(인사이드)와 공유하는 방식으로
젠킨스 도커 컨테이너에서 도커를 사용하도록 할 것입니다.
도커 소켓 (/var/run/docker.sock)
동일한 호스트의 프로세스 간 통신을 위한 Unix 기본 소켓
도커 설치 후 공식 Jenkins 도커 이미지를 사용해 Jenkins를 배포합니다. Jenkins를 배포할 때 호스트의 일부 디렉토리 및 도커 소켓을 공유하도록 구성합니다. 이 소켓을 사용해 Jenkins는 호스트에 설치된 도커 기능을 사용할 수 있습니다.
설치 커멘드는 ubuntu 22.04, arm64 arch 를 기준으로 작성하였습니다.
# 젠킨스 경로 생성
mkdir -pv ~/_docker/jenkins/volume/home
# docker 설치
sudo apt update -y && sudo apt install -y docker.io
docker run -d -p 8080:8080 --name jenkins -e PUID=1001 -e PGID=1001 \
-v ~/_docker/jenkins/volume/home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--network dev-net -u root jenkins/jenkins:lts
# gcp
gcloud compute firewall-rules create jenkins-ci --allow=tcp:8080
# oci
콘솔 > Default Security List 에 수신규칙 추가
(소스 0.0.0.0/0, 대상 port/프로토콜 8080/tcp)
# jenkins에 docker client 설치
docker exec jenkins apt update
docker exec jenkins apt install -y docker.io
# 젠킨스 초기패스워드 조회
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
Jenkins가 8080 포트로 서비스 중입니다.
호스트 인스턴스의 IP를 사용해 브라우저로 접속합니다.
http://<호스트 퍼블릭IP>:8080
초기패스워드를 입력하고 초기 설치는 Install sggested plugins를 사용합니다.
플러그인 설치가 완료되면 유저를 설정할 수 있는 페이지가 나타나는데 적절한 유저로 구성하면 됩니다.
DooD 방식은 엔지니어 입장에서는 비교적 구현하기 쉽고 직관적인 컨셉이라 편리하기는 하지만 보안문제 등 여러가지 리스크가 있습니다.
1. 컨테이너에 호스트의 도커 소켓이 노출
컨테이너 내부에서 호스트의 시스템의 모든 도커 이미지와 컨테이너를 관리할 수 있게 됩니다. 잠재적 보안 위협이 될 수 있습니다.
2. 컨테이너에서 사용하는 도커 데몬의 권한 상승
도커 데몬은 일반적으로 루트권한을 갖게 되는데 결과적으로 컨테이너의 도커 데몬이 호스트의 루트 권한을 소유하게 됩니다.
3. 도커 이미지 신뢰성 하락
1, 2번의 이유로 컨테이너에서 호스트에 접근이 가능하기 때문에 해당 도커 이미지는 호스트 공격 수단이 될 수 있습니다.
4. 컨트롤러와 에이전트 독립성 저하
젠킨스는 병렬 빌드 및 멀티 CI/CD와 관련하여 컨트롤러와 에이전트를 분리하는 방향으로 발전해 왔습니다.
DooD의 컨셉은 컨트롤러와 에이전트가 동일한 호스트의 도커 소켓을 사용하고 있어 연계성이 증대되어 상호 독립성이 떨어집니다.