Docker compose를 이용하여 간단한 Nodejs 및 Redis 서버 구축
Docker Compose란 무엇인가?
docker compose는 다중 컨테이너 도커 애플리케이셔을 정의하고 실행하기 위한 도구
NodeJS, Redis 서버를 Docker compose로 구성해보자
Application 작성
- docker-compose-app 디렉토리 생성
- 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"
}
- 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 서버에 접근을 할 수 없게 된다.
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