[docker] Docker Compose

이상훈·2023년 6월 23일
0

CICD

목록 보기
9/10

 간단한 애플리케이션을 만들어보면서 docker compose에 대해 알아보자. 여기서 만들어볼 애플리케이션은 페이지를 새로고침했을때 숫자가 0부터 1씩 계속 올라간다.

소스 코드 작성

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"
}

server.js

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

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

const app = express();

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

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

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

Dockerfile

FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

애플리케이션 실행

 이제 소스 코드들을 다 작성했으니 실제로 애플리케이션을 실행해 보겠다. 우선 애플리케이션이 어떻게 실행되는지 알아보자.

  먼저 Redis 클라이언트가 작동하려면 Redis 서버가 켜져 있어야 하기 때문에 먼저 Redis 서버를 위한 컨테이너를 실행하고 노드 js를 위한 컨테이너를 실행해야 한다.

  • 1. Redis 서버 실행

    docker run redis

  • 2. 이미지 빌드

    docker build -t hal8h/docker-compose-app ./

  • 3. 컨테이너 실행

    docker run hal8h/docker-compose-app

    하지만 에러가 발생했다. redis 서버에 연결이 실패했다고 한다.

    왜 이런 오류가 발생했을까?

    서로 다른 컨테이너에 있는 서버끼리 아무런 설정 없이는 접근할 수 없는데 노드 js 앱에서 redis 서버에 접근을 시도해 에러가 발생한 것이다. 그러면 어떻게 해야 컨테이너 사이에 통신을 할 수 있을까?

    멀티 컨테이너 상황에서 쉽게 네트워크를 연결해주기 위해서 Docker Compose를 이용하면 된다.


Docker Compose

docker-compose.yml

version: "3"
services:
  redis-server:
    image: "redis"
  node-app:
    build: .
    ports:
     - "5000:8080"  
  • version : docker compose 버전

  • services : 이곳에 실행하려는 컨테이너들을 정의

  • redis-server : 컨테이너 이름

    • image : 컨테이너에서 사용하는 이미지
  • node-app : 컨테이너 이름

    • build . : 현 디렉토리에 있는 Dockerfile 사용

    • ports : 포트 매핑 (로컬 포트 : 컨테이너 포트)

docker compose 명령어

  docker compose를 통해 컨테이너를 실행하는 명령어는 다음과 같다. 참고로 docker-compose.yml이 있는 폴더에서 입력해야 한다.

  • docker compose up : 이미지가 없을 때 이미지를 빌드하고 컨테이너 실행
  • docker-compose up --build : 이미지가 있든 없든 모든 이미지를 빌드 후 컨테이너 실행

정상적으로 애플리케이션이 잘 작동한다.

 그렇다면 이제 docker compose를 통해 컨테이너를 종료하는 명령어를 알아보자. 크게 2가지 방법이 있다.

 첫번째 방법은 다른 터미널에서 docker-compose.yml이 있는 폴더로 가서 docker compose down을 입력하는 거다. 왜 다른 터미널로 가냐면 앞선 터미널은 컨테이너가 실행 중이라 명령어를 입력할 수 없기 때문이다.

 두번째 방법은 docker compose로 컨테이너를 실행할 때 docker compose -d up 명령어를 입력하는 것이다. 그러면 앱을 백그라운드에서 실행하고 빠져나오므로 다른 터미널을 켜지 않고 docker compose down 명령어를 입력할 수 있다.

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글

관련 채용 정보