DevOps/CI,CD

[CI/CD] Docker로 프로젝트 배포 및 중단

공대생안씨 2023. 12. 28. 16:44

2023.12.28 - [CI,CD] - [CI/CD] AWS EC2 인스턴스 SSH 접속 + Docker 설치

 

[CI/CD] AWS EC2 인스턴스 SSH 접속 + Docker 설치

2023.12.28 - [CI,CD] - [CI/CD] AWS EC2 인스턴스 생성 방법 [CI/CD] AWS EC2 인스턴스 생성 방법 1. 기본 개념 AWS EC2(Amazon Elastic Compute Cloud) : AWS가 제공하는 클라우드 컴퓨팅 서비스 사용자는 필요에 따라 서버

blogan99.tistory.com

 

1. Docker로 프로젝트 배포

 

아래의 샘플 프로젝트를 배포함 (application.yml에서 url, username, password 를 삭제 -> 환경변수로 추가할 것)

https://github.com/Engineering-Student-An/CI-CD-sampleProject

 

GitHub - Engineering-Student-An/CI-CD-sampleProject

Contribute to Engineering-Student-An/CI-CD-sampleProject development by creating an account on GitHub.

github.com

 

1-1. Gradle 빌드하여 jar 파일 생성

  • 우측 탭의 Gradle > Tasks > build > assemble 클릭

 

  • 프로젝트 > build > libs > 프로젝트 이름-0.0.1-SNAPSHOT.jar 파일 생성 확인

1-2. Docker 파일 생성 및 푸시

  • 프로젝트 우클릭 > New > Dockerfile 클릭

 

  • Dockerfile에 아래 코드 붙여넣기
FROM gradle:8.5-jdk21-alpine as builder
WORKDIR /build

# 그래들 파일이 변경되었을 때만 새롭게 의존패키지 다운로드 받게함.
COPY build.gradle settings.gradle /build/
RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true

# 빌더 이미지에서 애플리케이션 빌드
COPY . /build
RUN gradle build -x test --parallel

# APP
FROM openjdk:21-slim
WORKDIR /app

# 빌더 이미지에서 jar 파일만 복사
COPY --from=builder /build/build/libs/[생성된 jar 파일 이름 (ex : ci-cd-practice-0.0.1-SNAPSHOT.jar)] .

EXPOSE 8080

# root 대신 nobody 권한으로 실행
USER nobody
ENTRYPOINT [ \
   "java", \
   "-jar", \
   "-Djava.security.egd=file:/dev/./urandom", \
   "-Dsun.net.inetaddr.ttl=0", \
   "[생성된 jar 파일 이름]" \
]

 

  • Dockerfile을 깃허브에 푸시

깃허브 리포지토리에 푸시된 Dockerfile

 

1-3. EC2 인스턴스 접속과 빌드

  • 터미널로 EC2 인스턴스 접속

2023.12.28 - [CI,CD] - [CI/CD] AWS EC2 인스턴스 SSH 접속 + Docker 설치

 

  • cicd 디렉토리 생성 후 이동
mkdir cicd
cd cicd

 

  • 깃허브에서 프로젝트 clone 받고 이동
git clone [깃허브 리포지토리 주소]

 

clone 할 리포지토리 주소

 

  • clone 받은 프로젝트로 이동 후 build 
cd CI-CD-sampleProject
docker build -t [프로젝트 이름 소문자로!] .

 

ERROR: permission denied while trying to connect to the Docker daemon socket  에러 발생 시 해결방법

더보기

아래의 코드를 순서대로 붙여넣어 실행

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

 

  • build 완료 확인
docker images -a

 

1-4. EC2 인스턴스에서 프로젝트 실행

docker run -p 8080:8080 \
-e SPRING_DATASOURCE_URL=jdbc:mysql://[RDS의 엔드포인트]:[DB 포트번호]/[사용할 DB 이름] \
-e SPRING_DATASOURCE_USERNAME=[마스터 사용자 이름] \
-e SPRING_DATASOURCE_PASSWORD=[마스터 사용자 비밀번호] \
-d [프로젝트 이름]
  • -d : 데몬으로 실행 (데몬으로 실행하지 않고 로그를 보고 싶다면 -d 만 제거하면 가능)

 

실행이 완료되면 아래와 같이 출력됨

 

  • 실행중인 컨테이너 확인
docker ps

 

1-5. 배포 완료 및 확인

  • 주소창에 [EC2 인스턴스의 퍼블릭 IPv4 DNS:포트번호] 입력하여 배포 확인
    • 배정받은 주소로 로컬이 아닌 다른 기기로도 접속 가능함

 

 

2. 프로젝트 배포 중단

 

2-1. 배포 중단하고자 하는 컨테이너의 ID를 찾음

docker ps

 

2-2. 컨테이너 중지 (둘 중 하나)

docker stop [컨테이너 ID]
docker kill [컨테이너 ID] # 강제 중지
  • 중지 확인 (docker ps) : 실행중인 컨테이너가 없음을 확인

  • 중지확인 (docker ps -a) : 중지된 컨테이너까지 확인

 

2-3. 컨테이너 삭제

docker rm [컨테이너 ID]

 

2-4. 배포 중단

  • 배정받은 URL로 접속해도 사이트에 연결할 수 없음