๋ช ๋ ๋ง๋ค ์ํํธ์จ์ด ๊ฐ๋ฐ ์ฐ์ ์ ํจ๋ฌ๋ค์ ๋ณํ๋ฅผ ๊ฒช์ต๋๋ค. ์ด๋ฌํ ํ์ ์ค ํ๋๋ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ๋ ์ ๋ํ ๊ด์ฌ์ด ๋์์ง๋ ๊ฒ์ผ๋ก ์ธ์ํ ์ ์์ต๋๋ค. ๋ง์ดํฌ๋ก์๋น์ค๋ ์ต์ ๊ธฐ์ ์ ์๋์ง๋ง ์ต๊ทผ์์ผ ๊ทธ ์ธ๊ธฐ๊ฐ ๋ฌธ์ ๊ทธ๋๋ก ์น์์์ต๋๋ค.
๋๊ท๋ชจ ๋ชจ๋๋ฆฌ์ ์๋น์ค๋ ์ด์ ๋ ๋ฆฝ์ ์ด๊ณ ์์จ์ ์ธ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋์ฒด๋๊ณ ์์ต๋๋ค. ๋ง์ดํฌ๋ก์๋น์ค๋ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ๋จ์ผ ๋ชฉ์ ์ ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ด๊ณํ DBMS, Express ์ ํ๋ฆฌ์ผ์ด์ , Solr ์๋น์ค๊ฐ ๋ ์ ์์ต๋๋ค.
์์ฆ์๋ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ก์ด ์ํํธ์จ์ด ์์คํ
์ ๊ฐ๋ฐํ๋ ๊ฒ์ ์์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ํฉ์ ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ฅผ Docker ํ๋ซํผ์ผ๋ก ์ด๋๋ค.
๋์ปค
ํ๋ซํผ
๋์ปค ์์ฑ
ะขะตั
ะฝะพะปะพะณะธั
Docker Compose๋ก ์์ ํ ๋ YAML ํ์ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋น์ค๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ก์ ์ํธ ์์ฉ์ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ Docker Compose๋ ๋ค์ค ์ปจํ ์ด๋ Docker ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๋ช ํ๊ณ ์คํํ๊ธฐ ์ํ ๋๊ตฌ์ ๋๋ค.
ํธ์คํธ ์์คํ
์์ ์คํ๋๋ ๋ ๊ฐ์ ์ปจํ
์ด๋
GNU ๋ฉ์ดํฌ
ํ๋ก๊ทธ๋จ make
๋ ๋ณธ์ง์ ์ผ๋ก ์์ค ์ฝ๋์์ ํ๋ก๊ทธ๋จ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ถ์ ์๋ํํ๋ ๋๊ตฌ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ ์ ์์ต๋๋ค. make
์ผ๋ถ ์
๋ ฅ ์๋ฃ๋ฅผ ์ผ๋ถ ์ถ๋ ฅ ํ์, ์ผ๋ถ ๋ชฉํ๋ก ๋ณํํ๊ธฐ ์ํด ์์์ ๋ช
๋ น์ ์คํํ๋ ๋ชจ๋ ํ๋ก์ธ์ค์ ์ ์ฉ๋ฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๋ช
๋ น์ docker-compose
์ถ์์ ์ธ ๋ชฉํ๋ก ๋ณํ๋ฉ๋๋ค(
ํ๋ก๊ทธ๋จ์ ๋งํ๋ ค๋ฉด make
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง์ ๋ํด์๋ ํ์ผ์ด ํ์ํฉ๋๋ค Makefile
.
์ฐ๋ฆฌ์ Makefile
์ผ๋ฐ ๋ช
๋ น์ด ํฌํจ๋ฉ๋๋ค docker
ะธ docker-compose
, ์ด๋ ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ฆ, ์ปจํ
์ด๋ ์กฐ๋ฆฝ, ์์, ์ค์ง, ๋ค์ ์์, ์ปจํ
์ด๋์ ๋ํ ์ฌ์ฉ์ ๋ก๊ทธ์ธ ๊ตฌ์ฑ, ์ปจํ
์ด๋ ๋ก๊ทธ ์์
๋ฐ ๊ธฐํ ์ ์ฌํ ๋ฌธ์ ํด๊ฒฐ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
Docker Compose์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก
๋ค์ ๊ตฌ์ฑ ์์๊ฐ ์๋ ์ผ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด๊ฒ ์ต๋๋ค.
- TimescaleDB ๋ฐ์ดํฐ๋ฒ ์ด์ค(Postgres).
- Express.js ์ ํ๋ฆฌ์ผ์ด์ .
- Ping(๊ทธ๋ฅ ์ปจํ ์ด๋์ผ ๋ฟ, ํน๋ณํ ์์ ์ ์ํํ์ง ์์)
์ด ์ ํ๋ฆฌ์ผ์ด์
์๋ Docker ์ปจํ
์ด๋ 3๊ฐ์ ํ์ผ XNUMX๊ฐ๊ฐ ํ์ํฉ๋๋ค. docker-compose
, ์ด๋ฌํ ์ปจํ
์ด๋๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ง์นจ์ด ํฌํจ๋์ด ์์ต๋๋ค. ๊ฐ ์ปจํ
์ด๋์๋ ์๋ก ๋ค๋ฅธ ํฐ์นํฌ์ธํธ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด timescale
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
๊ณผ ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์์
ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ์
๋๋ค. ์ฆ, ๋ค์ ์์
์ ์ํํ ์ ์์ต๋๋ค.
- Postgres ์ ธ์ ๋ก๊ทธ์ธํฉ๋๋ค.
- ํ ์ด๋ธ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ.
- ์ฐฝ์กฐ
pg_dump
ํ ์ด๋ธ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค.
Express.js ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์ด๋, expressjs
์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ์์ ์ ์์ต๋๋ค.
- ์์คํ ๋ก๊ทธ์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ํน์ ๋ช ๋ น์ ์คํํ๋ ค๋ฉด ์ ธ์ ๋ก๊ทธ์ธํ์ธ์.
์ปจํ ์ด๋์ ์ํธ์์ฉ
Docker Compose๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ
์ด๋ ๊ฐ ํต์ ์ ์ค์ ํ์ผ๋ฉด ์ด์ ํด๋น ์ปจํ
์ด๋์ ํต์ ํ ์ฐจ๋ก์
๋๋ค. Docker Compose ์์คํ
์๋ ๋ค์ ๋ช
๋ น์ด ์์ต๋๋ค. docker-compose
, ์ง์ ์ต์
-f
, ํ์ผ์ ์์คํ
์ผ๋ก ์ ์กํ ์ ์์ต๋๋ค. docker-compose.yml
.
์ด ์ต์
์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํ์ผ์ ์ธ๊ธ๋ ์ปจํ
์ด๋๋ก๋ง ์์คํ
๊ณผ์ ์ํธ ์์ฉ์ ์ ํํ ์ ์์ต๋๋ค. docker-compose.yml
.
๋ช
๋ น์ ์ฌ์ฉํ ๋ ์ปจํ
์ด๋์์ ์ํธ ์์ฉ์ด ์ด๋ค ๋ชจ์ต์ธ์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. docker-compose
. ์์ ๋ก๊ทธ์ธํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด psql
, ํด๋น ๋ช
๋ น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
์คํ์ ์ฌ์ฉ๋์ง ์๋ ๋์ผํ ๋ช
๋ น docker-compose
๊ณผ docker
, ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
docker exec -it edp_timescale_1 psql -Upostgres
์ด๋ฌํ ๊ฒฝ์ฐ์๋ ํญ์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. docker
, ๊ทธ๋ฆฌ๊ณ ๋ช
๋ น docker-compose
, ์ด๋ ๊ฒ ํ๋ฉด ์ปจํ
์ด๋ ์ด๋ฆ์ ๊ธฐ์ตํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ ๋ ๋ช
๋ น์ ๋ชจ๋ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ต๋๋ค. ํ์ง๋ง ๋ค์ ํ์์ "๋ํผ"๋ฅผ ์ฌ์ฉํ๋ฉด Makefile
, ๊ฐ๋จํ ๋ช
๋ น ํํ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ ์์ฒด์ ์ผ๋ก ์ ์ฌํ ๊ธด ๋ช
๋ น์ ํธ์ถํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
make db-shell
์ฉ๋๊ฐ ๋ถ๋ช
ํ๋ค. Makefile
์ปจํ
์ด๋ ์์
์ด ํจ์ฌ ์ฌ์์ง๋๋ค!
์ค์ ์ฌ๋ก
์์ ํ๋ก์ ํธ ๋ค์ด์ด๊ทธ๋จ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ํ์ผ์ ์์ฑํฉ๋๋ค. docker-compose.yml
:
version: '3.3'
services:
api:
build: .
image: mywebimage:0.0.1
ports:
- 8080:8080
volumes:
- /app/node_modules/
depends_on:
- timescale
command: npm run dev
networks:
- webappnetwork
timescale:
image: timescale/timescaledb-postgis:latest-pg11
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
volumes:
- ./create_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
networks:
- webappnetwork
ping:
image: willfarrell/ping
environment:
HOSTNAME: "localhost"
TIMEOUT: 300
networks:
webappnetwork:
driver: bridge
Docker Compose ๊ตฌ์ฑ์ ๊ด๋ฆฌํ๊ณ ๊ตฌ์ฑ์ด ์ค๋ช
ํ๋ ์ปจํ
์ด๋์ ์ํธ ์์ฉํ๊ธฐ ์ํด ๋ค์ ํ์ผ์ ์์ฑํฉ๋๋ค. Makefile
:
THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: help build up start down destroy stop restart logs logs-api ps login-timescale login-api db-shell
help:
make -pRrq -f $(THIS_FILE) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
build:
docker-compose -f docker-compose.yml build $(c)
up:
docker-compose -f docker-compose.yml up -d $(c)
start:
docker-compose -f docker-compose.yml start $(c)
down:
docker-compose -f docker-compose.yml down $(c)
destroy:
docker-compose -f docker-compose.yml down -v $(c)
stop:
docker-compose -f docker-compose.yml stop $(c)
restart:
docker-compose -f docker-compose.yml stop $(c)
docker-compose -f docker-compose.yml up -d $(c)
logs:
docker-compose -f docker-compose.yml logs --tail=100 -f $(c)
logs-api:
docker-compose -f docker-compose.yml logs --tail=100 -f api
ps:
docker-compose -f docker-compose.yml ps
login-timescale:
docker-compose -f docker-compose.yml exec timescale /bin/bash
login-api:
docker-compose -f docker-compose.yml exec api /bin/bash
db-shell:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
์ฌ๊ธฐ์ ์ค๋ช
๋ ๋๋ถ๋ถ์ ๋ช
๋ น์ ๋ชจ๋ ์ปจํ
์ด๋์ ์ ์ฉ๋์ง๋ง ์ต์
์ ์ฌ์ฉํ๋ฉด c=
๋ช
๋ น์ ๋ฒ์๋ฅผ ํ๋์ ์ปจํ
์ด๋๋ก ์ ํํ ์ ์์ต๋๋ค.
ํ Makefile
์ค๋น๊ฐ ๋์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
make help
โ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋ช ๋ น ๋ชฉ๋ก ๋ฐํmake
.
์ฌ์ฉ ๊ฐ๋ฅํ ๋ช
๋ น์ ๋ํ ๋์๋ง
make build
- ์ด๋ฏธ์ง๋ฅผ ์กฐ๋ฆฝํ๋ ์คDockerfile
. ์ด ์์์๋ ๊ธฐ์กด ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ต๋๋ค.timescale
ะธping
. ํ์ง๋ง ์ด๋ฏธ์งapi
์ฐ๋ฆฌ๋ ํ์ง์์ ์์งํ๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ด ๋ช ๋ น์ ์คํํ ํ์ ์ํ๋๋ ์์ ์ ๋๋ค.
Docker ์ปจํ
์ด๋ ๊ตฌ์ถ
make start
โ ๋ชจ๋ ์ปจํ ์ด๋๋ฅผ ์์ํฉ๋๋ค. ํ๋์ ์ปจํ ์ด๋๋ง ์์ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.make start c=timescale
.
๊ธฐ๊ฐ ์ปจํ
์ด๋ ์คํ
ํ ์ปจํ
์ด๋ ์คํ
make login-timescale
โ ์ปจํ ์ด๋์ bash ์ธ์ ์ ๋ก๊ทธ์ธํฉ๋๋ค.timescale
.
์๊ฐ ์ฒ๋ ์ปจํ
์ด๋์์ bash ์คํ
make db-shell
- ์ ๊ตฌpsql
์ฉ๊ธฐ์timescale
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
timescaledb ์ปจํ
์ด๋์์ psql ์คํ
make stop
โ ์ปจํ ์ด๋๋ฅผ ์ค์งํฉ๋๋ค.
๊ธฐ๊ฐ ์ปจํ
์ด๋ ์ค์ง
make down
โ ์ปจํ ์ด๋๋ฅผ ์ค์งํ๊ณ ์ ๊ฑฐํฉ๋๋ค. ํน์ ์ปจํ ์ด๋๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ์ํ๋ ์ปจํ ์ด๋๋ฅผ ์ง์ ํ๋ ์ด ๋ช ๋ น์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด -make down c=timescale
๋๋make down c=api
.
๋ชจ๋ ์ปจํ
์ด๋ ์ค์ง ๋ฐ ์ญ์
๊ฒฐ๊ณผ
Docker Compose๋ ์ปจํ ์ด๋ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ค์ํ ๋ช ๋ น ์ธํธ๋ฅผ ์ ๊ณตํ์ง๋ง ๋๋ก๋ ์ด๋ฌํ ๋ช ๋ น์ด ๊ธธ์ด์ ๊ธฐ์ตํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ Makefile
ํ์ผ์์ ์ปจํ
์ด๋์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ์ํธ ์์ฉํ ์ ์๋๋ก ๋์์ฃผ์์ต๋๋ค. docker-compose.yml
. ์ฆ, ์ฐ๋ฆฌ๋ ๋ค์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
- ๊ฐ๋ฐ์๋ ๋ค์์ ์ค๋ช
๋ ํ๋ก์ ํธ ์ปจํ
์ด๋ํ๊ณ ๋ง ์ํธ ์์ฉํฉ๋๋ค.
docker-compose.yml
, ์์ ์ ์คํ ์ค์ธ ๋ค๋ฅธ ์ปจํ ์ด๋์ ์ํด ๋ฐฉํด๋ฐ์ง ์์ต๋๋ค. - ํน์ ๋ช
๋ น์ ์์ด๋ฒ๋ฆฐ ๊ฒฝ์ฐ ํด๋น ๋ช
๋ น์ ์คํํ ์ ์์ต๋๋ค.
make help
์ฌ์ฉ ๊ฐ๋ฅํ ๋ช ๋ น์ ๋ํ ๋์๋ง์ ํ์ธํ์ธ์. - ์ต์ ๋ก๊ทธ ํญ๋ชฉ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์์คํ
์ ๋ก๊ทธ์ธํ๋ ๋ฑ์ ์์
์ ์ํํ๊ธฐ ์ํด ๊ธด ์ธ์ ๋ชฉ๋ก์ ๊ธฐ์ตํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น์
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
๊ต๋๋กmake db-shell
. - ํ์ผ
Makefile
ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํจ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ์ ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์ ์ ์์ฑํ๊ฑฐ๋ ๋ค๋ฅธ ์์ ์ ์ํํ๋ ๋ช ๋ น์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. - ๋๊ท๋ชจ ๊ฐ๋ฐ์ ํ์ด ๋์ผํ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
Makefile
, ์ด๋ฅผ ํตํด ํ์ ์ด ๊ฐ์ํ๋๊ณ ์ค๋ฅ๊ฐ ์ค์ด๋ญ๋๋ค.
PS ์ฐ๋ฆฌ์
๋ ์ ์ฌ๋ฌ๋ถ! Docker Compose๋ฅผ ์ด๋ป๊ฒ ์๋ํํ๋์?
์ถ์ฒ : habr.com