[Docker] 도커컴포즈 Redis

2023. 8. 10. 16:49초기 과업/DevSecOps

작성자알 수 없는 사용자

728x90
반응형

 
안녕하세요. 기깔나는 사람들에서 DMSO를 맡고있는 정우입니다.
지난번 도커컴포즈 를 이용해 Wordpress 앱을 만들어봤는데
오늘은 Redis 사용해보겠습니다.


도커 파일만들고 npm init

 
디펜던시 추가
 - redis 와 express를 사용해줄게요

 
 
index.js를 추가해줍니다.

 

const express = require("express");

const redis = require("redis");

const app= express();
app.listen(8080);

console.log("Server is working")

 
레디스(Redis)란 ?
REmote Dictionary Server
데이터 관리 시스템이며, 모든 데이터를 메모리에 저장하고
빠르게 조회할 수 있는 비 관계형 데이터베이스(NoSql)이다
 
 
레디스를 사용하는 이유는??
메모리에 저장하기 때문에
데이터를 불러올 때 빠르게 처리 가능
비록 메모리에 저장하지만 영속적으로 보관이 가능합니다.
 
그렇기에 서버를 재부팅 해도 데이터를 유지할 수 있는 장점이 있습니다. 
 


Node.js 환경에서 Redis 사용방법

 

 

  1. Redis-server를 작동시키기
  2. redis 모듈을 다운받기  => dependencies
  3. 레디스 모듈을 받은 후 레디스 클라이언트를 생성하기 위해서 Redis에서 제공하는 createClient() 함수를 이용해서 redis.createClient로 레디스 클라이언트를 생성
  4. 하지만 여기서 redis server가 작동하는 곳과 Node.js 앱이 작동하는 곳이다른 곳이라면 host 인자와 port 인자를 명시해주어야 한다.

 
레디스 클라이언트를 생성 

 
주의할 것!!
host에 작성해주는 것은 도커환경과 레디스 환경이 다른데

//레디스 클라이언트 생성
const client = redis.createClient({

    //도커 환경 : "docker-compose.yml 파일에서 지정한 컨테이너 이름"
    // redis 환경 : "https://redis-server.com"
    host : "redis-server",
    //레디스 기본포트
    port : 6379
});

 
 
 
 
구현단계
숫자를 0부터 1씩 올라가도록 구성
 

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

})

 
 
 
전체 index.js 파일: 

// Express 모듈 불러오기
const express = require('express')
const redis = require('redis')

// 레디스 클라이언트 생성
const client = redis.createClient({
    host: 'redis-server',
    port: 6379
})

// Express App 생성하기
const app = express()

// 숫자는 0부터 시작합니다.
client.set('number', 0)

app.get('/', (req, res) => {
    client.get('number', (err, number) => {
        res.send('숫자가 1씩 올라갑니다. 숫자: ', +number)
        client.set('number', parseInt(number) + 1)
    })
})

// Express App 시작하기
app.listen(8080, () => {
    console.log('Server is running.')
})

 
 


Dockerfile 작성하기

 
간단한 도커 파일 생성

FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

 


Docker Containers 간 통신시의 에러
application 소스와 Dockerfile까지 작성했으니
실제로 어플을 실행해볼게요

 
1. 먼저 redis 서버를 실행해줘야합니다

 
 
다른 터미널에서 
도커 파일을 이용해 노드를 실행해봅니다.

Error: Redis connection to redis-server:6379 failed - 

getaddrinfo ENOTFOUND redis-server redis-server:6379

    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)

Emitted 'error' event at:

    at RedisClient.on_error (/usr/src/app/node_modules/redis/index.js:406:14)

    at Socket.<anonymous> (/usr/src/app/node_modules/redis/index.js:279:14)

    at Socket.emit (events.js:198:13)

    at emitErrorNT (internal/streams/destroy.js:91:8)

    at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)

    at process._tickCallback (internal/process/next_tick.js:63:19)

 
왜 에러가 발생했나 ? 
node와 redis가 서로 다른 컨테이너에 있는데 서로 연결이 안되기 때문에..
이럴땐 Docker Compose를 사용해주면 됩니다. 
 


Docker Compose 파일 작성하기

 

version: "3"
services:
    redis-server:
      image: "redis"
    node-app:
      build: .
      ports:
        - "5050:8080"

 
 
주의!! yml 파일에서 띄어쓰기 조심!!
 
도커 컴포즈로 앱실행

$ docker-compose up

 
 
왜 에러가 발생했나? 
redis 버전이 바뀌면서 새로 변경되었다고 합니다.
 
redis버전을 낮춰주겠습니다.

 
빌드를 다시 해주면서 도커컴포즈를 실행해줄게요

$ docker-compose up --build

 

docker-compose up vs docker-compose up --build

 

docker-compose up  : 이미지가 없을때 이미지를 빌드하고 컨테이너 시작
docker-compose up  --build: 이미지가 있든 없든 이미지를 빌드하고 컨테이너 시작
 
 
저는 이래도 js에서 에러가 발생해서
index.js 부분 변경해주었습니다.

 
전체 코드

// Express 모듈 불러오기
const express = require('express')
const redis = require('redis')

// 레디스 클라이언트 생성
const client = redis.createClient({
    host: 'redis-server',
    port: 6379
})

// Express App 생성하기
const app = express()

// 숫자는 0부터 시작합니다.
client.set('number', 0)

app.get('/', (req, res) => {
    client.get('number', (err, number) => {
        client.set("number", parseInt(number)+1)
        // res.send("숫자가 1씩 올라갑니다. 숫자:"+number)
        res.send('Docker-Compose 로컬 실행 성공: '+ number)
    })
})

// Express App 시작하기
app.listen(8080, () => {
    console.log('Server is running.')
})

 

 
 
 
 


참고자료

🔗 - 인프런 - 따라하며 배우는 도커와 CI 환경
 

 
 
 

728x90
반응형