Dev/DevOps, Infra

[Docker] Docker Compose

HJChung 2021. 1. 28. 17:19

Docker Compose란

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

 

Docker Compose를 사용해서

 이러한 구조의 애플리케이션을 정의하고 실행해보고자 한다.

 

1. Redis

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

2) Redis를 쓰는 이유

- 데이터를 메모리에 저장해주는 특성상 Mysql과 같은 데이터베이스에 저장하는 것 보다 데이터를 불러 올 때 훨씬 빠르게 처리 할 수가 있다. 

- 메모리에 저장하지만 영속적으로 보관이 가능하며 서버를 재부팅해도 데이터를 유지 할 수 있다는 장점이 있다.

2. Node.js 환경에서 Redis 사용 

① 먼저 redis-server를 작동시킨다. 

② redis 모듈을 다운 받는다. 

③  Redis에서 제공하는 createClient()함수를 이용해서 redis.createClient로 redis Client를 생성한다.

이때 redis server가 작동하는 곳과 Node.js 앱이 작동하는곳이 다르다면, 네트워크 연결이 필요하다. (port, host) 인자를 명시해줘야한다.

예를 들어, redis server가 작동하는 곳이 redis 환경에서 http://redis-server.com 이라면 redis.createClient에 

host:”redis-server”, // docker가 아닌 로컬 레디스 환경의 경우, https://redis-server.com
port:6379 // redis의 기본포트

을 지정해 주어야 한다.

//index.js

const express = require(“express”);
const redis = require(“redis”)

const client = redis.createClient({
  host:”redis-server”, // docker가 아닌 로컬 레디스 환경의 경우, https://redis-server.com
  port:6379 // redis의 기본포트
  });
  
const app = express();

app.listen(8080);
console.log(“server is running”);

3. Dockerfile 생성

FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

이제 [Docker] 도커 환경에서 실행되는 Nodejs 애플리케이션 에서 해주었던 것과 같이 준비가 다 되었으니 이미지를 build하고 컨테이너를 실행하면 될까?

아니다. 

이런 에러가 발생한다. redis-server와 connection에러가 발생하는 이유는 node.js와 redis server가 서로 다른 컨테이너에 있기 때문에 아무런 설저 없이는 접근을 할 수 없기 때문이다. 

이러한 멀티 컨테이너 상황에서 컨테이너간 네트워크를 연결하기 위해서 Docker Compose를 사용한다. 

4. Docker Compose 파일

 docker-compose.yml 이 Docker Compose 파일이다.

.yml 이 뭘까?

일반적으로 구성 파일 및 데이터가 저장되거나 전송되는 응용프로그램에서 사용되는 파일 형식으로, 

XML이나 json 포맷으로 많이 쓰였으나, 좀더 가독성있는 포맷으로 나타난게 yaml이다.

 docker-compose.yml 에 들어가야 하는 내용은 아래 사진과 같다.

실제 작성한 코드는

version: '3' #Docker Compose 버전
services: # 컨테이너는 SERVICES로 감싸져있으며, 이 곳에 실행하려는 컨테이너들을 명시해준다. 
  redis-server: # 컨테이너 이름 1
    image: 'redis' # 해당 컨테이너에서 사용하려는 이미지
  node-app: #컨테이너 이름 2
    build: . #이 컨테이너의 현 디렉토리에 있는 Dockerfile
    ports: # 포트 매핑
      - '5000:8080' #'[로컬 포트]:[컨테이너 포트]'

5. Docker Compose 명령어

1) 이미지가 없을 때 이미지를 빌드하고 컨테이너 시작

$ docker-compose up

2) 이미지가 있든 없든 이미지를 빌드하고 컨테이너 시작

$ docker-compose --build

3) 이미지를 생성하고 컨테이너 시작 후 빠져나옴

$ docker-compose -d --build

4) docker compose로 컨테이너 멈추기

$ docker-compose down

 

 

reference

따라하며 배우는 도커와 CI환경