본문 바로가기
DevOps/Docker

[Docker] Docker compose

by BK0625 2023. 12. 27.
반응형

docker compose는 다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구이다.

 

레디스와 node.js를 둘 다 사용하는 서버를 만들어보고 docker compose로 실행해보자

 

도커 클라이언트로 레디스 서버를 위한 컨테이너를 실행시키고 먼저 express 세팅을 해준 뒤

 

index.js를 다음과 같이 작성한다.

 

const express = require("express");

const redis = require("redis");



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

const client = redis.createClient({
    // url: 'redis://redis:6379'
    // or
    socket: {
        port: 6379,
        host: 'redis-container'
     }

});



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');

 

 

그 다음엔 Node.js를 위한 이미지를 만들기 위해서 Dockerfile을 만들고 다음과 같이 작성한다.

 

 

#베이스 이름을 명시해준다.
FROM node:18

WORKDIR /usr/src/app 

COPY package.json ./
#추가적으로 필요한 파일들을 다운 받음
RUN npm install 

COPY ./ ./

#컨테이너 시작시 실행 될 명령어를 명시
CMD [ "node","index.js" ]

 

 

이제 실제로 어플을 살펴보면 node.js + redis client의 컨테이너와 레디스 서버 컨테이너 구조로 되어 있다. 이 때 (레디스 서버를 위한 컨테이너를 실행 한 뒤에) node.js를 위한 컨테이너를 실행 할 때 레디스 서버에 접근 할 수 없다는 에러가 난다. 이런 에러가 나는 이유는 바로 node.js + redis client 컨테이너와 레디스 서버 컨테이너는 서로 다른 컨테이너에 있는데 이렇게 컨테이너 사이에는 아무런 설정 없이는 접근을 할 수 없기 때문이다.

 

 

바로 이런 멀티 컨테이너 상황에서 쉽게 네트워크를 연결 시킬 수 있는게 Docker compose이다.

 

 

Docker compose를 사용하기 위해서는 docker-compose.yml 파일을 만들어야 한다.

 

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:
      - "5000:8080"

 

 

버전 명시 후 서비스에 각각의 컨테이너 이름을 준다. 그리고 컨테이너에서 사용하는 이미지를 적는다. build는 현 디렉토리에 있는 Dockerfile의 경로를 지정해주고 port는 포트 매핑을 해준다. (로컬 포트 : 컨테이너 포트)

 

그 뒤에 docker-compose up 명령어를 주면 다음과 같이 실행된다.

 

 

 

 

 

그러면 새로 고침 할 때마다 숫자가 올라가는 걸 확인할 수 있다. 만약 오타가 있어서 다시 빌드를 하고 싶다면 docker-compose up --build 명령어를 입력하면 처음부터 다시 빌드를 할 수 있다.

 

 

공부하면서 정리한 내용입니다. 모든 지적 감사히 받겠습니다:)

반응형