본문 바로가기
Dev-ops/docker

Docker-compose 로 Node App + DB 구축

by livemehere 2023. 1. 2.

docker는 할때마다 참 애를 먹였던 녀석입니다.

물론 실제로 도커하나로 앱서버와 데이터베이스를 한번에 구성하는 일은 없어야 하지만,

심플하게 구성해보고 싶은 마음에 만들어보았습니다.

 

언제나 잔가지는 필요할 때 추가하고, 기능이 돌아가기 위한 최소한을 구성하였습니다.

 

NodeJS App

FROM node:alpine

WORKDIR /app

COPY package*.json ./

COPY yarn.lock ./

RUN yarn

COPY . .

CMD ["yarn","start:docker"]

가장 간단하게 노드를 돌리는 컨테이너를 만드는 방법입니다.

도커를 빌드할 때 캐싱을 활용해서 빌드시간을 줄이기 위해서, 그냥 복사하지 않고,

package.json 을 별도로 복사합니다(이것은 국룰!)

Docker-compose ( + MySQL )

version: "3.9"
services:
  slack-db:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
    ports:
      - '3306:3306'
    volumes:
      - db-volume:/var/lib/mysql
    networks:
      - slack_network

  slack-node-server:
    build: .
    ports:
      - "3000:3000"
    networks:
      - slack_network
    depends_on:
      - slack-db

volumes:
  db-volume:

networks:
  slack_network:

.dockerignore

node_modules

CLI

docker build . -t slack-server
docker-compose --env-file ./.env.development up -d 

저는 슬랙을 만들어 보면서 진행했습니다.

여기서 핵심은

1. env

2. volumes

3. networks

입니다.

 

1. 어떤 플랫폼을 사용하던지 환경변수로 값을 관리하는 것은 유지보수, 보안 측면에서 우수합니다.

docker-compose에서 그대로 날것은 값을 상요하지 않고, .env 파일을 자동으로 인식하기 때문에 ${} 문법을 사용하였습니다.

default 는 .env 이지만 cli에서 저처럼 변경해 줄 수 있습니다.

 

2. 볼륨을 사용하는 것은 데이터베이스 때문이었습니다.

서버 코드가 업데이트 되면 도커를 다시 패키징 하기 때문에, 디비도 모두 다시 설치되는 문제가 있습니다.

볼륨을 설정해두면 컨테이너가 새로 실행되어도, 지정한 저장소는 유지하게 되는데, mysql의 저장소를 지정하여, 데이터를 유지할 수 있도록 했습니다.

 

3. 네트워크는 서로다른 컨테이너 간의 통신을 위해 세팅해 주어야합니다.

docker-compose에서 네트워크를 선언하고, 컨테이너별로 묶어주면 alias가 생성됩니다.

alias란 localhost -> 127.0.0.1 과 같은 변수를 말합니다.

이때 컨테이너 이름들이 각각 도커상에서 내부 아이피를 가리키게 됩니다.

 

예시)

DB_HOST=slack-db
DB_PORT=3306

 

삽질 포인트

CMD ["yarn","start:docker"]

1. Dockerfile에서 명령어 실행부에 쌍따옴표를 해주어야 인식합니다.

'' single quote 가 손에 익은 저는 30분가량을 해맸습니다..

 

2. env파일 path는 cli 때 옵션으로 명시해줄 수 있습니다.

compose 파일에 env_file 속성을 명시해봤으나.. 인식되지 않습니다 (버근가..??)

 

반응형

'Dev-ops > docker' 카테고리의 다른 글

Docker 간단 정리  (0) 2023.02.03