Jenkins 를 docker container 로 생성한 다음 Jenkins 에서 docker build, docker push 를 할 일이 있어서 가이드를 만들었다.

최종 결과는 위의 그럼과 같다. 간단히 설명하자면, 순서는 아래와 같다.
1. 사용자의 OS 에 docker daemon 을 설치/실행 한다.
2. docker cli 를 포함하는 Jenkins 이미지 를 container 로 띄운다. 이 때에 Host OS 의 docker.sock 를 Mount 하여 docker cli 가 Host OS 의 docker daemon 에 접근할 수 있도록 한다.
3. Jenkins 로 docker build , docker push 를 한다.
자신의 컴퓨터에 도커를 설치한다. 각자의 OS 에 맞게 설치한다.
Linux 가 아닐 경우 Docker Desktop 를 통해 설치하자.
나는 Ubuntu 여서 다음의 방법으로 설치했다.
# 1. 시스템 업데이트
$ sudo apt-get update
# 2. Docker 패키지 설치를 위한 필수 패키지 설치
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 3. Docker 공식 GPG 키 추가
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 4. Docker 저장소 추가
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 패키지 목록 업데이트
$ sudo apt-get update
# 6. Docker 설치
$ sudo apt-get install docker-ce
# 7. Docker 서비스 상태 확인
$ sudo systemctl status docker
# 8. Docker 명령어를 root 없이 사용하도록 설정
$ sudo usermod -aG docker ${USER}
# 9. 다음 명령어로 새 세션을 시작
$ newgrp docker
# 10. docker 정상적으로 동작하는 지 확인
$ docker ps
> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
아래의 docker-compose.yaml 을 복사하여 원하는 경로 에 저장한다.
# docker-compose.yaml
version: '3.8'
services:
jenkins:
image: sororiri/jenkins:0.0.1
container_name: jenkins-server
user: root
restart: always
ports:
- "8080:8080"
- "50000:50000"
volumes:
- ./jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
참고로
sororiri/jenkins:0.0.1Dockerfile은 다음과 같다.
docker-cli를 젠킨스 이미지 안에 추가함을 통해 별도로 젠킨스가 실행한 뒤에Docker-cli를 설치하지 않아도 되게 하였다.# Dockerfile FROM jenkins/jenkins:lts USER root RUN apt-get update && apt-get install -y lsb-release RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \ https://download.docker.com/linux/debian/gpg RUN echo "deb [arch=$(dpkg --print-architecture) \ signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \ https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list #---- docker-ce-cli RUN apt-get update && apt-get install -y docker-ce-cli #---- sshpass RUN apt-get -y install sshpass #---- locale RUN apt-get install -y locales git \ && localedef -f UTF-8 -i ko_KR ko_KR.UTF-8 ENV LC_ALL ko_KR.UTF-8 USER jenkins
Jenkins Image 를 Docker 로 실행한다.
# docker-compose.yaml 을 저장한 위치로 이동한 뒤 파일을 확인한다.
$ ls
> docker-compose.yaml
# docker 실행
$ docker compose up
> WARN[0000] /home/sori/temp/jenkins/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 1/0
✔ Container jenkins-server Recreated 0.1s
Attaching to jenkins-server
Jenkins 초기화 시 다음과 같은 로그가 남는데, 여기에 초기 비밀번호 가 있다.
jenkins-server | Please use the following password to proceed to installation:
jenkins-server |
jenkins-server | a475e502f16a4a4cba1c6898311b3d5a <= 이게 초기 비번임 ~!
jenkins-server |
jenkins-server | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
표시되는 비밀번호를 복사한 후, http://localhost:8080 로 접속한다.
그럼 아래와 같은 페이지가 나오는데, 여기에 초기 비밀번호를 입력한다.

그러면 아래와 같은 페이지가 나오는데, 잘 모르겠으면 그냥 Install suggested plugin 으로 진행하면 된다.

이후 아래 페이지도 기입한 뒤에 save and continue 를 클릭한다.

다음의 페이지에도 기본값으로 되어있는 것으로 두고 Save and Finish 를 클릭한다.

Jenkins 에서 Docker 실행하기아래처럼 New Item 클릭한다.

원하는 이름으로 Job 이름을 설정하고 Freestyle project 로 Job 을 만든다.

그리고 아래와 같이 Execute shell 을 클릭한다.

이후 아래처럼 docker ps 를 입력 후 Save 버튼을 클릭 해 Job 을 생성한다.

그 다음 Build Now 로 Job 을 실행해본다.

이후 실행 결과를 보면 아래와 같이 docker cli 가 정상적으로 HOST 의docker-daemon 에 접속한 것을 확인할 수 있다.

$ docker ps 명령어가 적용되었다면 이제 docker 로그인을 진행해보자. 로그인, 비밀번호는 외부에 노출되면 안되므로 아래처럼 credentials 에 추가한다.
DockerHub 의 USERNAME(ID) 와 PASSWORD 를 credentials 에 추가한다. creadentials ID 는 임의로 정하면 된다.

우선 아래와 같이 Job 을 새로 생성한다.

그리고 Job 설정을 아래와 같이 변경해보자.

관련 소스코드는 아래와 같다.
pipeline {
agent any
environment {
dockerhub_cred = credentials('DockerHub-sororiri')
}
stages {
stage('Hello') {
steps {
sh '''
echo $dockerhub_cred_PSW | docker login -u $dockerhub_cred_USR --password-stdin
'''
}
}
}
}
이후 Job 을 실행해보면 아래와 같이 Login 이 정상적으로 동작하는 것을 확인할 수 있다.

궁금하신 점이 있으면 말씀해주세요.