인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

yerincho94님의 프로필 이미지

작성한 질문수

따라하며 배우는 도커와 CI환경 [2023.11 업데이트]

Docker compose 관련 공유

작성

·

29

0

강의 내용 똑같이 따라해봐도 redis, node 버전 관련 문제로 실행할 수 없었습니다..!

저는 아래 코드로 테스트 성공했으니 참고 부탁드려요!

 

Dockerfile

>>>> node version 16

FROM node:16

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

 

package.json

>>> redis version 4.7.0

{
  "name": "nodejs-docker-compose-app",
  "version": "1.0.0",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "express": "4.17.1",
    "redis": "4.7.0"
  },
  "author": "",
  "license": "ISC",
  "description": ""
}

 

docker-compose.yml

version: "3"
services:
  redis-server:
    image: redis
    container_name: redis-server
    restart: unless-stopped
    expose:
      - 6379
  node-app:
    depends_on:
      - redis-server
    build:
      context: .
      dockerfile: Dockerfile
    container_name: node-app
    restart: on-failure
    ports:
      - "8081:8080"

 

server.js

const express = require("express");
const redis = require("redis");

const app = express();

// Redis 클라이언트 생성
const client = redis.createClient({
    socket: {
        host: "redis-server",
        port: 6379
    }
});

async function connectToRedis() {
    let connected = false;
    while (!connected) {
        try {
            await client.connect();
            console.log('Connected to Redis');
            connected = true;
        } catch (error) {
            console.error('Error connecting to Redis:', error);
            console.log('Retrying in 2 seconds...');
            await new Promise(resolve => setTimeout(resolve, 2000));
        }
    }
}

// Express 엔드포인트 설정
app.get('/', async (req, res) => {
    try {
        let number = await client.get('number');
        
        if (number === null) {
            number = 0;
        }

        console.log('Number: ' + number);
        res.send("숫자가 1씩 올라갑니다. 숫자: " + number);

        await client.set("number", parseInt(number) + 1);
    } catch (error) {
        console.error('Error:', error);
        res.status(500).send('Redis 연결 오류');
    }
});

// 서버 시작 전에 Redis 연결
app.listen(8080, async () => {
    await connectToRedis();  // 서버 시작 시 Redis 연결 시도
    console.log('Server is running on port 8080');
});

 

모두 저장 후 터미널에서

docker compose down
docker compose up --build

 

 

 

 

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. yerincho94님.

도커와 CI 환경에서 발생하는 버전 문제로 인해 실행이 어려우셨군요. 주신 코드로 문제를 해결하셨다니 다행입니다. 특히, Node.js 버전을 16으로 설정하고 Redis 버전을 4.7.0로 사용하는 것이 주요 변경사항으로 보입니다. 이러한 버전 설정은 호환성 문제 해결에 매우 중요합니다.

Docker Compose 설정에서도 redis-server라는 컨테이너 이름을 사용하고, node-app에서는 Redis 서버에 대한 연결 설정을 정확히 하셨습니다. server.js 코드에서 Redis에 연결을 시도하며, 연결 실패 시 다시 시도하는 부분이 인상적입니다. 이는 네트워크 지연 등의 문제에서 안정성을 제공합니다.

혹시 더 많은 정보를 얻고 싶으시다면 Docker compose 에러 해결에서 유사한 문제 해결에 대한 설명을 찾아보실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.