안녕하세요 개발자 정씨입니다.
지난시간에는 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 |