Docker 컨테이너 간 통신으로 express js, redis 개발 환경 구축하기

이 글을 읽으면 좋은 분들

  • 도커 컨테이너를 여러 개 띄우며 개발 환경 세팅하는 분들
  • 도커 컨테이너 간 통신이 되지 않는 분들

이 글을 작성한 이유

도커 컨테이너를 활용한 개발을 진행하면 배포 시에도 도커 이미지를 통한 배포가 굉장히 간단해진다는 정보를 듣고, 도커 컨테이너 세팅을 시작했지만 문제가 발생해 이런 문제점을 해결하는 방법을 공유하기 위해 작성.

상황

  • 2개의 도커 컨테이너 생성 및 실행
    • Node js
    • Redis

Node js에서 Express js를 설치 후 웹 개발을 진행. 이때 로그인 기능 구현을 위해 세션을 저장할 redis 이용을 시도. 하지만 이 부분에서 redis와 통신을 하지 못하는 상황 발생.

더 간단히 말하면 두 개의 컨테이너를 각각 실행했지만, 두 컨테이너 간 통신이 되고 있지 않은 상황.

해결 방법

docker network를 이용해 해결하려 했지만 해결하지 못했습니다. 결국 최종적으로 선택한 해결 방법은 docker-compose입니다. 도커 컴포즈를 이용해 여러 컨테이너들을 연속해 실행하면 컨테이너 간 통신이 가능한 상황을 확인했습니다.

docker-compose.yml

ex)

version: '3.8'

services:
  node:
    image: node:latest
    stdin_open: true
    tty: true
    ports:
      - "3000:3000"
    depends_on:
      - redis
  redis:
    image: redis:3

설명

  • stdin_open, tty : 이 부분의 경우 완벽히 이해하지는 못했습니다. 그럼에도 추가한 이유는 해당 옵션을 설정하지 않고 docker-compose up 명령어를 실행하니 하니 redis 컨테이너는 정상 실행되지만 node 컨테이너는 계속해서 바로 exited 상태로 변하는 문제가 발생했습니다. 이를 해결하기 위햇 기존에 노드 컨테이너를 실행하기 위해 ‘docker run -itd node’ 이런 식으로 명령어를 작성했기 때문에 -i옵션과 -t옵션에 해당하는 옵션을 추가해주어야겠다 생각해 stdin_open, tty 옵션을 추가했습니다.
  • depends_on : 의존성을 추가하는 부분으로 redis가 먼저 실행되어야 이후에 해당 컨테이너를 실행해 문제를 없에겠다는 뜻입니다.

app.js(Express js 실행 파일)

위에서 작성한 컴포즈 파일로 빌드를 마친 후 실행된 노드 컨테이너에 접속해 express, redis, express-session 등의 추가 모듈을 설치 후 redis에 접속을 시도했습니다.

ex)

const express = require('express');
const session = require('express-session');
const redis = require('redis');
const connectRedis = require('connect-redis');

const app = express();

// Redis 클라이언트 생성
const redisClient = redis.createClient({
    host: 'redis',
    port: 6379, // 기본 포트
});

// Redis와 Express 세션 연결
const RedisStore = connectRedis(session);

// Express 애플리케이션에 세션 미들웨어 추가
app.use(session({
    store: new RedisStore({ client: redisClient }),
    secret: 'your_secret_key', // 세션을 서명하는 데 사용되는 비밀 키
    resave: false,
    saveUninitialized: false,
    // cookie: { secure: true }, // HTTPS에서만 쿠키 전송을 원할 경우 주석 해제
}));

// 미들웨어에서 세션 사용 예시
app.get('/', function(req, res) {
    // 세션에 데이터 설정
    req.session.example_key = 'example_value';
    // 세션에서 데이터 읽기
    const value = req.session.example_key;
    res.send('Value from session: ' + value);
});

// Express 애플리케이션을 3000번 포트에서 실행
app.listen(3000, function() {
    console.log('Server is running on port 3000');
});

설명

const redisClient = redis.createClient({
    host: 'redis',
    port: 6379, // 기본 포트
});

도커 컴포즈 파일에 services 하위에 두 컨테이너를 node, redis라는 이름으로 실행하였습니다. 이 이름을 활용해 간단하게 host를 지정할 수 있는 것 같습니다.

results matching ""

    No results matching ""