본문 바로가기
[항해99]

프로젝트에 도커 도입

by 프잘백 2022. 3. 23.
728x90

 

1. .dockerignore 파일

docker 이미지를 빌드할 때 제외할 파일을 정해준다.

# Logs
logs
*.log
npm-debug.log*

# Dependency directories
node_modules/

# dotenv environment variable files
.env

.gitignore

 


2. Dockerfile.dev

# 노드를 베이스로 생성
FROM node:16.13.1

# mysql이 실행 할 준비가 되고 나서 실행할 수 있도록
ENV DOCKERIZE_VERSION v0.2.0
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \  
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz


# app 디렉토리 , working 디렉토리 생성

RUN npm install -g nodemon
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install dependencies
COPY package*.json .
RUN npm install

# Bundle app source
COPY . .

RUN chmod +x docker-entrypoint.sh  
ENTRYPOINT ./docker-entrypoint.sh

# Exports
EXPOSE 8080

FROM : 사용할 이미지 베이스를 생성한다.

ENV ~ RUN wget : dockerize라는 프로그램은 도커 컨테이너의 실행순서를 결정해줄 수 있는 프로그램이다. mysql의 작동 준비가 완료되고 node가 실행되어야 sequelize sync를 맞출 수 있다.

https://stackoverflow.com/questions/54639183/sequelize-cannot-sync-to-mysql-in-a-docker-container-from-node-express-app-econ

 

Sequelize cannot sync to MySQL in a docker container from Node/express app (ECONNREFUSED)

I am using sequelize, MySQL and docker together for the first time and cannot get sequelize to connect to the db. I have tested the presence of the DB with DBeaver and I can connect. I can also se...

stackoverflow.com

install dependencies : 모듈을 빌드하지 않고 해당 이미지 내에서 npm install로 package.json을 참고해서 빌드한다. package*.json 은 package-lock.json도 참고해 모듈의 version을 특정한다.

 


3.docker-entrypoint.sh

# docker-entrypoint.sh for node.js
# 서버를 시작하기 전에 db가 준비될 때 까지 20초의 텀을 가진다.
echo "wait db server"
dockerize -wait tcp://db:3306 -timeout 20s

echo "start node server"
nodemon index.js

위의 sequelize sync를 맞추기 위해 docker-entrypoint.sh에서 db가 실행되기 전 20초의 텀을 가지므로 실행 준비 완료 상태가 될 시간을 준다.

 


4. docker-compose.yml

version: "3.5"
networks:
  nemo-net:
services:
   mysql:
     networks:
       - nemo-net
     image: mysql
     restart: always
     env_file:
       - .env
     ports:
       - "3306:3306"
     environment:
       - MYSQL_ROOT_PASSWORD="${SQUARE_WITH_ME_DB_PASSWORD}"
  server:
    networks:
      - nemo-net
    build:
      context: .
      dockerfile: Dockerfile.dev
    container_name: nemo_BE
    restart: always
    env_file:
      - .env
    ports:
      - "${PORT}:80"
    environment:
       MYSQL_HOST: mysql 
       MYSQL_USER: root
       MYSQL_ROOT_PASSWORD: ${SQUARE_WITH_ME_DB_PASSWORD}
       MYSQL_DATABASE: sqare_with_me
       MYSQL_PORT: 3306
     depends_on:
       - mysql
     links:
       - mysql

docker-compose 파일은 다음과 같이 작성했다. $를 기재한 부분은 .env의 값을 가져오기 위함이다.

9. Docker-compose에서 환경 변수 설정하기(.env파일) (node.js) (tistory.com)

 

9. Docker-compose에서 환경 변수 설정하기(.env파일) (node.js)

1. 구조 .env파일은 docker-compose와 같이 최상단에 있어야 한다. 2. .env 파일 PORT=8080 SQUARE_WITH_ME_PASSWORD=12345678 port는 서버 listen 할 포트번호이고 square with me password는 프로젝트 db(mysq..

l-0-l.tistory.com

 

depends_on: 서비스 간 의존관계를 나타낸다.

links: 컨테이너 간의 연결을 나타낸다.

 


 

댓글