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

느엉느엉느엉님의 프로필 이미지

작성한 질문수

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

Docker Compose 파일 작성하기

docker-compose up 시 오류

작성

·

2.1K

·

수정됨

0

다른 질문도 참고해보았지만 도저히 해결이 안되네요

 

아래는 오류 로그입니다.

ui-MacBookAir docker-compose-app % docker-compose up
[+] Running 2/0
 ⠿ Container docker-compose-app-node-app-1      Created                                                                                                  0.0s
 ⠿ Container docker-compose-app-redis-server-1  Recreated                                                                                                0.0s
Attaching to docker-compose-app-node-app-1, docker-compose-app-redis-server-1
docker-compose-app-redis-server-1  | 1:C 04 Mar 2023 11:43:49.189 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
docker-compose-app-redis-server-1  | 1:C 04 Mar 2023 11:43:49.189 # Redis version=7.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
docker-compose-app-redis-server-1  | 1:C 04 Mar 2023 11:43:49.189 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
docker-compose-app-redis-server-1  | 1:M 04 Mar 2023 11:43:49.189 * monotonic clock: POSIX clock_gettime
docker-compose-app-redis-server-1  | 1:M 04 Mar 2023 11:43:49.190 * Running mode=standalone, port=6379.
docker-compose-app-redis-server-1  | 1:M 04 Mar 2023 11:43:49.190 # Server initialized
docker-compose-app-redis-server-1  | 1:M 04 Mar 2023 11:43:49.192 * Ready to accept connections
docker-compose-app-node-app-1      | server is running
docker-compose-app-node-app-1      | events.js:174
docker-compose-app-node-app-1      |       throw er; // Unhandled 'error' event
docker-compose-app-node-app-1      |       ^
docker-compose-app-node-app-1      | 
docker-compose-app-node-app-1      | Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
docker-compose-app-node-app-1      |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
docker-compose-app-node-app-1      | Emitted 'error' event at:
docker-compose-app-node-app-1      |     at RedisClient.on_error (/usr/src/app/node_modules/redis/index.js:341:14)
docker-compose-app-node-app-1      |     at Socket.<anonymous> (/usr/src/app/node_modules/redis/index.js:222:14)
docker-compose-app-node-app-1      |     at Socket.emit (events.js:198:13)
docker-compose-app-node-app-1      |     at emitErrorNT (internal/streams/destroy.js:91:8)
docker-compose-app-node-app-1      |     at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
docker-compose-app-node-app-1      |     at process._tickCallback (internal/process/next_tick.js:63:19)
docker-compose-app-node-app-1 exited with code 1
^CGracefully stopping... (press Ctrl+C again to f

 

나머지는 소스 파일입니다.

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

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

CMD ["node", "server.js"]
{
  "name": "docker-compose-app",
  "version": "1.0.0",
  "description": "",
  "main": "server.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"
}
const express = require("express");
const redis = require("redis");

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

const app = express();

app.get("/", async (req, res) => {
    await client.connect();
    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);
    await client.disconnect();
});

app.listen(8080);
console.log("server is running");

강의 진도를 나갈 수가 없어서 답답합니다.

혹시 해결하신분들은 있으신가요..



 

답변 7

3

노드의 버전 때문일 확률이 높습니다.

제가 테스트 해본 결과
docker-compose up 명령은 yml파일에 "build ."과 같이 명시해주더라도,
매번 새롭게 이미지를 빌드하는 것이 아니라 이미 동일한 이름의 이미지가 있으면 업데이트를 하지 않고 그대로 이미지를 가져다 쓰는 것 같습니다.

그래서 저의 경우는 기존 도커 파일에
"RUN node:10" 부분을 "RUN node:18"로 수정 후
이미지 빌드를 따로 해준 뒤
"docker-compose up"을 실행하니 정상적으로 서버가 동작했습니다.

같은 상황이 아닐 수 있겠지만
한번 시도해보시는 것을 추천드립니다

교수님께서 수업 마지막에
docker-compose up --build를 통해
이미지를 재빌드 하면서 컴포즈를 실행시키는 모습을 보여주시는 것을 보았습니다.
노드 버전 수정 후, 이 방법을 사용해도 좋을 것 같습니다 ㅎㅎ

답변 감사합니다!😍 해보고 또 답변 달겠습니다 ㅎㅎ

감사함니다ㅠㅠ 기존에 있던 컨테이너, 이미지 다 지우고 docker-compose up 하니까 되네요ㅠㅠㅠ

감사합니다 덕분에 해결했습니다.
하 이런건 업데이트 되었으면 좋겠네여 무료강의도아닌데

2

저는 아래 방법으로 해결하였습니다.

공식 문서에 따르면 Redis 3 버전은 Promise를 지원하지 않는다고 하네요. 따라서 util 라이브러리를 이용하여 문제를 해결해야합니다. (dependencies util 추가)

Node Redis currently doesn't natively support promises (this is coming in v4), however you can wrap the methods you want to use with promises using the built-in Node.js util.promisify method on Node.js >= v8;

const { promisify } = require("util");
const getAsync = promisify(client.get).bind(client);

getAsync.then(console.log).catch(console.error);

 

const express = require("express");
const redis = require("redis");
const { promisify } = require("util");

//레디스 클라이언트 생성 
const client = redis.createClient({
  host: "redis-server",
  port: 6379
});
const getAsync = promisify(client.get).bind(client);
const setAsync = promisify(client.set).bind(client);

client.on('error',err => console.log('Redis Client Error',err));

const app = express();

app.get('/',async (req,res) => {
  let number = await getAsync('number');
  if (number === null) {
    number = 0;
  }
  res.send("숫자가 1씩 올라갑니다. 숫자: " + (parseInt(number)));
  await setAsync('number', (parseInt(number) + 1))
})

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

감사합니다^^

1

나도 포기;;;

싸다고 들엇는데 생각보다 다뤄지지 않은 오류가 너무 많네요.

끽해봐야 OS 몇개 안되는것도 그렇고

3년이면 노드 버전이 몇인데 아직도 이거 리뉴얼을 안하다니 좀 너무하다는 생각도 듭니다.

0

현재 작동되는 코드 입니다.

  • docker-compose.yml

     

version: '3'
services:
  redis-server:
    image: redis
    container_name: redis-container
    restart: unless-stopped
    expose:
      - 6379
  node-app:
    depends_on:
      - redis-server
    build:
      context: .
      dockerfile: Dockerfile
    container_name: node-app
    restart: on-failure
    ports:
      - "8787:8787"
  • server.js

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

const app = express();


app.get('/', async (req, res) => {
    await client.connect();
    let number = await client.get("number");
    if (number === null) {
        number = 0;
    }
    console.log('Number: ' + number)
    res.send("숫자가 1씩 올라갑니다. 숫자 : " + number)
    // 현재 숫자를 가져온 후 1씩 증가시킨다.
    await client.set("number", parseInt(number) + 1);
    await client.disconnect();
    
})


app.listen(8787);
console.log('server on!');
  • package.json

{
  "name": "docker-compose-app",
  "version": "1.0.0",
  "description": "",
  "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"
}
  • Dockerfile

FROM node

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

0

저는 노드 버전 16으로 바꿔서 빌드하고 실행하니 돌아가긴 합니다... (OS는 윈도우 입니다!)

혹시 도움이 되실까 해서 코드 남깁니다.

 

server.js

  • 이전 강의 강사님께서 남기신 코드 복붙

const express = require("express");

const redis = require("redis");


//레디스 클라이언트 생성 

const client = redis.createClient({

socket: {

host: "redis-server",

port: 6379

}

});


const app = express();

app.get('/', async (req, res) => {

await client.connect();

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)

await client.disconnect();;;

})

app.listen(8080);

console.log('Server is running');

 

package.json

  • 여기서 nodemon 모듈은 필요 없습니다.

{
  "name": "nodejs-app-example",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "express": "4.18.2",
    "nodemon": "^3.0.3",
    "redis": "4.6.12"
  },
  "author": "",
  "license": "ISC"
}

 

Dockerfile

  • 노드 버전 16으로 정한 이유는 딱히 없습니다.

# 베이스 이미지 -> node version 16
FROM node:16

# 워킹 디렉토리 설정
WORKDIR /usr/src/app

COPY package.json ./

# 종속성 설치
RUN npm install

COPY ./ ./

# node 서버를 실행시키는 명령어
CMD ["node", "server.js"]

 

docker-compose.yml

  • 강사님과 다르게 이미 빌드된 도커 이미지 yml 파일에 명시해주었습니다.

    (위 도커 파일 사용해서 빌드)

version: '3'

services:
  redis-server:
    image: 'redis'
  node-app:
    image: 'joykim93/docker-compose-node-demo'
    ports:
      - '8080:8080'

0

    await client.connect;

client.connect() -> client.connect 로 변경해서 해보세요.

0

해결하셨나요?

안녕하세요. 해결하지 못한 채로, 그냥 다음 섹션으로 넘어가서 강의 듣고 있습니다 ㅎㅎ ㅠ