DevOps/Docker

[๋”ฐ๋ผํ•˜๋ฉฐ ๋ฐฐ์šฐ๋Š” ๋„์ปค์™€ CIํ™˜๊ฒฝ] 5. Docker Compose

wisdom11 2022. 5. 23. 17:11

 

๐Ÿ“Œ  Docker Compose ๋ž€, ๋‹ค์ค‘ ์ปจํ…Œ์ด๋„ˆ ๋„์ปค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ ์ด๋‹ค.


์ •์˜๋งŒ ๋ณด์•„์„œ๋Š” ์–ด๋–ค ๋„๊ตฌ์ธ์ง€ ๊ฐ์ด ์ž˜ ์˜ค์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
Node.js์™€ Redis๋ฅผ ์ด์šฉํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ Docker Compose์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์ž.

์ง€๋‚œ ๊ฐ•์˜์—์„œ Node.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด Redis๋ž€ ๋ฌด์—‡์ผ๊นŒ?

 

โœ”๏ธ Redis ๋ž€?

Redis(REmote Dictionary Server)๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ํ‚ค-๊ฐ’ ๊ตฌ์กฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ,
๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋น„ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(NoSql)์ด๋‹ค.

 

Redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Mysql ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์ง€๋งŒ ์˜์†์ ์œผ๋กœ๋„ ๋ณด๊ด€์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„๋ฅผ ์žฌ๋ถ€ํŒ…ํ•ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ”๏ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ ๋ฐ ๋„์ปค ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰

1๏ธโƒฃ  npm init ์œผ๋กœ package.json ์ƒ์„ฑ

$ npm init

 

2๏ธโƒฃ  ์˜์กด์„ฑ์— express, redis๋ฅผ ์ถ”๊ฐ€

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.18.1",
    "redis": "3.0.2"
  },
  "author": "",
  "license": "ISC"
}

redis ๋ฒ„์ „ ์ฃผ์˜โ—๏ธ
4 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” createClient์˜ host  ํ”„๋กœํผํ‹ฐ๋ฅผ ์—†์–ด์ ธ์„œ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค.
์•„๋ž˜์˜ server.js ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ 3๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ž!!

 

3๏ธโƒฃ  node.js ์•ฑ ์ž‘์„ฑ

server.js ํŒŒ์ผ

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

// ๋ ˆ๋””์Šค ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ
const client = redis.createClient({
    // ๋„์ปค Compose๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” docker-compose.yml ํŒŒ์ผ์— ๋ช…์‹œํ•œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์œผ๋กœ ์ฃผ๋ฉด ๋œ๋‹ค.
    host: "redis-server",
    // redis ๊ธฐ๋ณธ ํฌํŠธ ๋ฒˆํ˜ธ(6379)
    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(9000);
console.log('Server is running');

 

4๏ธโƒฃ Dockerfile ์ž‘์„ฑ

Dockerfile ํŒŒ์ผ

FROM node:14

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

 

5๏ธโƒฃ  ์‹คํ–‰

์ด์ œ redis ์„œ๋ฒ„์™€ Node.js ์•ฑ์„ ์‹คํ–‰ํ•˜์ž.

redis ์„œ๋ฒ„ ์‹คํ–‰

$ docker run redis

Node.js ์•ฑ ๋นŒ๋“œ & ์‹คํ–‰

$ docker build -t wisdom/docker-compose-app ./
$ docker run wisdom/docker-compose-app

 

Node.js ์•ฑ์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Error: getaddrinfo ENOTFOUND redis-server
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:71:26)
Emitted 'error' event on RedisClient instance at:
    at RedisClient.on_error (/usr/src/app/node_modules/redis/index.js:341:14)
    at Socket.<anonymous> (/usr/src/app/node_modules/redis/index.js:222:14)
    at Socket.emit (events.js:400:28)
    at emitErrorNT (internal/streams/destroy.js:106:8)
    at emitErrorCloseNT (internal/streams/destroy.js:74:3)
    at processTicksAndRejections (internal/process/task_queues.js:82:21) {
  errno: -3008,
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'redis-server'

redis-server ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜์ด๋‹ค.
node.js ์•ฑ์—์„œ ๋ ˆ๋””์Šค ์„œ๋ฒ„์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†์–ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ์ƒํ™ฉ์—์„œ, Docker Compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์ด์—์„œ ์‰ฝ๊ฒŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ”๏ธ Docker Compose ์‚ฌ์šฉํ•˜๊ธฐ

1๏ธโƒฃ  docker-compose.yml ํŒŒ์ผ ์ž‘์„ฑ

๋‹ค์Œ๊ณผ ๊ฐ™์ด docker-compose.yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

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

redis ์„œ๋ฒ„ ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ "redis-server"๋กœ, ๋…ธ๋“œ ์•ฑ์˜ ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ "node-app"์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.
๋˜ํ•œ, ports ํ”„๋กœํผํ‹ฐ๋กœ ํฌํŠธ ๋งคํ•‘๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2๏ธโƒฃ  ์•ฑ ์‹คํ–‰

# ์ด๋ฏธ์ง€๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘
$ docker-compose up			

# ํ•ญ์ƒ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ (๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ)
$ docker-compose up --build		

# detached ๋ชจ๋“œ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰
$ docker-compose up -d

์œ„์˜ ๋ช…๋ น์–ด๋“ค์„ ํ†ตํ•ด  docker compose ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
์œ„ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, redis ์„œ๋ฒ„์™€ node ์•ฑ์ด ๋ชจ๋‘ ์‹คํ–‰๋œ๋‹ค.

์‹คํ–‰ ํ›„ localhost:5000 ์œผ๋กœ ์ ‘์†ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.
์ƒˆ๋กœ๊ณ ์นจ์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ˆซ์ž๊ฐ€ 1์”ฉ ์ฆ๊ฐ€๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3๏ธโƒฃ ์•ฑ ์ข…๋ฃŒ

$ docker-compose down

์œ„์˜ ๋ช…๋ น์–ด๋Š” docker compose ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹คํ–‰ํ•œ ์•ฑ์„ ์ข…๋ฃŒํ•˜๋Š” ๋ช…๋ น์–ด๋‹ค.

 

 

์ฐธ๊ณ 

 

 

 

 

728x90