카테고리 없음

AWS) aws ec2에 도커컴포즈로 백엔드+mysql 올리기 -1

STUFIT 2024. 6. 26. 22:51
반응형

flutter +nestjs + mysql 로 만든 가계부 앱이 이제 막바지이다.

그래서 이제 백엔드를 ec2에 올리려고 하다보니 도커로 올리는게 편할 것 같아서 도커 컴포즈를 통해 백엔드와 DB를 올리는 과정을 남기려고 한다.

먼저, 로컬에서 도커 컴포즈를 작성해야 하는데 다음과 같다.

1. 도커파일 작성

우선 nestjs는 도커파일을 만들기로 하였다. 도커 파일 내용은 다음과 같다.

FROM node:18
RUN apt-get update -y && apt-get upgrade -y libvips libvips-dev
ARG NODE_ENV=local_docker
ENV NODE_ENV=${NODE_ENV}
ENV DD_ENV=${NODE_ENV}
ENV DD_SERVICE=${NODE_ENV}-wallet_worrior
WORKDIR /opt/app
COPY . /opt/app
#COPY ./config/.env.local_docker /opt/app/config/.env.local_docker
ENV PATH /opt/node_modules/.bin:$PATH
RUN rm -rf /opt/app/node_modules
RUN npm install
#RUN npm build
EXPOSE 3001
## Nest.js 실행
ENTRYPOINT [ "npm", "run","start:local_docker" ]

명령어에 따라 env를 local, docker, prod 등으로 나누어 놓아서 npm start local_docker로 시작하도록 하였고, config쪽에서 해당 명령어를 받아서 분기처리 하였다.

import { ConfigService } from '@nestjs/config';

export class ConfigConvent {
  public static isLocalDockerGetProfile(profile: string): string {
    console.log('프로필:', profile);
    if (profile === undefined) {
      return 'LOCAL';
    }
    // return profile === 'local-docker' ? 'local-docker' : profile.toUpperCase();
    return profile.toUpperCase();
  }

  public static isLocalDockerGetHost(
    profile: string,
    PROFILE: string,
    configService: ConfigService,
  ): string {
    // return 'host.docker.internal';
    return profile === 'local-docker' || profile === 'local_docker'
      ? 'ts_db'
      : configService.get('WALLET_WORRIOR' + PROFILE + '_HOST');
  }
}

위의 코드에서 로컬에서 도커를 사용할때에는 host를 host.docker.internal로 해야 도커컴포즈로 묶인 mysql과 통신이 가능한대, ec2 서버로 올릴 때에는 도커 컴포즈에서 depends_on을 ts_db로 매칭시켜줘야한다.

아래는 내가 설정한 도커 컴포즈이다.

version: "3.3"

services:
  app:
    build:
      context: ../../app
      dockerfile: ../docker/local/Dockerfile
    container_name: wallet_worrior_backend
    environment:
      - NODE_ENV=local
    ports:
      - "3001:3001"
    depends_on:
      - ts_db
    networks:
      - app-network

  ts_db:
    image: mysql:8.0
    cap_add:
      - SYS_NICE
    volumes:
      - ./wallet_worrior_db_dump/:/docker-entrypoint-initdb.d/
      - /etc/localtime:/etc/localtime:ro
      - type: bind
        source: ./cnf/my.cnf
        target: /etc/mysql/conf.d/my.cnf
    restart: always
    container_name: wallet_worrior_DB
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: WALLET_WORRIOR_DB_SCHEMA
      MYSQL_USER: wallet_worrior
      MYSQL_PASSWORD: wallet2024
    command: --default-time-zone=Asia/Seoul
    ports:
      - "3306:3306"
    expose:
      - "3306"
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

mysql 포트 또한 3306으로 지정해준다.

 

이렇게 하면 우선 ec2에 올릴 도커 컴포즈는 완성된 상태이다.

2편에서는 ec2에서 도커 및 도커 컴포즈를 설치하고 서버를 띄우는 것 까지 하려고 한다.

반응형