Jenkins 를 컨테이너로 올리는 방법이다. 공식 이미지 jenkins/jenkins:<version>-jdk21 을 바탕으로 Docker CLI 를 넣은 이미지를 만들고, 빌드 중 docker build 를 쓸 수 있게 docker:dind 컨테이너를 곁에 둔다. Jenkins 컨테이너는 TLS 로 dind 의 데몬(tcp://docker:2376)에 붙는다.[1]
Kubernetes 에 올릴 때는 공식 Helm chart(jenkins/jenkins)를 쓰고 에이전트를 Pod 로 띄운다. 이 문서는 단일 호스트 Docker 기준이다.
| 항목 | 값 |
|---|---|
| Docker | Docker Engine 이 설치된 Linux 호스트. Docker 설치 |
| 디스크 | 컨테이너 기준 10 GB 이상 권장 |
| 메모리 | 4 GB 이상 권장 |
| 포트 | 8080 (웹), 50000 (에이전트), 2376 (dind, 내부 네트워크) |
| 컨테이너 | 이미지 | 역할 |
|---|---|---|
jenkins-docker |
docker:dind |
Docker 데몬. jenkins 네트워크에서 docker 별칭으로 노출 |
jenkins-blueocean |
직접 빌드 (myjenkins-blueocean) |
Jenkins 컨트롤러 + Docker CLI + 플러그인 |
볼륨 jenkins-data 는 /var/jenkins_home, jenkins-docker-certs 는 dind 가 만든 클라이언트 인증서를 두 컨테이너가 공유한다.
Dockerfile 을 만든다. 태그는 현행 LTS 에 맞춘다.
FROM jenkins/jenkins:2.568.3-jdk21
USER root
RUN apt-get update && apt-get install -y lsb-release ca-certificates curl && \
install -m 0755 -d /etc/apt/keyrings && \
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && \
chmod a+r /etc/apt/keyrings/docker.asc && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/debian $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && apt-get install -y docker-ce-cli && \
apt-get clean && rm -rf /var/lib/apt/lists/*
USER jenkins
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow json-path-api"
docker build -t myjenkins-blueocean:2.568.3-1 .
네트워크를 만들고 dind 를 먼저 띄운다.
docker network create jenkins
docker run \
--name jenkins-docker \
--rm \
--detach \
--privileged \
--network jenkins \
--network-alias docker \
--env DOCKER_TLS_CERTDIR=/certs \
--volume jenkins-docker-certs:/certs/client \
--volume jenkins-data:/var/jenkins_home \
--publish 2376:2376 \
docker:dind \
--storage-driver overlay2
Jenkins 컨테이너를 띄운다.
docker run \
--name jenkins-blueocean \
--restart=on-failure \
--detach \
--network jenkins \
--env DOCKER_HOST=tcp://docker:2376 \
--env DOCKER_CERT_PATH=/certs/client \
--env DOCKER_TLS_VERIFY=1 \
--publish 8080:8080 \
--publish 50000:50000 \
--volume jenkins-data:/var/jenkins_home \
--volume jenkins-docker-certs:/certs/client:ro \
myjenkins-blueocean:2.568.3-1
위 두 docker run 을 하나의 docker-compose.yaml 로 옮긴 것이다. 같은 디렉터리에 위 Dockerfile 을 둔다.
services:
jenkins-docker:
image: docker:dind
container_name: jenkins-docker
privileged: true
restart: unless-stopped
networks:
jenkins:
aliases:
- docker
environment:
- DOCKER_TLS_CERTDIR=/certs
volumes:
- jenkins-docker-certs:/certs/client
- jenkins-data:/var/jenkins_home
ports:
- "2376:2376"
command: ["--storage-driver", "overlay2"]
jenkins-blueocean:
build: .
image: myjenkins-blueocean:2.568.3-1
container_name: jenkins-blueocean
restart: on-failure
depends_on:
- jenkins-docker
networks:
- jenkins
environment:
- DOCKER_HOST=tcp://docker:2376
- DOCKER_CERT_PATH=/certs/client
- DOCKER_TLS_VERIFY=1
ports:
- "8080:8080"
- "50000:50000"
volumes:
- jenkins-data:/var/jenkins_home
- jenkins-docker-certs:/certs/client:ro
volumes:
jenkins-docker-certs:
jenkins-data:
networks:
jenkins:
driver: bridge
docker compose up -d --build
docker compose ps
호스트 방화벽에서 8080 을 연다. 에이전트를 외부에서 붙일 때만 50000 을 연다.
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
http://<host>:8080 에 접속한다. 초기 비밀번호는 컨테이너 로그 또는 다음 명령으로 본다.
docker logs jenkins-blueocean
docker exec jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword
이후 절차는 Jenkins 초기 설정 을 따른다.
위 버전과 저장소는 오래된 것이라 이미지 태그가 존재하지 않을 수 있다.
FROM jenkins/jenkins:2.504.3-jdk21 로 이미지를 만들고 위와 같은 dind 구성을 썼다. Dockerfile 내용과 compose 구성은 현행과 같다.
Installing Jenkins — Docker. 2026-09-20 확인. https://www.jenkins.io/doc/book/installing/docker/ ↩︎ ↩︎
최신 LTS 2.568.3 — 2026-09-20 확인. https://www.jenkins.io/changelog-stable/ ↩︎