Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Kwon's Study Blog !

[Docker] Docker Compose 본문

Docker

[Docker] Docker Compose

순샤인 2022. 3. 26. 04:57
현재 글은 
https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%8F%84%EC%BB%A4-ci/dashboard
을 수강하며 정리한 내용입니다. 
문제시 비공개로 처리 하도록 하겠습니다. 
 

따라하며 배우는 도커와 CI환경 - 인프런 | 강의

이 강의를 통해 도커에 대해서 배울 수 있으며, CI 환경을 구성할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

Docker Compose 란 무엇인가 ?

 

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

 

이렇게 정의만 봐서는 감이 잘 안 올 것입니다. 

 

페이지를 리프레쉬 했을 때 숫자 0부터 1씩 올라가는 간단한 애플리케이션을 만들어보면서 Docker Compose를 알아보겠습니다.

 

 

nodejs-docker-compose-app 폴더를 만들고 VSCode 를 연결해줍니다.

그리고 터미널을 켠 후 npm init을 합니다.

 

그리고 아래처럼 package.json을 변경해 줍니다.

start 와 dependencies를 추가하였습니다.

{
  "name": "nodejs-docker-compose-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start" : "node server.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "express":"^4.17.3",
    "redis":"3.0.2"
  },
  "author": "",
  "license": "ISC"
}

 

server.js

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

const app = express();

app.listen(8080);

console.log("server is running");

 

여기서 redis란 무엇일까요?

Redis

Redis(REmote Dictionary Server) 는 메모리 기반키-값 구조 데이터 관리 시스템이며, 모든 데이터를 메모리에 저장하고 빠르게 조회할 수 있는 비 관계형 데이터베이스(Nosql)입니다.

 

레디스를 쓰는 이유는

메모리에 저장을 하기 때문에 Mysql 같은 데이터베이스에 데이터를 저장하는 것과 

데이터를 불러올 때 훨씬 빠르게 처리할 수가 있으며,

비록 메모리에 저장하지만 영속적으로도 보관이 가능합니다. 그래서 서버를 재부팅해도 데이터를 유지할 수 있습니다.

 

Node.js 환경에서 Redis 사용 방법

먼저 redis-server를 작동시켜줘야 합니다.

그리고 redis 모듈을 다운 받습니다. (package.json)

레디스 모듈을 받은 후 레디스 클라이언트를 생성하기 위해서

Redis에서 제공하는 createClient() 함수를 이용해서 레디스 클라이언트를 생성해줍니다.

하지만 여기서 redis server가 작동하는 곳과 Node.js 앱이 작동하는 곳이 다른 곳이라면

host 인자와 port인자를 명시해줘야 합니다.

 

server.js 변경

const express = require("express");
const redis = require("redis");
//레디스 클라이언트 생성
const client = redis.createClient({
    host:"redis-server.com",
    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");

보통 도커를 사용하지 않는 환경에서는 Redis 서버가 작동되고 있는 곳의 host 옵션을 URL로 주면 되지만,

도커 Compose를 사용할 때는 host 옵션을 docker-compose.yml 파일에 명시한 컨테이너 이름으로 주면 됩니다.

이부분은 해보면서 더 이해를 해보겠습니다.

 

그리하여 server.js의 redis client를 변경해봅시다.

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

Dockerfile 작성

FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

Docker Container 간 통신 할 때 나타나는 에러

현재 애플리케이션이 어떤 식으로 실행이 되는지 살펴보겠습니다.

한 컨테이너에선 Node.js + Redis Clinet , 한 컨테이너에선 Redis Server 이렇게 분리 돼있습니다.

 

먼저 레디스 클라이언트가 작동하려면 -> 레디스 서버가 켜져있어야 합니다.

 

한 터미널에서 redis server를 작동시켜 줍니다.

docker run redis

 

dockerfile 을 build 합니다.

docker build -t ksoon1985/node-compose-app ./

 

app을 실행합니다.

docker run -p 6379:8080 ksoon1985/node-compose-app 

 

하면 에러가 납니다.

 

서로 다른 컨테이너에 있는데 이렇게 컨테이너 사이에는 아무런 설정 없이는 접근을 할 수 없기에

Node.js 앱에서 레디스 서버에 접근을 할 수 없습니다.

 

이렇게 멀티 컨테이너 사이에서 쉽게 네트워크를 연결 시켜주기 위해서

Docker Compose를 이용하면 됩니다.

 

Docker Compose 파일 작성하기

yaml 파일

Docker Compose 파일은 yaml 파일인데 yml은 무엇일까?

YAML(ain't markup language) 은 일반적으로 구성 파일 및 데이터가 저장되거나 전송되는 응용 프로그램에서 사용되고,

원래는 XML 이나 JSON 포맷으로 많이 쓰였지만 

좀 더 사람이 읽기 쉬운 포맷으로 나타난게 yaml 입니다. 

 

일단 docker-compose.yml 파일을 작성해 봅시다.

version: '3'
services:
  redis-server:
    image:"redis"
  node-app:
    build: .
    ports:
     - "5000:8080"

docker-compose up

작동이 잘 되는것을 볼 수 있습니다.

 

만약 소스코드에 수정이 생긴다면 아래와 같이 하면 됩니다.

docker-compose up --build

 

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

애플리케이션을 백그라운드에서 실행 시킬 때 -d 옵션을 추가해줍니다.

 

docker-compose up -d

 

docker compose를 통해 작동시킨 컨테이너들을 한번에 중단 시키려면

 

docker-compose down 

 

을 해주면 됩니다. 

 

그리고

 

docker compose를 이용하면

자동으로 build 해서 이미지도 만들어주고

컨테이너도 만들어주고

실행시켜 주고 편리합니다. 

 

 

 

이번 글에선 Docker Compose에 대해 알아보았고

다음 글에선 간단한 애플리케이션을 실제로 배포해보겠습니다. (개발 환경 부분)