[Docker] 도커컴포즈 ( by 따라하며 배우는 Docker와 CI환경)

su_y2on·2022년 2월 15일
0

Docker

목록 보기
6/12
post-thumbnail

도커컴포즈

redis와 node app을 이용해서 새로고침을 할 때마다 숫자가 하나씩 증가하는 프로그램을 만들어보겠습니다.

먼저 redis 라이브러리를 다운받기위해 dependencies에 추가해줍니다.

package.json

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




redis를 import받아서 클라이언트를 생성해줍니다. redis는 서버와 클라이언트로 나뉘어 클라이언트에서 명령을 보내면 서버에서 데이터를 저장하거나 조회해주는 구조입니다.

도커를 사용하면서 redis클라이언트를 생성할 때host에 redis 컨테이너 이름을 넣어줍니다.(이 부분은 나중에 보충설명을 하도록 하겠습니다!)

server.js

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

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


//APP
const app = express();

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

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


app.listen(8080);



이제 node도커파일을 만들겠습니다. 이전과 같이 작성해주면됩니다.

Dockerfile

FROM node:10

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install 

COPY ./ ./

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

이미지 빌드

> docker build rmswjdtn/react-redis ./

컨테이너 생성 및 실행

> docker run rmswjdtn/react-redis




여기까지 진행하면 node 앱이 돌아가면서 server.js에 있는 코드들을 실행할 것입니다. 근데 여기서 오류가납니다. 바로 redis-server와 연결이 안됐기때문입니다. redis 컨테이너가 만들어지지도 않았고 따로 터미널을 켜서 만든다고 해도 두 컨테이너가 서로 통신을 할 수는 없습니다.

이때 필요한 것이 바로 도커컴포즈입니다!!🤗



도커컴포즈 파일작성하기

도커컴포즈는 아래와 같은 구조이며 등록된 여러 컨테이너끼리 서로 통신할 수 있도록 해줍니다.

3버전으로 사용할 것이며 services라는 것으로 컨테이너들을 감쌉니다. 그리고 각각 redis-server, node-app이라는 컨테이너이름을 붙여줍니다. redis컨테이너는 기존 redis이미지를 사용할 것이기 때문에 이미지를 넣어주고 node-app은 직접 빌드를 할 것이기 때문에 dockerfile이 있는 경로(현재경로: .)를 넣어줍니다. 그리고 포트도 매칭해줍니다.

docker-compose.yml

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

도커컴포즈가 편한것은 여러옵션(-p,-v,-t..)을 붙여서 이미지를 빌드하고 컨테이너를 실행하던 명령어들 없이 docker-compose up만으로 같은 효과를 낼 수 있다는 것입니다.

<docker-compose 명령어>

  • docker-compose build : 이미지만 빌드
  • docker-compose up : 없는 이미지 빌드 후 컨테이너 실행
  • docker-compose up --build : 모든 이미지 다시 빌드 후 컨테이너 실행
  • docker-compose up --no-build : 이미지 빌드 없이 컨테이너 실행만(이미지 없다면 실패)

이 중 2,3번째 명령어가 자주 쓰입니다. 특히 3번째는 코드를 수정하고 이미지를 다시 빌드하기 위해 사용합니다. 이때 2번째로 해버리면 수정이 반영되지 않은 이미지로 실행을 하게 됩니다..(이거때문에 삽질을 할수도...🥲🥲)




아주 잘 작동합니다!

0개의 댓글