티스토리 뷰

[Docker] express 서버 + db 구축하기 이전 포스트에서 express 서버 이미지를 생성하였다.

[Docker] express 서버 컨테이너 생성하기

이제 해당 서버와 db를 연동하여 마무리를 해보자.

express 서버 환경 구성

도커로 여러 사이트에 배포시에 사이트 마다 포트 정보가 달라질 수 있다.

그러기 위해서는 유연하게 포트 설정을 할 수 있게 해야하는데, 이럴 때 사용하는 것이 환경변수 이다.

dotenv 라이브러리를 이용하여 개발 및 운영환경에 사용 할 환경 변수를 설정 해놓는다.

env 파일

development.env

## Environment ##
NODE_ENV=development

## Server ##
PORT=8010
HOST=localhost

## DB ##
DB_HOST=localhost
DB_PORT=5432
DB_NAME=postgres
DB_USER=postgres
DB_PWD=postgres1!

production.env

실제 배포용 환경변수 파일은 Docker Compose에서 설정 할 것이므로 크게 의미는 없으나, 해당 파일에 환경 변수를 그대로 사용하는 거면 꼭 필요하다.

## Server ##
PORT=8010
HOST=localhost

## DB ##
DB_HOST=db
DB_PORT=5432
DB_NAME=postgres
DB_USER=postgres
DB_PWD=postgres1!

EnvVars.ts

각 환경 변수에 대한 객체 정보이다. 서버 구동 및 DB 연결 시 해당 객체를 import 해서 사용한다.

export default {
    NodeEnv: process.env.NODE_ENV ?? '',
    Port: process.env.PORT ?? 0,
    WsPort: process.env.WS_PORT ?? 0,
    Db: {
        Host: process.env.DB_HOST ?? '',
        Port: process.env.DB_PORT ?? 0,
        Name: process.env.DB_NAME ?? '',
        User: process.env.DB_USER ?? '',
        Pwd: process.env.DB_PWD ?? '',
    },
} as const

위와 같이 환경변수로 서버 및 DB 구동 준비가 되었으면, Docker Compose를 통해 유연하게 환경변수를 바꾸어 사용할 준비가 된 셈이다.

실제 사용 코드

Docker Compose 작성

Docker Compose 관련 내용은 공식문서 참조.

docker-compose.yaml

networks:
  my-network:
    name: my-network
    driver: bridge
volumes:
  v-portainer:
  v-postgres:
services:
  my-postgres:
    container_name: my-postgres
    image: postgres
    ports:
      - 5432:5432
    environment:
      - POSTGRES_PASSWORD=postgres1!
      - POSTGRES_USER=postgres
      - POSTGRES_DB=postgres
    volumes:
      - v-postgres:/var/lib/postgresql/data \\
    restart: always
    networks:
      - my-network
  my-express-image:
    container_name: my-express-image
    image: xm-union-manage
    environment:
      - PORT=8010
      - DB_HOST=my-postgres
      - DB_PORT=5432
      - DB_NAME=postgres
      - DB_USER=postgres
      - DB_PWD=postgres1!
    ports:
      - 8010:8010
    depends_on:
      - my-postgres
    restart: always
    networks:
      - my-network

주요 설정

  • network
    • 컨테이너간 통신을 하기 위해서 필요한 작업.
      • 같은 네트워크인 경우 service 명을 호스트 명으로 사용하여 접근이 가능하다.
      my-express-image:
          ...
          environment:
            - PORT=8010
            - DB_HOST=my-postgres
    • network 요소를 생성하여 db와 server를 하나의 network로 묶어준다.
  • postgres image
    • postgres DB를 이용하였다.
    • 세부 환경 설정은 공식문서 참조.
  • environment
    • 서버에서 사용 했던 환경변수를 Docker Compose에서 설정해준다.
    • Compose file 내용만 바꾸면 원하는 정보로 얼마든지 바꿀 수 있다.

    • 선행적으로 생성되어야 할 컨테이너를 지정할 때 사용
    • 서버는 DB가 생성된 후 생성되어야 하므로 아래와 같이 지정 하였음

*️⃣ 포트 변경 하기

Server Port or DB Port 를 변경해야 할 일이 종종 있다. 그럴 때는 바인딩 포트 정보만 바꿔주면 된다.

위의 예시는 postgres DB 포트를 변경한 예시이다.

5432 → 5434 포트로 변경 하였다.

<host port>:<container port> 구조로 host port 정보만 바꿔주면 된다.

컨테이너 구동

docker-compose.yaml 파일을 이용하여 최종적으로 컨테이너를 구동해보자.

해당 파일이 있는 위치에서 docker compose 명령어로 컨테이너를 생성한다.

$ ls
... docker-compose.yaml ...

$ docker compose up -d

마치며

위와 같은 메커니즘을 이해하고 있으면 얼마든지 응용이 가능하다.

SPA App을 docker compose와 묶어서 Front-end, Back-end 프로세스를 한번에 올릴 수도 있다.

SPA App 배포 설정은 여기를 참조.

끝 🫰

댓글