본문 바로가기

Docker & K8S

Chapter3 - docker-compose

안녕하세요 개발자 정씨입니다.

지난시간에는 NodeJS APP을 이미지로 만들고 컨테이너로 띄우는 작업을 진행했습니다.

정상적 동작하는 것 처럼 말씀드렸으나, 사실은 해당 APP은 DB와의 연결 부분에서 미흡한 부분이 있습니다.

 

1. 문제해결 : docker network 사용

  • APP과 DB가 연결되지 않는 이유는 같은 네트워크안에 없어 서로 인식하지 못하기 때문입니다.
  • 때문에 docker network를 생성하고 해당 네트워크에 DB와 APP을 포함시켜 서로 인식할 수 있게 해보겠습니다.
docker network create my-network			# 네트워크 생성
docker network connect my-network mysql-container	# 네트워크와 mysql-container 연결

 

 

  • 아래 명령어를 이용해 현재 network의 상세 정보를 확인 할 수 있습니다.
docker inspect my-network

 

 

  • mysql 컨테이너가 정상적으로 네트워크에 포함된 것을 확인하였습니다.

 

  • 이제 APP도 network에 추가 시켜야 하는데, 그 전에 프로젝트의 DBClient.js에 대한 수정이 필요합니다.
  • local 환경과 docker 환경에서 유동적으로 동작할 수 있게끔 env를 설정합니다.
  • docker 환경에서는 host를 'mysql-container'로 설정하고 연결합니다.
const { Sequelize } = require('sequelize');

const sequelize = new Sequelize({
  dialect: 'mysql',
  host: process.env.NODE_ENV === 'docker' ? 'mysql-container' : 'localhost',
  port: 3306,
  username: 'root',
  password: '1q2w3e4r!',
  database: 'sakila',
});

module.exports = sequelize;

 

 

  • 위의 설정에 따라 dockerfile도 수정해줍니다.
FROM node:18
WORKDIR /app
COPY . .
ENV NODE_ENV=docker
RUN npm install
RUN npm install -g pm2
CMD ["pm2-runtime", "dist/app.js"]

 

 

  • 이후 이미지 빌드, 컨테이너 실행, 네트워크 연결을 통해 APP과 DB 연결을 완료 시켜 줍니다.
docker build -t main-server .
docker run --name server-container -p 3000:3000 main-server
docker network connect my-network server-container

 

 

2. 문제해결 : docker-compose 사용

  • 위의 방법말고도 docker-compose를 사용할 수 있습니다.
  • docker-compose를 사용하면 컨테이너 간의 의존성을 설정하고, 여러 컨테이너를 단일 명령으로 시작하고 관리할 수 있습니다.
  • docker-compose.yml을 아래와 같이 작성해보았습니다.
version: '3'
services:
  app:
    image: main-server:latest
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      - MYSQL_HOST=db
      - MYSQL_USER=root
      - MYSQL_PASSWORD=1q2w3e4r!
      - MYSQL_DATABASE=sakila

  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=1q2w3e4r!
    ports:
      - "3306:3306"

 

 

  • DBClient.js와 dockerfile은 env에 종속되는 것이 아닌 docker-compose.yml의 설정에 따르게 수정하였습니다.
const { Sequelize } = require('sequelize');

const sequelize = new Sequelize({
  dialect: 'mysql',
  host: process.env.MYSQL_HOST || 'localhost',
  port: process.env.MYSQL_PORT ? parseInt(process.env.MYSQL_PORT) : 3306,
  username: process.env.MYSQL_USER || 'root',
  password: process.env.MYSQL_PASSWORD || '',
  database: process.env.MYSQL_DATABASE || 'sakila',
});

module.exports = sequelize;

 

FROM node:18
WORKDIR /app
COPY . .
RUN npm install
RUN npm install -g pm2
CMD ["pm2-runtime", "app.js"]

 

 

  • 수정된 내용으로 이미지를 빌드해주고, 명령어를 통해 docker-compose를 실행해 줍니다.
docker build -t main-server .
docker-compose up

'Docker & K8S' 카테고리의 다른 글

Chapter2 - Dockerfile 작성  (0) 2023.09.28
Chapter1 - 설치 및 실행  (0) 2023.09.09