본 시리즈는 작성자의 이해와 경험을 바탕으로 실습 위주의 설명을 기반으로 작성되었습니다.
실습 위주의 이해를 목표로 하기 때문에 다소 과장이 많고 생략된 부분이 많을 수 있습니다.
따라서, 이론적으로 미흡한 부분이 있을 수 있는 점에 대해 유의하시기 바랍니다.
또한, 본 시리즈는 ChatGPT의 도움을 받아 작성되었습니다.
수 차례의 질문을 통해 도출된 여러가지 다양한 방식의 코드를 종합하여
작성자의 이해와 경험을 바탕으로 가장 정석으로 생각되는 코드를 재정립하였습니다.
$ sudo docker pull jenkins/jenkins:lts
$ sudo docker pull jenkins/jenkins:jdk17
$ sudo docker pull jenkins/jenkins:lts-jdk17 (권장)
$ sudo docker run -d -u root \
-p 8081:8080 -p 50000:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--name server-jenkins jenkins/jenkins:lts-jdk17
# --name server-jenkins jenkins/jenkins:lts
# --name server-jenkins jenkins/jenkins:jdk17
-u 실행할 계정 지정
-d detached mode, 흔히 말하는 백그라운드 모드
-p 호스트와 컨테이너의 포트를 연결 (포워딩)
-v 호스트와 컨테이너의 디렉토리를 연결 (마운트)
--name 컨테이너 이름 설정
맨 마지막 jenkins/jenkins:lts-jdk17 은 위에서 pull한 이미지 이름
만약, 위에서 pull한 이미지가 없을 경우, DockerHub 에서 자동으로 pull
root
계정은 sudo
명령어 없음# Docker Container 접속
$ sudo docker exec -it server-jenkins /bin/bash
# Add Docker's official GPG key:
$ apt-get update
$ apt-get install 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
# Add the repository to Apt sources:
$ 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
# Docker CLI 설치
$ apt-get update
$ apt-get install -y docker-ce docker-ce-cli containerd.io
Dockerfile
과 Shell Script
로 모든 설치과정을 자동화Dockerfile
과 Shell Script
가 같은 경로에 위치해야 함$ mkdir jenkins
$ cd jenkins
$ sudo nano Dockerfile
$ sudo nano install_jenkins.sh
$ sudo chmod +x install_jenkins.sh
$ ./install_jenkins.sh
root
계정은 sudo
명령어 없음Dockerfile
# 기본 이미지 설정
FROM jenkins/jenkins:lts-jdk17
# root 계정으로 변경
USER root
# Docker 공식 GPG 키 추가 및 Docker 저장소 설정
RUN apt-get update && \
apt-get install -y 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
# Docker CLI 설치
RUN apt-get update && \
apt-get install -y docker-ce docker-ce-cli containerd.io
# 컨테이너 계정 및 그룹 권한 설정을 위한 변수
# ARG GROUP_GID=998
# ARG USER_UID=1000
# 컨테이너 계정 및 그룹 권한 설정
# RUN groupmod -g ${GROUP_GID} docker && \ # docker 그룹 GID를 변경, 호스트와 일치
# RUN usermod -u ${USER_UID} jenkins && \ # jenkins 계정 UID를 변경, 호스트와 일치
# usermod -aG docker jenkins # jenkins 계정을 docker 그룹에 추가
# jenkins 계정으로 변경 (Jenkins 기본 계정)
# USER jenkins
컨테이너 사용자 (jenkins)가 호스트 파일에 접근 가능하도록
컨테이너 사용자 (jenkins) UID를 변경하여 호스트 설정과 일치시키고
컨테이너 그룹 (docker) GID를 변경하여 호스트 설정과 일치시킨다.
마지막으로 jenkins 계정을 docker 그룹에 추가한다.
참고로 UID와 GID는 아래와 같이 확인할 수 있다.
계정 UID는 호스트의/etc/passwd
또는$ id -u [계정명]
그룹 GID는 호스트의/etc/group
또는$ getent group [그룹명]
[Reference] https://bitgadak.tistory.com/3
install_jenkins.sh
#!/bin/bash
IMAGE_NAME="server/jenkins"
CONTAINER_NAME="server-jenkins"
IMAGE_ID=$(sudo docker images -q $IMAGE_NAME)
CONTAINER_ID=$(sudo docker ps -aqf "name=$CONTAINER_NAME")
echo ">>> CURRENT DOCKER INFORMATION:"
echo "$IMAGE_NAME IMAGE_ID: $IMAGE_ID"
echo -e "$CONTAINER_NAME CONTAINER_ID: $CONTAINER_ID\n"
# Stop & Remove Existing Container
echo ">>> $CONTAINER_NAME 컨테이너 실행 여부 검사 시작..."
if [ ! -z "$CONTAINER_ID" ]; then
# docker stop $(docker ps -aq --filter "name=$CONTAINER_NAME")
# docker rm $(docker ps -ap --filter "name=$CONTAINER_NAME")
echo -e ">>> 실행중인 $CONTAINER_NAME 컨테이너 중지 및 삭제 시작...\n"
echo ">>> 실행중인 $CONTAINER_NAME 컨테이너 중지 시작..."
sudo docker stop $CONTAINER_ID || {
echo ">>> $CONTAINER_NAME 컨테이너 중지 실패."
exit 1
}
echo -e ">>> 실행중인 $CONTAINER_NAME 컨테이너 중지 완료.\n"
echo ">>> 중지상태인 $CONTAINER_NAME 컨테이너 삭제 시작..."
sudo docker rm $CONTAINER_ID || {
echo ">>> $CONTAINER_NAME 컨테이너 삭제 실패."
exit 1
}
echo -e ">>> 중지상태인 $CONTAINER_NAME 컨테이너 삭제 완료.\n"
echo ">>> 실행중인 $CONTAINER_NAME 컨테이너 중지 및 삭제 완료."
fi
echo -e ">>> $CONTAINER_NAME 컨테이너 실행 여부 검사 완료.\n"
# Remove Existing Docker Image
echo ">>> $IMAGE_NAME 이미지 존재 여부 검사 시작..."
if [ ! -z "$IMAGE_ID" ]; then
# docker rmi -f $(docker image -q $IMAGE_NAME)
echo ">>> 기존 $IMAGE_NAME 이미지 삭제 시작..."
sudo docker rmi $IMAGE_ID || {
echo ">>> 기존 $IMAGE_NAME 이미지 삭제 실패."
exit 1
}
echo ">>> 기존 $IMAGE_NAME 이미지 삭제 완료."
fi
echo -e ">>> $IMAGE_NAME 이미지 존재 여부 검사 완료.\n"
# Build Docker Image
# 현재 사용자의 UID와 Docker 그룹의 GID 추출
GROUP_GID=$(getent group docker | cut -d: -f3)
USER_UID=$(id -u $USER)
# Docker 이미지를 빌드하면서 사용자 UID와 그룹 GID를 인자로 전달
echo ">>> $IMAGE_NAME 이미지 빌드 시작..."
sudo docker build -t $IMAGE_NAME . \
--build-arg USER_UID=$USER_UID \
--build-arg GROUP_GID=$GROUP_GID || {
echo ">>> $IMAGE_NAME 이미지 빌드 실패."
exit 1
}
echo -e ">>> $IMAGE_NAME 이미지 빌드 완료.\n"
# Run Docker Container (USER jenkins)
echo ">>> $CONTAINER_NAME 컨테이너 실행 시작..."
sudo chown -R 1000:1000 /var/jenkins_home
sudo docker run -d \
-p 8081:8080 -p 50000:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--name $CONTAINER_NAME $IMAGE_NAME || {
echo ">>> $CONTAINER_NAME 컨테이너 실행 실패."
exit 1
}
echo ">>> $CONTAINER_NAME 컨테이너 실행 완료."
## Run Docker Container (USER root)
#echo ">>> $CONTAINER_NAME 컨테이너 실행 시작..."
#sudo docker run -d -u root \
# -p 8081:8080 -p 50000:50000 \
# -v /var/jenkins_home:/var/jenkins_home \
# -v /var/run/docker.sock:/var/run/docker.sock \
# --name $CONTAINER_NAME $IMAGE_NAME || {
# echo ">>> $CONTAINER_NAME 컨테이너 실행 실패."
# exit 1
# }
#echo ">>> $CONTAINER_NAME 컨테이너 실행 완료."
Dockerfile
과 Shell Script
가 같은 경로에 위치해야 함$ mkdir jenkins
$ cd jenkins
$ sudo nano Dockerfile
$ sudo nano install_jenkins.sh
$ sudo chmod +x install_jenkins.sh
$ ./install_jenkins.sh
http://<Your Domain or IP>:8081
/var/jenkins_home
경로는 마운트된 볼륨이므로 호스트 서버에서도 확인 가능# 호스트 서버에서 확인
$ sudo cat /var/jenkins_home/secrets/initialAdminPassword
# Docker Jenkins 처음 실행 로그로 확인
$ sudo docker logs server-jenkins
# Docker Jenkins 컨테이너에 접속하여 확인
$ sudo docker exec -it server-jenkins /bin/bash
$ cat /var/jenkins_home/secrets/initialAdminPassword
# Docker Jenkins 컨테이너에 명령어로 확인
$ sudo docker exec server-jenkins cat /var/jenkins_home/secrets/initialAdminPassword
Install suggested plugins
선택