이전에 docker를 이용하여 EC2에 연결을 한 것을 포스팅했다. docker-compose로 배포해보려고 생각하다가 오늘 docker-compose 실행에 성공해서 기록한다.
docker-compose는 여러 (docker) 이미지를 한 번에 올릴 수 있는 기능이다.
이전에 redis를 직접 설치하고, EC2에 설치하는 방식을 통해 서버를 실행시켰는데 이번에 docker-compose에 이미지를 불러와 실행시키는 방식을 사용했다.
back과 front 폴더가 따로 있어 둘 다 실행시켜야 하기 때문에 각 폴더 내에 dockerfile을 생성한다.
FROM node:16-alpine3.11
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD [ "npm", "start" ]
EXPOSE 5001
위는 백엔드 폴더내에 생성한 dockerfile로 백엔드는 5001번 포트로 실행시킨다.
docker-compose 파일은 여러 이미지를 한번에 올리는 것이기 때문에 root에 생성해준다. 아래와 같이 폴더 구조를 만들어주면 된다.
version: '3'
services:
nodeapp:
build:
context: "./back"
dockerfile: dockerfile
container_name: "nodeapp"
working_dir: "/app/back"
ports:
- "5001:5001"
links:
- "noderedis"
noderedis:
image: "redis:3"
container_name: "noderedis"
위 코드처럼 nodeapp 컨테이너에는 back 폴더의 코드를 실행한 이미지를 만들고
noderedis 컨테이너에는 docker-hub에 올라와있는 redis 이미지를 불러온다.
nodeapp, noderedis는 임의로 정해주는 컨테이너 이름이다.
docker에 올린 redis 사용하기
import { createClient } from "redis";
const CLIENT_BASE_URL = "noderedis";
const client = createClient({
url: `redis://${CLIENT_BASE_URL}:6379`,
});
기존 코드에서 url만 redis 이미지의 컨테이너 이름으로 바꿔주면된다.
docker-compose up -d --build
위 명령어를 실행하면 이미지를 build하고 background에서 실행 시킨다. 다음과 같이 실행에 성공하면 두 가지 컨테이너가 실행된다.
docker ps
실행중인 컨테이너 목록을 확인해 볼 수 있다.
docker-compose build
를 하는데 자꾸 bcrypt 관련된 오류가 생겼다. 아무리 구글링해도 원하는 결과가 나오지않았는데 겨우 찾은 방법은 bcrypt
대신 bcryptjs
를 설치해서 사용하는 것이다.
import bcrypt from 'bcrypt'
대신
import bcrypt from 'bcryptjs'
으로 바꿔주면 된다.
처음에는 이 방식 말고 bcrypt-nodejs
를 설치했는데 이 모듈은 기존의 bcrypt
의 사용법과 조금 달라서 또 다른 오류가 발생했다. 그냥 bcryptjs
를 사용하는 게 좋을 것 같다.
docker-compose에 올린 redis 이미지 실행이 안돼서 시간이 걸렸다. 알고보니 기존에 잘못되어있던 코드가 다시 build 되지 않았던 문제로 docker에서 실행중인 Container들을 모두 중지/삭제 시킨 후
docker-compose up -d --build
해주니 잘 실행됐다.
코드가 바뀔땐 컨테이너를 중지/삭제 해보고 다시 실행해보자...