Notice
Recent Posts
Recent Comments
Link
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 개발 일상 기록

[Docker] Docker Compose 본문

Docker

[Docker] Docker Compose

느린 거북이 2021. 7. 15. 08:52

Docker Compose

 

1. Doker Compse란?

 

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

 

2. Docket Compose를 이용해서 어플리케이션 만들기

<페이지를 리프레쉬했을때 숫자 0부터 1씩 계속 올라가는 간단한 앱 만들기>

  • 앱 구조

  • 사전준비(package.json 및 server.js)

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",  // node.js
    "redis" : "3.1.2"      // redis
  },
  "author": "",
  "license": "ISC"
}

server.js

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

// 레디스 클라이언트 생성
const client = redis.createClient({
    //host:"https://redis-server.com", //일반적인 경우 host 지정
    host:"redis-server",  // docker 환경일 경우 host 지정, 
    port:6379
})

const app = express();
app.listen(8080);
console.log("Server is running");

* Node.js 환경에서 Reids 사용 방법

- redis-server를 작동 시켜주어야 합니다.

- redis모듈을 다운받습니다.

- Reids 모듈을 받은 후 레디스 클라이언트를 생성하기 위해서 Reids에서 제공하는 createClient()함수를 이용해서 redis.createClient로 레디스 클라이언트를 생성합니다.

- redis server가 작동하는 곳과 Node.js앱이 작동하는 곳이 다른 곳이라면 host인자와 port인자를 명시해주어야 합니다.

 

* Docker 환경에서 Reids Client 생성시 주의사항

- 보통 Docker를 사용하지 않은 환경에서 Redis 서버가 작동되고 있는 곳의 host옵션을 URL(https://redis-server.com)로 주면 되지만, Docker Compose를 사용할 때는 host 옵션을  docker-compose.yml 파일에 명시한 컨테이너 이름으로 주면됩니다.

 

  • server.js 로직 추가
const express = require("express");
const redis = require("redis");

// 레디스 클라이언트 생성
const client = redis.createClient({
    //host:"https://redis-server.com", //일반적인 경우 host 지정
    host:"redis-server",  // docker 환경일 경우 host 지정, 
    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");

client.set() : Redis Client에 <key, value> 값을 Set을 해줄수있습니다.

app.get() : 요청이 루트경로로 들어올때 진입하는 요청을 catch합니다.

  • Dockerfile 작성하기
FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

 

* 레디스 클라이언트가 작동하려면 레디스 서버를 먼저 실행시킵니다.

  • 컨테이너 실행 시 오류

docker build -t <이미지네임> ./ 명령어를 통해 이미지를 생성합니다.

이미지 생성 후  docker run <이미지네임> 컨테이너를 실행하게 되면 아래의 그림처럼 오류가 납니다.

 

서로 다른 컨테이너에 있는데 이렇게 컨테이너 사이에는 아무런 설정없이는 접근을 할 수 없기에 노드 앱에서 레디스서버에 접근을 할 수 없으므로 해당 오류가 발생합니다.

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

 

  • Docker Compose 파일 작성하기

* Docker Compose 파일은 yaml파일인데 yaml이란?

- 일반적으로 구성 파일 및 데이터가 저장되거나 전송되는 응용 프로그램에서 사용되고 원래는 XML이나 JSON 포맷으로 많이 쓰였지만, 좀 더 사람이 읽기 쉬운 포맷으로 나타난게 yaml입니다.

 

<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 up 명령어로 실행합니다.

 

docker-compose 관련 명령어

  • docker-compose build 이미지를 빌드하기만 하며, 컨테이너를 시작하지 않습니다.
  • docker-compose up 이미지가 존재하지 않을 경우에만 빌드하며, 컨테이너를 시작합니다.
  • docker-compose up --build 필요치 않을때도 강제로 이미지를 빌드하며, 컨테이너를 시작합니다.
  • docket-compose up --no-build 이미지 빌드 없이, 컨테이너를 시작합니다.(이미지가 없을시 실패)

브라우저에서 확인

Comments