Dockerize project 01... 이어서
프론트엔드 배포와 마찬가지로 백엔드 서버도 도커로 배포해보자!
Node.js 이미지 생성을 위한 Dockerfile
을 작성한다.
FROM node:14.18.3
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 8000
CMD [ "node", "server.js" ]
MySQL Docker 이미지를 다운로드한다.
$ docker pull mysql:<version>
docker-compose 를 통해 Node.js 와 MySQL 컨테이너를 서로 의존적으로 실행가능하다.
아래와 같이 docker-compose.yml
을 작성한다.
version: '3'
services:
node:
build: .
ports:
- "8000:8000"
expose:
- "8000"
links:
- mysql
depends_on:
- mysql
mysql:
image: "mysql"
ports:
- "3306:3306"
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "true" # 현재 프로젝트에서는 패스워드 설정 따로 없이 진행.
expose:
- "3306"
명령어로 실행 및 확인
$ docker-compose up
# ...
$ docker ps -a
# output example
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5887f1d3e5a be_node "docker-entrypoint.s…" 41 hours ago Up 41 hours 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp be_node_1
791137677c9a mysql "/entrypoint.sh mysq…" 41 hours ago Up 41 hours (healthy) 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp be_mysql_1
이 시점에서 현재 구동되고 있는 MySQL 컨테이너에는, MySQL user, database 등이 아무것도 없다!!
MySQL 컨테이너에 접속하여 설정을 완료해야 한다.
# 특정 컨테이너에 접속하여 bash shell 열기
$ docker exec -it <container_id> bash
$ mysql
그러나 Node 에서 MySQL 서버에 연결하지 못하는 에러가 발생한다.
기존의 mysql connection 코드
const mysql = require("mysql2/promise");
const pool = mysql.createPool({
host: "localhost",
user: "<user_name>",
database: "<database_name>",
writeforConnection: true,
connectionLimit: 10,
queueLimit: 0,
});
module.exports = { pool };
Error: connect ECONNREFUSED 127.0.0.1:3306
mysql createPool 코드에서, host 를 localhost 가 아닌, docker MySQL container 의 IP 로 수정해야 한다.
$ docker inspect <container_id>
위 명령어를 통해 MySQL container 의 IP 주소를 얻을 수 있다.
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
mysql createPool 코드에서 작성한 user 에게, MySQL 서버에서 권한 부여를 해주어야 한다.
$ mysql> grant all privileges on *.* to <user>