본문 바로가기

개발 일기라기 보단 메모장/Docker

09. 도커 컴포즈(Docker Compose)란 무엇일까?

반응형

1. 도커 컴포즈(Docker Compose)란?

Compose란 사전적인의미로는 "구성하다"라는 뜻의미인데, 말 그대로 Docker Compose란 여러 컨테이너를 모아서 하나의 어플리케이션을 구성하는 것을 말한다.

 

2. 도커 컴포즈(Docker Compose) 실행 예제.

(1) 개요

  • express와 redis를 사용하여 새로 고침할때 마다 +1 씩 카운팅 하기.
  • express : node.js를 이용하여 간단하게 REST서버를 구성하는 역할(따로 공부 필수).
  • redis : "키-값"으로 구성된 영속성이 보장되는 인메모리 데이터 저장소(따로 공부 필수).

 

(2) node.js 서버를 작동하기 위한 package.json 작성

// 파일명 : 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" : "3.0.2"
  },
  "author": "",
  "license": "ISC"
}
  • node.js 서버 실행시 반드시 필요한 파일로 이름은 반드시 package.json으로 만들어야 한다.
    (npm init 명령어로 간편하게 작성 가능)
  • entry point 의 이름은 자유롭게 변경 가능하다.
    ex) index.js 등등..
  • 어플리케이션을 실행하는데 필요한 의존성 주입은 dependencies 에 작성을 해줘야 하는데 버전에 따라 오류가 생길 수 있으므로 주의가 필요하다.

 

(3) entry point 작성

// 파일명 : server.js

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

// 레디스 클라이언트 생성
const client = redis.createClient({
    // host 내용은 docker 환경이기에 docker-compose.yml 파일에서 설정한 이름으로 적어준다. 
    // 일반적인 환경에서는 도메인 이름을 적어줘야 한다. (redis 공부로 보충하기)
    host : "redis-server", 
    port : 6379
});

const app = express();

// 숫자는 0부터 시작.
client.set("number", 0);

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

app.listen(8080);
console.log('Server is running');
  • 위에 package.json 내용 중 entry point 에 작성한 이름대로 파일명을 작성해주어야 한다.
  • redis host이름의 경우에는 일반서버인지 도커환경인지에 따라 작성법이 다르므로 확인이 필요하다
    현재는 도커 환경에서 실습 중이므로 docker-compose.yml 내에서 설정한 이름으로 지정해줘야 한다.

 

(4) 도커 이미지 생성을 위한 Dockerfile 작성

# 파일명 : Dockerfile

FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

 

3. 도커 컴포즈(Docker Compose) 예제 실행시 유의사항.

  • redis를 실행하기 위해서는 먼저 redis server를 띄우고 redis client를 띄워야 한다.
  • 하지만 하나의 컨테이너가 아니라 2개 이상의 멀티 컨테이너로 구성되어 있기 때문에 별도의 설정없으면 컨테이너끼리 통신이 이루어지지 않기 대문에 redis가 실행되지 못하고 에러가 난다.
  • 이를 보완하기 위해서는 docker-compose.yml 파일을 통해서 설정이 필요하다.

 

4. docker-compose.yml 파일 작성.

(1) docker-compose.yml 파일 구성

 

(2) docker-compose.yml 작성 예제

  • YAML 파일이므로 앞에 띄어 쓰기에 주의가 필요하다
    (YAML 작성법 추가로 공부 필요!)

 

(3) docker-compose 실행

 1) docker-compose 실행 명령어

docker-compose up --build
  • 뒤에 --build 옵션을 붙여주어야 docker-compose 실행시에 docker-compose.yml 파일에 맞게 다시 빌드하여 실행한다.

 

 2) docker-compose 실행 로그

 

5. docker-compose up VS docker-compose up --build 차이

  • docker-compose up : 이미지가 없을때 빌드하고 컨테이너 시작
  • docker-compose up --build : 이미지 유무에 상관없이 이미지 빌드 후 컨테이너 시작

 

6. 도커 컴포즈(docker-compose) 중지

docker compose down
  • 다른 터미널을 실행후 docker-compose.yml 파일이 있는 경로로 이동하여 명령어를 실행해줘야 한다.
  • 아니면, docker-compose 실행 시에 -d 옵션을 줘서 백그라운드에서 실행 시키면 하나의 터미널에서 제어 가능하다.
    ex) docker-compose up -d --build

 

반응형