Docker compose를 이용하여 간단한 Nodejs 및 Redis 서버 구축


Docker Compose란 무엇인가?

docker compose는 다중 컨테이너 도커 애플리케이셔을 정의하고 실행하기 위한 도구

NodeJS, Redis 서버를 Docker compose로 구성해보자

Application 작성

  1. docker-compose-app 디렉토리 생성
  2. npm init (-> package.json 파일 생성)
    # docker-compose-app 디렉토리에서 cmd 명령어 실행
    npm init
    

package.json 파일 수정(scripts-start, dependencies)

{
  "name": "docker-compose-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "express": "4.17.1",
    "redis": "3.0.2"
  },
  "author": "",
  "license": "ISC"
}
  1. server.js 파일 생성 후 아래 코드 작성
const express = require("express");
const redis = require("redis");
//레디스 클라이언트 생성
const client = redis.createClient({
    host:"", 
    port: 6379
})

const app = express();

app.get('/', (req,res) => {
    client.get("number", (err,number) => {
        //현재 숫자를 가져온 후에 1씩 올려줍니다.
        client.set("number", parseInt(number) + 1)
        res.send("숫자가 1씩 올라갑니다. 숫자: " + number)
    })
})

app.listen(8080);
console.log('Server is running');

(도커 환경에서 레디스 클라이언트 생성시 주의 사항)

  • 도커를 사용하지 않는 환경에서는 서버가 작동되고 있는 host 옵션을 URL로 준다.
    const client = redis.createClient({
      host:"https://redis-server.com",
      port: 6379
    });
    
  • 도커 환경에서는 host 옵션을 docker-compose.yml 파일에 명시한 컨테이너 이름으로 주면된다.
const client = redis.createClient({
    host: "redis-server",
    port: 6379
})

Dockerfile 작성

Dockerfile 생성 및 아래 코드 작성

FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

CMD ["node", "server.js"]

서버 실행

레디스 클라이언트가 작동하려면 레디스 서버가 켜져있어야 하기 때문에 레디스 서버 컨테이너를 실행하고 노드 js 컨테이너를 실행

docker build -t abj/docker-compose-app ./
docker run -p 5000:8080 abj/docker-compose-app

하지만 이렇게 실행하게 되면 아래 그림과 같이 컨테이너 사이에는 아무런 설정 업싱 접근을 할 수 없기 때문에 NodeJS 서버에서 Redis 서버에 접근을 할 수 없게 된다.

img

Docker Compose 파일 작성

이러한 문제를 해결하기 위해 docker compose를 사용한다.

  • docker-compose.yml 파일 생성
version: "3
services:
    redis-server:
        image: "redis"
    node-app:
        build: .
        ports:
            - "5000:8080"
# 이미지가 없을 때 이미지를 빌드하고 컨테이너 시작
# d 옵션은 detach(compose 실행 후 추가 명령어 입력 가능)
docker-compose (-d) up
# 이미지가 있든 없든 이미지를 빌드하고 컨테이너 시작
docker-compose up --build
# compose 실행 중지
docker-compose down

실행 결과

img

최종 디렉토리 구조

img


© 2020. All rights reserved.