CS

Docker 컨테이너 배포

Geisha 2024. 4. 17. 10:40

Jenkins, Backend, DB, Redis 등을 배포해보려 한다.

첫번째로 이전에

AWS EC2 인스턴스를 프리티어사용하여 시작하고

EC2에서 스왑메모리 설정 

EC2에 도커를 설치

그때그때 인바운드 규칙 설정을 해야한다.

 

1. Docker 를 이용하여 Jenkins 컨테이너 생성

$ docker run --name jenkins  -e TZ=Asia/Seoul -d -p 9090:8080 -p 50000:50000 \
-v /home/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock \
-u root 84eb5f85358

2. Jenkins 비밀번호 접속 

$ sudo docker exec -it jenkins bash -c "cat /var/jenkins_home/secrets/initialAdminPassword"

 

3. Jenkins 컨테이너 내 Docker 설치 

apt-get update && \
apt-get -y install apt-transport-https \
  ca-certificates \
  curl \
  gnupg2 \
  zip \
  unzip \
  software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce

3. DB 컨테이너 생성

생성전 docker pull 을 이용, 이미지 를 받아오는 과정 필요하다.

$ docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> 
-d -p 3306:3306 mysql:latest

4. Redis 컨테이너 생성

생성전 docker pull 을 이용, 이미지 를 받아오는 과정 필요하다.

$ docker run -p 6379:6379 --name (redis 컨테이너 이름) 
-d redis:latest --requirepass "(비밀번호)"

# redis-cli로 접근
$ docker exec -i -t (redis 컨테이너 이름) redis-cli -a "비밀번호"

#여기서 ping 을 입력하면 pong 으로 응답해야한다.

5. Jenkins CICD 구축

jenkins 내 webhook 과 

gitLab github 등의 webhook을 설정해주고

Jenkinsfile , Dockerfile을 작성한다.

 

Jenkinsfile 은 이렇게 작성하였다.

pipeline {
    agent any
    tools {
        gradle 'gradle'
    }
    stages {
        stage('clone'){
            steps{
                git branch: 'main', url: 'https://github.com/GEISHAz/test.git'
            }
        }
        stage('Gradle build') {
                steps {
                    dir('./testserver') {
                            sh 'chmod +x ./gradlew'
        					sh './gradlew clean build'
                        }
                    }
                }
        stage('Container build') {
            steps {
                dir("./testserver") {
                    sh 'docker stop backend || true && docker rm backend || true'
                    sh 'docker rmi backend || true'
                    sh 'docker build -t backend .'
                }
            }
        }
        stage('back-deploy') {
            steps {
                sh 'docker run -it -d -p 8080:8080 --name backend backend'
            }
        }
    }
}

 

 Dockerfile은 아래와 같이 작성하였다.

# Dockerfile

# jdk21 Image Start
FROM openjdk:21

# 인자 설정 - JAR_File
ARG JAR_FILE=build/libs/*SNAPSHOT.jar

# jar 파일 복제
COPY ${JAR_FILE} app.jar

# 인자 설정 부분과 jar 파일 복제 부분 합쳐서 진행해도 무방
#COPY build/libs/*.jar app.jar

# 실행 명령어
ENTRYPOINT ["java", "-jar", "app.jar"]