[AWS/EC2] AWS EC2 Docker Jenkins 설치

SihoonCho·2024년 3월 12일
0

[AWS/EC2] AWS EC2

목록 보기
4/6
post-thumbnail

※ 읽기에 앞서


본 시리즈는 작성자의 이해와 경험을 바탕으로 실습 위주의 설명을 기반으로 작성되었습니다.
실습 위주의 이해를 목표로 하기 때문에 다소 과장이 많고 생략된 부분이 많을 수 있습니다.
따라서, 이론적으로 미흡한 부분이 있을 수 있는 점에 대해 유의하시기 바랍니다.

또한, 본 시리즈는 ChatGPT의 도움을 받아 작성되었습니다.
수 차례의 질문을 통해 도출된 여러가지 다양한 방식의 코드를 종합하여
작성자의 이해와 경험을 바탕으로 가장 정석으로 생각되는 코드를 재정립하였습니다.

📌 Docker Jenkins 수동설치

  • 개발자가 직접 명령어를 실행하며 설치하는 방법

📖 Docker Jenkins Image Pull

  • DockerHub에 존재하는 이미지를 pull
  • 아래 세 개 중 어느 걸 사용해도 무방
  • 실행하지 않아도 상관없음
$ sudo docker pull jenkins/jenkins:lts
$ sudo docker pull jenkins/jenkins:jdk17
$ sudo docker pull jenkins/jenkins:lts-jdk17 (권장)

📖 Docker Jenkins Container 실행

$ 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

📖 Docker Jenkins Docker CLI 설치

# 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

📌 Docker Jenkins 자동설치

  • DockerfileShell Script로 모든 설치과정을 자동화
  • DockerfileShell Script가 같은 경로에 위치해야 함
$ mkdir jenkins
$ cd jenkins

$ sudo nano Dockerfile
$ sudo nano install_jenkins.sh

$ sudo chmod +x install_jenkins.sh
$ ./install_jenkins.sh

📖 Dockerfile 작성

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


📖 Shell Script 작성

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 컨테이너 실행 완료."

📖 Shell Script 실행

  • DockerfileShell Script가 같은 경로에 위치해야 함
$ mkdir jenkins
$ cd jenkins

$ sudo nano Dockerfile
$ sudo nano install_jenkins.sh

$ sudo chmod +x install_jenkins.sh
$ ./install_jenkins.sh

📌 Docker Jenkins 설정

  • http://<Your Domain or IP>:8081
  • Jenkins 초기 비밀번호 확인
  • Jenkins 초기 접속 설정

📖 Jenkins 접속

  • 아래 명령어들 중 하나를 선택해 초기 비밀번호 확인
  • /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


📖 Jenkins 초기 설정

  • Install suggested plugins 선택
  • 아이디, 비밀번호, 비밀번호 확인, 이름, 이메일 입력

profile
꾸준히 노력하는 개발자

0개의 댓글