20250109 TIL : MSA 프로젝트 Docker Compose로 EC2에 수동 배포하기

MCS·2025년 1월 9일

TIL

목록 보기
41/45

오늘 학습한 내용

  • MSA 프로젝트 Docker Compose로 EC2에 수동 배포하기
    • Dockerfile에 빌드 스테이지 추가
    • docker-compose.yml 수정
    • EC2에서 docker compose 실행

MSA 프로젝트 Docker Compose로 EC2에 수동 배포하기

이전에 작성했던 Dockerfile과 docker-compose.yml 파일을 수정하고, EC2에 수동 배포를 해 보았다.

Dockerfile에 빌드 스테이지 추가

아직 CI/CD 파이프라인을 구축하지 않았으므로, Dockerfile에 빌드 스테이지를 추가하고 docker compose 실행을 통해 빌드 및 컨테이너화를 하도록 구성했다.
Dockerfile은 다음과 같이 수정했다.

# Build Stage
FROM gradle:8.11.1-jdk17 AS build

WORKDIR /tmp

COPY . .

RUN gradle clean build --no-daemon -x test --stacktrace

# Run Stage
FROM openjdk:17-jdk-slim

VOLUME /tmp

ARG JAR_FILE=/tmp/build/libs/*.jar

COPY --from=build ${JAR_FILE} app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

EXPOSE 19092

소스를 복사해 /tmp 폴더로 가져오고, 빌드를 실행한다.
이후에 빌드 결과 파일을 가지고 컨테이너를 생성한다.

빌드 스테이지는 CI/CD 파이프라인 구축 시 파이프라인에 맡기고, 빌드 스테이지 내용은 Dockerfile에서 제거할 예정이다.

docker-compose.yml 수정

version: '3.8'

services:
  eureka-server:
    build:
      context: ./server
      dockerfile: Dockerfile
    container_name: eureka-server
    ports:
      - "19090:19090"
    networks:
      - hotdealnetwork

  gateway-service:
    build:
      context: ./gateway
      dockerfile: Dockerfile
    container_name: gateway-service
    ports:
      - "19091:19091"
    environment:
      - JWT_SECRET_KEY=${JWT_SECRET_KEY}
    depends_on:
      - eureka-server
    networks:
      - hotdealnetwork

  user-service:
    build:
      context: ./user
      dockerfile: Dockerfile
    container_name: user-service
    ports:
      - "19092:19092"
    environment:
      - ACTIVE_PROFILE=${ACTIVE_PROFILE}
      - EMAIL_SERVICE_USERNAME=${EMAIL_SERVICE_USERNAME}
      - EMAIL_SERVICE_PASSWORD=${EMAIL_SERVICE_PASSWORD}
      - PROD_DB_ENDPOINT=${PROD_DB_ENDPOINT}
      - PROD_DB_USERNAME=${PROD_DB_USERNAME}
      - PROD_DB_PASSWORD=${PROD_DB_PASSWORD}
      - REDIS_PROD_HOST=${REDIS_PROD_HOST}
      - REDIS_PROD_PORT=${REDIS_PROD_PORT}
      - REDIS_PROD_USERNAME=${REDIS_PROD_USERNAME}
      - REDIS_PROD_PASSWORD=${REDIS_PROD_PASSWORD}
      - JWT_SECRET_KEY=${JWT_SECRET_KEY}
    depends_on:
      - gateway-service
    networks:
      - hotdealnetwork

networks:
  hotdealnetwork:
    external: true
    name: hotdeal-ecommerce_hotdealnetwork

EC2 배포용으로 사용하기 위해 환경변수들을 수정했다. 그리고 network는 미리 EC2의 도커에서 생성해 놓고, 그것을 사용하도록 설정했다.

.env파일 또한 EC2에서 깃허브 리포지토리를 클론받아 프로젝트 루트 디렉토리에 추가해줘야 하는데, FileZilla를 이용해 옮겼다.

CI/CD 파이프라인을 구축할 경우 환경 변수를 깃허브 Secrets 등에 저장해놓고 사용하도록 할 예정이다. 지금은 수동 배포이기 때문에 직접 옮겨줬다.

EC2에서 docker compose 실행

깃으로 특정 리포지토리를 클론해오는 과정은 생략했다.
docker compose를 실행하기 전에 우선 docker compose를 다운로드 받아야 한다.
도커로 배포를 하므로 그 외의 JDK 등은 다운로드 할 필요가 없다.
이것은 도커의 가장 큰 장점으로, 호스트 운영체제의 상태와 상관없이 도커 컨테이너는 자체적으로 필요한 모든 런타임 환경을 포함할 수 있기 때문이다.
Dockerfile의 빌드 스테이지에서 FROM gradle:8.11.1-jdk17 AS build로 그래들 빌드를 사용하고, 실행 스테이지에서 FROM openjdk:17-jdk-slim에서 JDK를 다운로드받아서 사용한다.

docker 설치

  1. 패키지 업데이트
sudo apt update
  1. 도커 다운로드를 위한 https 관련 패키지 설치
sudo apt install apt-transport-https ca-certificates curl software-properties-common
  1. 도커 리포지토리 접근을 위한 GPG Key 설정
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. 도커 리포지토리 등록
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
  1. 패키지를 다시 업데이트
sudo apt update
  1. 도커 설치
sudo apt install docker-ce
  1. 실행 상태 확인
sudo systemctl status docker

docker compose 설치

  1. docker compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.32.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

현재 최신 릴리즈는 v2.32.2로, 버전을 변경하고 싶으면 이것을 변경하면 된다.

  1. 권한 부여
sudo chmod +x /usr/local/bin/docker-compose
  1. 심볼릭 링크 연결
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  1. 버전 확인
docker-compose --version

docker compose 실행

docker-compose up --build -d

--build 옵션을 추가해 Docker Compose가 컨테이너를 실행하기 전에 각 서비스의 이미지를 빌드하도록 한다.

--build 옵션이 없으면 Docker Compose는 기존의 이미지를 사용하여 컨테이너를 실행하며,
이미 존재하는 이미지가 있다면 해당 이미지를 그대로 사용하고, Dockerfile이나 소스 코드에 변경 사항이 있어도 새로 빌드하지 않는다.
만약 기존에 빌드된 이미지가 없다면, Docker Compose가 빌드를 실행할 것이다.

변경사항이 있어 빌드를 다시 실행해야 한다면 docker-compose up --build -d를 실행하고, 단순히 컨테이너를 재실행하는것 뿐이라면 docker-compose up -d를 실행한다.

기타 사항(Redis 등)

Redis 등을 도커로 띄워서 사용할 예정이라면, 컨테이너를 실행할 때 미리 생성한 네트워크를 사용하도록 지정해야 한다. 그렇지 않으면 네트워크가 논리적으로 격리되어 서로 연결할 수 없을 것이다.

docker run -d --name redis \
  --network hotdeal-ecommerce_hotdealnetwork \
  -p your_port:6379 \
  redis:latest redis-server --requirepass your_password

hotdeal-ecommerce_hotdealnetwork라는 네트워크를 미리 생성해 놓았고, 이것을 사용하도록 명령어에서 지정할 수 있다.

profile
백엔드를 잘 하고 싶은 사람

0개의 댓글