๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
DevOps
Docker
09-Docker compose

1. ์„œ๋น„์Šค ์ž‘์„ฑํ•˜๊ธฐ

docker run ๋ช…๋ น์–ด๊ฐ€ ์Šฌ์Šฌ ๊ธธ์–ด์ง€๋ฉด docker๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์‹ซ์œผ๋ฉด ๋ช…๋ น์–ด๋“ค์„ ํ•œ ํŒŒ์ผ์— ์ž…๋ ฅํ•ด๋†“๊ณ  ๊ทธ๊ฑธ ์‹คํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ์ฝ”๋“œ์งœ๋†“์œผ์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿด๋ ค๋ฉด shell script ์ด๋Ÿฐ๊ฑฐ ์งœ์„œ ์‹คํ–‰ํ•ด๋„ ๋˜๊ธด ํ•˜๋Š”๋ฐ, docker compose๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์“ฐ๋ฉด ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๊ตฌํ˜„๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋กœ ์„ค์น˜ํ•  ํ•„์š”๋Š” ์—†๊ณ , docker desktop ์„ค์น˜ํ•  ๋•Œ ๊ฐ™์ด ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.


1.1 docker compose ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•

  1. docker-compose.yml ํŒŒ์ผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ
  2. ๊ฑฐ๊ธฐ๋‹ค๊ฐ€ docker run ์–ด์ฉŒ๊ตฌ ์“ฐ๋˜ ๋ช…๋ น์–ด๋“ค์„ ์ญ‰ ๋‚˜์—ดํ•˜๊ณ ,
  3. ์ด์ œ ํ„ฐ๋ฏธ๋„์—์„œ docker compose up์ด๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด, ์ด ํŒŒ์ผ์— ์žˆ๋˜ ๋‚ด์šฉ์ด ์ญ‰ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํŽธ๋ฆฌํ•˜์ฃ ? ํ•˜์ง€๋งŒ docker compose ๋ฌธ๋ฒ• + yaml ํŒŒ์ผ ํ˜•์‹์— ๋งž๊ฒŒ .yml ํŒŒ์ผ์„ ์ฑ„์›Œ์•ผํ•ฉ๋‹ˆ๋‹ค.


1.2 services

yml ํŒŒ์ผ์ด ๋ญ๋ƒ๋ฉด ์ผ๋‹จ ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๋Š” ์šฉ๋„์˜ ํŒŒ์ผํ˜•์‹์ž…๋‹ˆ๋‹ค. .json ์•„๋Š” ๋ถ„๋“ค์€ ๊ทธ ํŒŒ์ผ์ด๋ž‘ ๋น„์Šทํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. .yml ํŒŒ์ผ์€ ๋ฐ์ดํ„ฐ์ด๋ฆ„ : ๊ฐ’์ด๋Ÿฐ ์‹์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐ์ดํ„ฐ์— ์†ํ•˜๋Š” ํ•˜์œ„ ๋ฐ์ดํ„ฐ๋Š” ์ธ๋ดํŠธ ๋„ฃ๊ณ  ๋ฐ์ดํ„ฐ์ด๋ฆ„ : ๊ฐ’์„ ์ ์œผ๋ฉด ๋์ž…๋‹ˆ๋‹ค.

1
# docker-compose.yml
2
services:
3
์ปจํ…Œ์ด๋„ˆ์ด๋ฆ„:
4
image: ์ด๋ฏธ์ง€์ด๋ฆ„
5
ports:
6
- ๋‚ด์ปดํ“จํ„ฐํฌํŠธ:์ปจํ…Œ์ด๋„ˆํฌํŠธ

๊ทธ๋ž˜์„œ ๋งŒ๋“ค์–ด๋‘” dockerํŒŒ์ผ์˜ ๋ฃจํŠธ๊ฒฝ๋กœ์—์„œ docker-compose.yml ํŒŒ์ผ ๋งŒ๋“ค์–ด์„œ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค. services: ๋ผ๊ณ  ์ ๊ณ  ์ธ๋ดํŠธ ๋„ฃ์–ด์„œ ํ•˜์œ„ ํ•ญ๋ชฉ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ํ•˜๋‚˜ ์ž‘๋ช…ํ•ฉ์‹œ๋‹ค. ์ •ํ™•ํžˆ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„์ธ๋ฐ ์ผ๋‹จ์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์ด๋ผ๊ณ  ๋ถ€๋ฆ…์‹œ๋‹ค.

๊ทธ ๋‹ค์Œ์— ํ•˜์œ„ ํ•ญ๋ชฉ์œผ๋กœ image: ์ด๋ฏธ์ง€์ด๋ฆ„์ ์œผ๋ฉด ์ด ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„์›Œ์ค๋‹ˆ๋‹ค. ports: ํ•˜์œ„ํ•ญ๋ชฉ์œผ๋กœ ํฌํŠธ๋ฐ”์ธ๋”ฉ ์–ด๋–ป๊ฒŒ ํ•  ๊ฑด์ง€๋„ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • VSCode ์—๋””ํ„ฐ ์“ฐ๋Š” ๋ถ„๋“ค์€ ์ด๋Ÿฐ๊ฑฐ ์ž‘์„ฑํ•  ๋•Œ Docker ๋ถ€๊ฐ€๊ธฐ๋Šฅ ์„ค์น˜ํ•˜๋ฉด ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • cf. ์˜ˆ์ „์—” ๋„์ปค version ๋ถ€ํ„ฐ ๋งจ ์œ„์— ๋„ฃ๊ณ  ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ์š”์ฆ˜์€ ๊ทธ๋Ÿด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

1.3 ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋„ฃ์œผ๋ ค๋ฉด

1
# docker-compose.yml
2
services:
3
์ปจํ…Œ์ด๋„ˆ์ด๋ฆ„:
4
image: ์ด๋ฏธ์ง€์ด๋ฆ„
5
ports:
6
- ๋‚ด์ปดํ“จํ„ฐํฌํŠธ:์ปจํ…Œ์ด๋„ˆํฌํŠธ
7
environment:
8
- ํ™˜๊ฒฝ๋ณ€์ˆ˜์ด๋ฆ„=๊ฐ’
9
- ํ™˜๊ฒฝ๋ณ€์ˆ˜์ด๋ฆ„=๊ฐ’

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋‚˜ํ•˜๋‚˜ ์ ์–ด๋‘๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜ํ•˜๋‚˜ ์ ๊ธฐ ๊ท€์ฐฎ์œผ๋ฉด ๋‹ค๋ฅธ ํŒŒ์ผ์— ์žˆ๋Š”๊ฑธ ๋Œ์–ด๋‹ค๊ฐ€ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
POSTGRES_USER=admin
2
POSTGRES_PASSWORD=qwer1234

e.g. ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋”ฉํ•  ๋•Œ .envํŒŒ์ผ์— ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋” ์ ์–ด๋†“๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์— ์žˆ๋Š”๊ฑธ docker compose ์„ค์ •ํŒŒ์ผ์—์„œ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

1
# docker-compose.yml
2
environment:
3
- POSTGRES_USER: ${POSTGRES_USER}

๊ทธ๋Ÿด๋ ค๋ฉด ${} ์“ฐ๊ณ  .env ํŒŒ์ผ์— ์žˆ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ ์–ด์ฃผ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1
services:
2
# ์ƒ๋žต
3
4
db:
5
image: postgres:17-alpine
6
env_file:
7
- fileName.env
8
environment:
9
- POSTGRES_USER=${POSTGRES_USER}
10
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

.env ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์œผ๋ฉด, ๊ทธ ์ค‘์— ์–ด๋””์„œ ๊ฐ€์ ธ์˜ฌ๊ฑด์ง€ ๋ช…์‹œํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ๋Š”๋ฐ ํ•„์š”ํ•  ๋•Œ ์ฐพ์•„์”์‹œ๋‹ค.


1.4 ๋„์šฐ๋Š” ๋ช…๋ น์–ด๋Š”

1
# docker-compose.yml
2
services:
3
webserver:
4
image: nodeserver:1
5
ports:
6
- 8080:8080

๊ทธ๋ž˜์„œ ์ „์— ๋งŒ๋“ค์–ด ๋†“์€ ์›น์„œ๋ฒ„ ๋„์šฐ๊ณ  ์‹ถ์–ด์„œ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด๋†จ์Šต๋‹ˆ๋‹ค.

1
docker compose up -d # compose๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋„์›€, -d๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰
2
docker compose stop # compose๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ •์ง€
3
docker compose down # compose๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ

docker compose ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šฐ๊ณ  ,์ •์ง€ํ•˜๊ณ , ์‚ญ์ œํ•˜๋ ค๋ฉด ์ฐจ๋ก€๋กœ ์ด๋Ÿฐ๊ฑธ ์ž…๋ ฅํ•ฉ์‹œ๋‹ค.


1.5 ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ๋„์šฐ๊ธฐ

์›น์„œ๋ฒ„๋Š” ์ž˜ ๋œจ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, nginx๊ฐ™์€ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜ ๋” ๋„์šฐ๊ณ  ์‹ถ์œผ๋ฉด, service: ํ•˜์œ„ ํ•ญ๋ชฉ์„ ๋” ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋‹ˆ๊นŒ ๋„์šธ ์ด๋ฏธ์ง€๋งˆ๋‹ค ์„œ๋น„์Šค ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1
# docker-compose.yml
2
services:
3
webserver: # ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„
4
image: nodeserver:1
5
ports:
6
- 8080:8080
7
8
nginx: # ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„
9
image: nginx:1
10
ports:
11
- 80:80

๊ทธ๋ž˜์„œ ์ €์žฅํ•˜๊ณ  docker compose downํ•œ ๋‹ค์Œ์—, docker compose up -dํ•ด๋ณด๋ฉด, ์ปจํ…Œ์ด๋„ˆ 2๊ฐœ๊ฐ€ ๋™์‹œ์— ์ž˜ ๋œน๋‹ˆ๋‹ค.


1.6 ๋„คํŠธ์›Œํฌ

์ปจํ…Œ์ด๋„ˆ๊ฐ„ ํ†ต์‹ ์ด ํ•„์š”ํ•ด์„œ ๋„คํŠธ์›Œํฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ์‹ค์€ ๋„คํŠธ์›Œํฌ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. services: ํ•˜์œ„ํ•ญ๋ชฉ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ์ž๋™์œผ๋กœ ๋„คํŠธ์›Œํฌ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๊ฑฐ๊ธฐ ์ „๋ถ€ ๋„ฃ์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

1
// myconfig1.conf
2
server {
3
listen 80;
4
location / {
5
proxy_pass http://webserver:8080;
6
proxy_set_header Host $host;
7
proxy_set_header X-Real-IP $remote_addr;
8
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
9
proxy_set_header X-Forwarded-Proto $scheme;
10
}
11
}

๊ทธ๋ฆฌ๊ณ  ๋„คํŠธ์›Œํฌ ์•ˆ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ผ๋ฆฌ ์„œ๋กœ ์ฐพ์œผ๋ ค๋ฉด, IP์ฃผ์†Œ ํ˜น์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ (์„œ๋น„์Šค ์ด๋ฆ„)์„ ๊ธฐ์žฌํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ, ์•Œ์•„์„œ nginx์™€ ์›น์„œ๋ฒ„ ์—ฐ๊ฒฐํ•ด๋ณด์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1
docker build ./nginx -t nginx:1
2
docker build . -t nodeserver:1

1.7 ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ์„œ๋กœ dependency๊ฐ€ ์žˆ์œผ๋ฉด?

์ปจํ…Œ์ด๋„ˆ๋“ค์„ ๋„์šฐ๋‹ค๋ณด๋ฉด, ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋– ์žˆ์–ด์•ผ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

nginx โ†’ webserver โ†’ DB

  • e.g. nginx๋Š” โ€œ์›น์„œ๋ฒ„์— ๋ณด๋‚ด์ฃผ์„ธ์š”~โ€, ์›น์„œ๋ฒ„๋Š” โ€œDB์— ์—ฐ๊ฒฐํ•ด์ฃผ์„ธ์š”~โ€
  • ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์งœ์—ฌ์ ธ์žˆ๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” DB๋จผ์ € ๋„์šฐ๊ณ  ์›น์„œ๋ฒ„ ๋„์šฐ๊ณ  ๊ทธ ๋‹ค์Œ์— nginx ๋„์šฐ๋ฉด ์ข€ ์•ˆ์ •์ ์ด์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ.
  • ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ž˜์•ผ ์ž˜ ๋Œ์•„๊ฐˆ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1
# docker-compose.yml
2
services:
3
webserver:
4
image: nodeserver:1
5
ports:
6
- 8080:8080
7
8
nginx:
9
image: nginx:1
10
ports:
11
- 80:80
12
depends_on:
13
- webserver

depends_on: ํ•˜์œ„ ํ•ญ๋ชฉ์œผ๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค ์ด๋ฆ„์„ ๊ธฐ์žฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ์œ„์˜ ์ฝ”๋“œ์—์„  โ€œnginx๋Š” webserver์— ์˜์กดํ•œ๋‹คโ€๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ webserver ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ ๋‹ค์Œ nginx ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์‹ถ์œผ๋ฉด depends_on:์„ ์‚ฌ์šฉํ•ด๋ด…์‹œ๋‹ค.


1.8 ์„œ๋น„์Šค

docker compose์—์„  ์ปจํ…Œ์ด๋„ˆ๋ฅผ โ€œ์„œ๋น„์Šคโ€ ์•ˆ์— ์ž‘์„ฑํ•˜๋Š”๋ฐ, ์„œ๋น„์Šค๊ฐ€ ๋ญ๋ƒ๋ฉด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์–ด๋–ป๊ฒŒ ๋„์šธ์ง€ ์ •์˜ํ•˜๋Š” ์ผ์ข…์˜ ๊ฐ€์ด๋“œ๊ฐ™์€ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

1
# docker-compose.yml
2
services:
3
webserver:
4
image: nodeserver:1
5
ports:
6
- 8080:8080

์ด๋ฏธ์ง€๊ฐ€ ์žˆ์œผ๋ฉด,

  • ์–ด๋–ค ํฌํŠธ๋ฅผ ์—ด์ง€
  • ์–ด๋–ค ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์„์ง€
  • ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์€ ์–ด๋–ป๊ฒŒ ์ง€์„์ง€

์ด๋Ÿฐ๊ฑธ ๊ฒฐ์ •ํ•ด์•ผ ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ. ์ด๋Ÿฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๊ฐ€์ด๋“œ๋ฅผ docker compose์—์„œ ์„œ๋น„์Šค๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋ผ๋Š” ๊ฐœ๋…์ด ์ค‘์š”ํ•œ๋ฐ, ์™œ๋ƒ๋ฉด ์—ฌ๋Ÿฌ๋ถ„์ด ๋‚˜์ค‘์— ์ปจํ…Œ์ด๋„ˆ ์ˆ˜๋ฐฑ๊ฐœ๋ฅผ ๋„์šฐ๊ฒŒ ๋˜๋ฉด, ๊ทธ๊ฑธ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋”ฐ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Docker swarm, Kubernetes, AWS ECS ์ด๋Ÿฐ๊ฒŒ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฐ๊ฑธ ์จ๋„ ํ•ญ์ƒ ์„œ๋น„์Šค์™€ ๋น„์Šทํ•œ ๊ฑธ ์ž‘์„ฑํ•œ ๋’ค์— ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ๋„์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž˜ ๊ธฐ์–ตํ•ด๋‘ก์‹œ๋‹ค.

์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‘๋ฉด ์žฅ์ ์ด ๋ญ๋ƒ๋ฉด,

  • ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์„ ํ•œ ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์žˆ๋Š”๋ฐ, ๋‚˜์ค‘์— ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋„ ํŽธ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค.
  • โ€œ์„œ๋น„์Šค์— ์จ์žˆ๋Š” ๋‚ด์šฉ๋Œ€๋กœ ์ปจํ…Œ์ด๋„ˆ ์—ฌ๋Ÿฌ๊ฐœ ๋ณต์‚ฌํ•ด์„œ ๋„์›Œ์ฃผ์„ธ์š”โ€ ์ด๋Ÿฐ๊ฒŒ ๊ฐ€๋Šฅํ•ด์ง€๋‹ˆ๊นŒ์š”.
1
# docker-compose.yml
2
services:
3
webserver:
4
image: nodeserver:1
5
ports:
6
- 8080:8080
7
depends_on:
8
- db
9
deploy:
10
mode: replicated
11
replicas: 3
12
13
nginx:
14
image: nginx:1
15
ports:
16
- 80:80
17
18
db:
19
image: postgres:17-alpine
20
environment:
21
- POSTGRES_USER=${POSTGRES_USER}
22
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
23

์‹ฌ์‹ฌํ•˜๋‹ˆ๊นŒ ์ง„์งœ๋กœ ํ•ด๋ณด๋ฉด,

  • ์„œ๋น„์Šค๋งˆ๋‹ค deploy: ์˜ต์…˜์„ ๋„ฃ์œผ๋ฉด ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋™์ผํ•œ ์„ค์ •์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ ๋ณต์ œํ•ด์„œ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณต์ œํ•ด์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด docker compose --compatibility up ์ด๋Ÿฐ ๋ช…๋ น์–ด ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2. network, volume

๊ฐ„๋‹จํ•œ๊ฑฐ ๋„์šธ ๋•Œ๋„ ์“ธ๋ฐ์—†๋Š” docker ๋ช…๋ น์–ด๋“ค ๊ธธ๊ฒŒ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, docker compose ํŒŒ์ผ์— ๊ธฐ๋กํ•ด๋†“๊ณ  ์‹คํ–‰ํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ํŽธํ•ด์„œ ์•ž์œผ๋กœ ์ž์ฃผ ์“ฐ๊ฒŒ ๋ ํ…๋ฐ, ๊ทธ๋ž˜์„œ docker compose ์‚ฌ์šฉ์˜ˆ์‹œ๋ฅผ ์ข€๋งŒ ๋” ์•Œ์•„๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.


2.1 ์ง์ ‘ network ๋งŒ๋“ค๊ธฐ

์›๋ž˜ services: ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ์ž๋™์œผ๋กœ ๋„คํŠธ์›Œํฌ ํ•˜๋‚˜ ์•ˆ์— ๋‹ด์•„์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋„คํŠธ์›Œํฌ ๋”ฐ๋กœ ์„ค์ •ํ•˜๊ณ  ๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†๋Š”๋ฐ, ๊ฐ„ํ˜น ๋„คํŠธ์›Œํฌ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค์–ด์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

docker_9-1

e.g. nginx, ์›น์„œ๋ฒ„, DB๊ฐ€ ์žˆ์œผ๋ฉด, nginx โ†โ†’ ์›น์„œ๋ฒ„๋Š” ์„œ๋กœ ํ†ต์‹ ํ•ด์•ผํ•˜๊ณ , ์›น์„œ๋ฒ„ โ†โ†’ DB๋Š” ์„œ๋กœ ํ†ต์‹ ํ•ด์•ผํ•˜๊ณ , ๊ทผ๋ฐ nginx โ†โ†’ DB๋Š” ์„œ๋กœ ํ†ต์‹ ํ•  ์ผ์ด ์•„๋งˆ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ๊ฐ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ์ปจํ…Œ์ด๋„ˆ๋ผ๋ฆฌ ํ•˜๋‚˜์˜ ๋„คํŠธ์›Œํฌ์— ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ๋„ ์•ˆ์ „ํ•˜๊ณ  ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cf. ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ์—ฌ๋Ÿฌ๊ฐœ ๋„คํŠธ์›Œํฌ์— ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
services:
2
webserver:
3
image: nodeserver:1
4
ports:
5
- 8080:8080
6
networks:
7
- mynet1
8
- mynet2
9
10
nginx:
11
image: nginx:1
12
ports:
13
- 80:80
14
networks:
15
- mynet1
16
17
db:
18
image: postgres:17-alpine
19
environment:
20
- POSTGRES_USER=admin
21
- POSTGRES_PASSWORD=qwer1234
22
networks:
23
- mynet2
24
25
networks:
26
mynet1:
27
mynet2:

๊ทธ๋ž˜์„œ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. networks: ๋ผ๋Š” ์ตœ์ƒ์œ„ ํ•ญ๋ชฉ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์•ˆ์— ๋„คํŠธ์›Œํฌ ์ด๋ฆ„์„ ๋„ฃ์œผ๋ฉด ๊ทธ ์ด๋ฆ„์œผ๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

1
docker compose up

์œ„ ์˜ˆ์‹œ์—์„  mynet1, mynet2 ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ์„œ๋น„์Šค๋งˆ๋‹ค networks: ๋„ฃ์–ด์„œ ๋„คํŠธ์›Œํฌ์•ˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
$ docker compose down
2
3
$ docker build ./nginx -t nginx:1
4
$ docker run -d -p 8080:8080 --network mynet1 --name nodeserver-container nodeserver:1
5
6
$ docker compose up -d

2.2 volume ์‚ฌ์šฉํ•˜๊ธฐ

docker compose ํŒŒ์ผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋ณผ๋ฅจ ์žฅ์ฐฉํ•˜๋ผ๊ณ  ๋ช…๋ น๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

1
services:
2
db:
3
image: postgres:17-alpine
4
environment:
5
- POSTGRES_USER=admin
6
- POSTGRES_PASSWORD=qwer1234
7
volumes:
8
- ๋ณผ๋ฅจ์ด๋ฆ„:/var/lib/postgresql/data
9
10
volumes:
11
๋ณผ๋ฅจ์ด๋ฆ„:
12
external: true

volume: ์“ฐ๊ณ  ๊ทธ ์•ˆ์— ๋ณผ๋ฅจ์žฅ์ฐฉํ•˜๋Š” ๋ช…๋ น์–ด ์ž…๋ ฅํ•˜๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ƒฅ ์“ฐ๋ฉด docker compose ์‹คํ–‰์‹œ ์ง์ ‘ ๋ณผ๋ฅจ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๊ฒŒ ์‹ซ๊ณ  ๊ธฐ์กด์— ์žˆ๋˜ ๋ณผ๋ฅจ์„ ์“ธ๋ ค๋ฉด ์ตœ์ƒ๋‹จ์— volumes: ๋„ฃ๊ณ , ๊ธฐ์กด ๋ณผ๋ฅจ์ด๋ฆ„๊ณผ external: true๋ฅผ ๋„ฃ์–ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก cf. bind mount ์‹์œผ๋กœ ๋ณผ๋ฅจ์„ ์“ฐ๋ ค๋ฉด, ๋ณผ๋ฅจ์ด๋ฆ„ ๋Œ€์‹  ์—ฌ๋Ÿฌ๋ถ„๋“ค ํด๋”๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ฃผ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1
services:
2
db:
3
image: postgres:17-alpine
4
environment:
5
- POSTGRES_USER=admin
6
- POSTGRES_PASSWORD=qwer1234
7
# ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋”๋ฅผ volume์œผ๋กœ ์“ฐ๋ ค๋ฉด bind mount
8
volumes:
9
# ./vol:/var/lib/postgresql/data
10
- ํด๋”์ด๋ฆ„:/var/lib/postgresql/data
  • e.g. docker compose ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ์— vol ํด๋”๋ฅผ ๋ณผ๋ฅจ์œผ๋กœ ์“ฐ๋ ค๋ฉด,
  • ๋ณผ๋ฅจ์ด๋ฆ„๋ž€์— ./vol ์ด๋ ‡๊ฒŒ ์ ๋Š”๊ฒŒ ์–ด๋–จ๊นŒ์š”.

2.3 ๊ธฐํƒ€ ๋ช…๋ น์–ด๋“ค

๊ฐ€๋”๊ฐ€๋‹ค๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์ด ํ˜ผ์ž ์ข…๋ฃŒ๋˜๋Š” ์ƒํ™ฉ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›น์„œ๋ฒ„์˜ ๊ฒฝ์šฐ์—” ์œ ์ €๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ฑฐ๋‚˜ ์ด์ƒํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ๋• ์–ด๋–ป๊ฒŒ ํ•˜๊ฒŒ์š”? ๊บผ์ง€๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ผ๊ณ  ์ฝ”๋“œ๋ฅผ ์งœ๋‘๊ฑฐ๋‚˜ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • nodejs๊ฐ™์€ ๊ฒฝ์šฐ์—” pm2๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์“ฐ๋ฉด ๋‹ค์šด๋˜๊ฑฐ๋‚˜ ๊ทธ๋Ÿด ๋•Œ ๊ทธ๋ƒฅ ์•Œ์•„์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์ฃผ๊ณ  ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
  • nginx๊ฐ™์€ ๊ฒฝ์šฐ์—” ๋ฆฌ๋ˆ…์Šค์˜ systemctl ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ ์“ฐ๋ฉด ๋” ๊ฐ„๋‹จํ•˜๊ณ  ํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ docker๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ ์•Œ์•„์„œ ์žฌ์‹œ์ž‘ํ•ด์ฃผ๋Š” ๊ฐ„ํŽธํ•œ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1
services:
2
webserver:
3
image: nodeserver:1
4
5
nginx:
6
image: nginx:1
7
ports:
8
- 80:80
9
restart: always # ๋‹ค์‹œ ์žฌ์‹œ์ž‘
10
11
db:
12
image: postgres:17-alpine
13
environment:
14
- POSTGRES_USER=${POSTGRES_USER}
15
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
16

restart: always ์ด๋Ÿฐ๊ฑฐ ๋„ฃ์–ด๋‘๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊บผ์ ธ๋„ ์•Œ์•„์„œ ์žฌ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

  • ์‹ฌ์ง€์–ด docker ์—”์ง„ ์ž์ฒด๊ฐ€ ๊ป๋‹ค ์ผœ์ ธ๋„ ์•Œ์•„์„œ ์„œ๋น„์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ํ•ญ์ƒ ์žฌ์‹œ์ž‘๋˜์–ด์•ผํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ์œผ๋ฉด ์ด๊ฑฐ ์ ์–ด๋‘ก์‹œ๋‹ค.
  • cf. docker compose ์•ˆ์“ธ๊ฑฐ๋ฉด, docker run -d --restart always ์ด๋Ÿฐ ์‹์œผ๋กœ ์˜ต์…˜์„ ์ง‘์–ด๋„ฃ์Šต๋‹ˆ๋‹ค.
1
docker compose up -d

์—„๋งˆ๊ฐ€ ๋‚จ์˜ ๋ง ๋ฏฟ์ง€ ๋ง๋žฌ์œผ๋‹ˆ ์ง„์งœ์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด docker desktop ๊ป๋‹ค ์ผœ๋ณด์…”๋„ ๋˜๊ณ , ์•„๋‹ˆ๋ฉด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ค๋ฅ˜๋ฐœ์ƒ์‹œ์ผœ์„œ ๋„๊ณ  ์‹ถ์œผ๋ฉด nginx๊ฐ™์€๊ฑฐ์— docker exec์œผ๋กœ ์ ‘์†ํ•ด์„œ kill ๋ช…๋ นํ•œ๋ฒˆ ์ค˜๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

docker_9-2

โ–ฒ ํ„ฐ๋ฏธ๋„์— ps ์ž…๋ ฅํ•˜๋ฉด ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ž˜๋ณด๋ฉด 1๋ฒˆ ํ”„๋กœ์„ธ์Šค๋กœ nginx ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰์ค‘์ž…๋‹ˆ๋‹ค. ์ด๊ฑธ ๊ฐ•์ œ์ข…๋ฃŒ ํ•ด๋ฒ„๋ฆฌ๊ณ  ์‹ถ์œผ๋ฉด ํ„ฐ๋ฏธ๋„์— kill 1 ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ restart always๋ฅผ ์ ์–ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฃŒ๋˜์–ด๋„ ์–˜๊ฐ€ ์•Œ์•„์„œ ์žฌ์‹œ์ž‘๋˜๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์žฌ์‹œ์ž‘ ๋˜์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด ์ปจํ…Œ์ด๋„ˆ์˜ Inspect ๋ฉ”๋‰ด์—์„œ restart ์–ด์ฉŒ๊ตฌ ๊ฒ€์ƒ‰ํ•ด๋ด…์‹œ๋‹ค.)

๐Ÿ’ก cf. ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด docker ๋ช…๋ น์–ด๋‚˜ ์ด๋Ÿฐ๊ฑธ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง์ ‘ ์ •์ง€์‹œ์ผฐ์„ ๋•Œ๋Š” restart๋ฅผ ๋ญ˜๋กœ ํ•ด๋†จ๋“  ๊ฐ„์— ์ž๋™ ์žฌ์‹œ์ž‘์€ ์•ˆ๋ฉ๋‹ˆ๋‹ค.

1
services:
2
webserver:
3
image: nodeserver:1
4
5
nginx:
6
image: nginx:1
7
ports:
8
- 80:80
9
restart: unless-stopped
10
11
db:
12
image: postgres:17-alpine
13
environment:
14
- POSTGRES_USER=${POSTGRES_USER}
15
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

restart: unless-stopped ์ด๋Ÿฐ ๋ช…๋ น๋„ ๋น„์Šทํ•œ๋ฐ, ์–˜๋Š” docker ์žฌ์‹œ์ž‘ํ•ด๋„ ์ž๋™์œผ๋กœ ์‹œ์ž‘์€ ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์‹ค์€ ๋น„์Šทํ•ด์„œ ๊ทธ๋ƒฅ ์ด๊ฑฐ ์“ฐ๋„๋ก ํ•ฉ์‹œ๋‹ค.

  1. restart
    • ์ปจํ…Œ์ด๋„ˆ ๊บผ์ ธ๋„ ์ž๋™ ์žฌ์‹œ์ž‘
    • Docker ์—”์ง„ ๊ป๋‹ค์ผœ๋„ ์ž๋™ ์‹œ์ž‘
  2. unless-stopped
    • ์ปจํ…Œ์ด๋„ˆ ๊บผ์ ธ๋„ ์ž๋™ ์žฌ์‹œ์ž‘

3. ์‹ค์‹œ๊ฐ„ ๊ฐœ๋ฐœ, graceful shutdown

๊ฐ€๋” ๊ฐœ๋ฐœํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„์›Œ๋ณด๋ฉด์„œ ๊ฐœ๋ฐœํ•ด๋ณด๋Š” ๊ฒฝ์šฐ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŒ€์›๋ผ๋ฆฌ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์•„์˜ˆ ๋˜‘๊ฐ™์ด ๋งž์ถœ ๋•Œ
  • ๋ฐฐํฌ์ „์— ํ…Œ์ŠคํŠธํ•˜๋ ค๊ณ 
  • ๊ทธ๋ƒฅ ํŽธํ•ด์„œ

์ด๋Ÿฐ ์ด์œ ๋กœ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋„์›Œ์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌ๋ฉด ๊ท€์ฐฎ์€ ์ ์ด ์žˆ๋Š”๋ฐ, e.g. ์„œ๋ฒ„์—์„œ โ€œ์•ˆ๋…•โ€์ด๋ผ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ โ€œ์•ˆ๋…•123โ€ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๋™์‚ฌํ•ญ์ด ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ์ž˜ ๋Œ์•„๊ฐ€๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๊ฒŒ์š”?

  1. docker compose down ํ•˜๊ณ 
  2. ์›น์„œ๋ฒ„ ์ด๋ฏธ์ง€ ๋‹ค์‹œ ๋งŒ๋“ค๊ณ 
  3. docker compose up ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌ๋ฉด ๊ท€์ฐฎ์•„์„œ ๋„์ปค ์‚ญ์ œํ•˜๊ณ  ์‹ถ์–ด์งˆํ…๋ฐ ๋‹น์—ฐํžˆ ๊ฐœ์„  ๋ฐฉ๋ฒ•์ด ๋ช‡๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค.


3.1 ๋นŒ๋“œ ์ž๋™ํ™”

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์€ docker compose ํŒŒ์ผ์— โ€œํ•ญ์ƒ docker build ํ•˜๊ณ  ๋‚˜์„œ ์ปจํ…Œ์ด๋„ˆ ๋„์šฐ์„ธ์š”โ€ ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1
services:
2
webserver:
3
image: nodeserver:1
4
build: . # ์›ํ•˜๋Š” Dockerfile ๊ฒฝ๋กœ
5
ports:
6
- 8080:8080
7
8
nginx:
9
image: nginx:1
10
ports:
11
- 80:80

build: ๋„์ปคํŒŒ์ผ๊ฒฝ๋กœ์ž…๋ ฅํ•˜๋ฉด ๋˜๋Š”๋ฐ, ๊ทธ๋Ÿผ ์ด์ œ docker compose upํ•  ๋•Œ๋งˆ๋‹ค, ํ•ด๋‹น ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋„์ปคํŒŒ์ผ์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์ž๋™์œผ๋กœ docker build ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์ด๋ฏธ์ง€๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์›Œ์ค๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ docker compose up ๋ง๊ณ , docker compose up --build ์ด๋Ÿฐ ๋ช…๋ น์–ด๋ฅผ ์จ์•ผ ์ž๋™์œผ๋กœ docker build ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์•„๊นŒ์™€ ๋‹ค๋ฅด๊ฒŒ

  1. docker compose down
  2. docker compose up --build

์ž…๋ ฅํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ ๋ช…๋ น์–ด๊ฐ€ 1๊ฐœ ์ค„์–ด๋“ค์–ด์„œ ํŽธ๋ฆฌํ•ด์กŒ๊ตฐ์š”.


3.2 graceful shutdown ๊ธฐ๋Šฅ

์ปจํ…Œ์ด๋„ˆ ๋„๊ณ  ์žฌ์‹œ์ž‘ํ•˜๊ณ  ๊ทธ๋Ÿฐ๊ฒŒ ๋„ˆ๋ฌด ๋А๋ฆฐ๊ฒฝ์šฐ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์›น์„œ๋ฒ„ํ•˜๋‚˜ ๋„๋Š”๋ฐ 10์ดˆ๋„˜๊ฒŒ ๊ฑธ๋ฆฐ๋‹ค๋ฉด ๊ทธ ์ด์œ ๋Š” ์„œ๋ฒ„ ๊บผ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์•ˆ์งœ์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

docker_9-3

โ–ฒ ์›๋ž˜ docker ์—”์ง„์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒ์‹œํ‚ฌ ๋•Œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋ƒ๋ฉด, โ€œ์ข‹์€๋งํ•  ๋•Œ ์•Œ์•„์„œ ๋„๋ผโ€ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋กœ๊ทธ๋žจ์€ ๊ทธ ๊ฒฝ๊ณ ์„ฑ ๋ฉ”์„ธ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ์•Œ์•„์„œ ์ข…๋ฃŒํ•˜๋ผ๊ณ  ์ฝ”๋“œ์งœ๋†“์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ข…๋ฃŒํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๊ฑฐ๋‚˜ ๊ทธ๋Ÿฌ๋ฉด 10์ดˆ ์ •๋„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ฐ•์ œ๋กœ ๊บผ์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ข…๋ฃŒํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ข€ ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.

server.js
1
const express = require('express')
2
const app = express()
3
4
const server = app.listen(8080, () => {
5
console.log('์„œ๋ฒ„ ์‹คํ–‰์ค‘ http://localhost:8080')
6
})
7
8
app.get('/', (req, res) => {
9
res.send('์•ˆ๋…•')
10
})
11
12
process.on('SIGTERM', () => {
13
server.close(() => {
14
console.log('HTTP server closed')
15
})
16
})
17
18
process.on('SIGINT', () => {
19
server.close(() => {
20
console.log('HTTP server closed')
21
})
22
})

๊ทธ๋ž˜์„œ ์›น์„œ๋ฒ„์— SIGTERM ๋ฉ”์„ธ์ง€๊ฐ€ ๋“ค์–ด์˜ค๋ฉด server.close()ํ•˜๋ผ๊ณ  ์ฝ”๋“œ์งฐ์Šต๋‹ˆ๋‹ค.

  • express์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ธ server.close()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„์— ๋“ค์–ด์˜จ ์š”์ฒญ์„ ๋‹ค ์ฒ˜๋ฆฌํ•œ ํ›„์— ์ด์˜๊ฒŒ ์•Œ์•„์„œ ๊บผ์ง‘๋‹ˆ๋‹ค.
  • SIGTERM์€ Docker ์—”์ง„์ด ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒํ•  ๋•Œ ๋ณด๋‚ด๋Š” โ€œ์ข‹์€ ๋งํ•  ๋•Œ ์•Œ์•„์„œ ๋„๋ผโ€ ๊ฒฝ๊ณ ๋ฉ”์„ธ์ง€์ž…๋‹ˆ๋‹ค.
  • SIGINT๋Š” ์œ ์ €๊ฐ€ ํ„ฐ๋ฏธ๋„์—์„œ ctrl + c ๋ˆ„๋ฅผ ๋•Œ ๋ณด๋‚ด์ง€๋Š” ๋ฉ”์„ธ์ง€์ž…๋‹ˆ๋‹ค.
  • cf. ํ„ฐ๋ฏธ๋„์— kill 1 ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋„ SIGTERM ๋ฉ”์„ธ์ง€ ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทผ๋ฐ ๋‚˜์ค‘์— ์„œ๋ฒ„์—์„œ DB๋„ ์“ฐ๊ณ  ๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„๋ฅผ ๋Œ ๋•Œ DB ์—ฐ๊ฒฐ ํ•ด์ œํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์ด๋Ÿฐ ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ๋„๊ธฐ ์ „์— ์ด๊ฑฐ์ €๊ฑฐ ์ฑ™๊ธฐ๋Š”๊ฑธ ๋ฉ‹์žˆ๋Š” ๋ง๋กœ graceful shutdown์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋Œ๋ฆด ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์ž์ฃผ ๊ป๋‹ค์ผœ์ง€๊ณ  ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ
  • ์ปจํ…Œ์ด๋„ˆ ์•ˆ์˜ ํ”„๋กœ๊ทธ๋žจ๋“ค์— graceful shutdown ์ž˜ํ•ด๋†จ๋‚˜ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์Šต๊ด€์ด๋‹ˆ๊นŒ ๋‚˜์ค‘์— ํ•œ๋ฒˆ ์ฑ™๊ฒจ๋ด…์‹œ๋‹ค.

3.3 watch ๊ธฐ๋Šฅ

์•„๊นŒ โ€œ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ž๋™์œผ๋กœ ๋นŒ๋“œํ•˜์„ธ์š”โ€ ์ด๋ ‡๊ฒŒ ํ•ด๋†จ๋Š”๋ฐ ์ด๊ฒƒ๋„ ์“ฐ๋‹ค๋ณด๋ฉด ์˜ค๋ž˜๊ฑธ๋ ค์„œ ๊ท€์ฐฎ์Šต๋‹ˆ๋‹ค.

  • ๊ทธ๋Ÿด ๋• ์‹œ๊ฐ„๋‚ด์„œ docker compose์˜ watch ๊ธฐ๋Šฅ ์…‹ํŒ…ํ•ด๋‘๋ฉด,
  • ํŠน์ • ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์–˜๊ฐ€ ๋ฐ”๋กœ๋ฐ”๋กœ ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌ๋ฅผ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—,
  • ๊ทธ๋ž˜์„œ ์ด๊ฑฐ ์“ฐ๋ฉด ๋งค๋ฒˆ ๋นŒ๋“œ ๊ทธ๋”ด๊ฑฐ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์„œ ๋งค์šฐ ํŽธ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค. ๋‚˜๋ฆ„ ์ตœ์‹ ๊ธฐ๋Šฅ์ž„
1
services:
2
webserver:
3
image: nodeserver:1
4
build: .
5
develop:
6
watch:
7
- action: sync
8
path: .
9
target: /app
10
ignore:
11
- node_modules/
12
13
nginx:
14
image: nginx:1
15
ports:
16
- 80:80

์šฐ์„  ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘์„ฑํ•ด๋‘ก์‹œ๋‹ค. ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜์›ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— develop: ๋„ฃ๊ณ , watch: ๋„ฃ๊ณ  ์‹œ์ž‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  1. action: sync๋Š” ๋‚ด ์ปดํ“จํ„ฐ์— ์žˆ๋˜ ํŒŒ์ผ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•ด์ฃผ๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
    • ๋ณต๋ถ™๋ง๊ณ  ๋นŒ๋“œ, ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘ ๋“ฑ ๋‹ค๋ฅธ ํ–‰์œ„๋„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๊ฑด ๋‚˜์ค‘์— ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.
  2. path:์—๋Š” ๋‚ด ์ปดํ“จํ„ฐ์˜ ์–ด๋–ค ํŒŒ์ผ๋“ค ๊ฐ์‹œํ• ๊ฑด์ง€ ๊ฒฝ๋กœ ์ ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  3. target:์—๋Š” ์ปจํ…Œ์ด๋„ˆ ์–ด๋””์— ๋ณ€๋™์‚ฌํ•ญ์„ ๋ณต์‚ฌํ• ๊ฑด์ง€ ๊ฒฝ๋กœ ์ ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  4. ignore:์•ˆ์—๋Š” ๋ณ€๋™์‚ฌํ•ญ์„ ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํŒŒ์ผ์ด๋‚˜ ํด๋”๋“ค ๊ธฐ๋กํ•ด๋‘๋ฉด ๋˜๋Š”๋ฐ,
    • .dockerignore ํŒŒ์ผ ์“ฐ๊ณ  ์žˆ์œผ๋ฉด ๋”ฐ๋กœ ์ ์„ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์œ„์ฒ˜๋Ÿผ ์ ์œผ๋ฉด ํ˜„์žฌ ํด๋”์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์ด ๋ณ€๋™์‚ฌํ•ญ์ด ์ƒ๊ฒผ์„ ๋•Œ app ํด๋” ์•ˆ์— ๊ทธ๋Œ€๋กœ ๋ณ€๋™์‚ฌํ•ญ์ด ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก cf. build: ์˜ต์…˜์ด ๋“ค์–ด์žˆ์–ด์•ผ ์ž˜๋ฉ๋‹ˆ๋‹ค.


3.4 ์ง„์ง ์ง€ ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธํ•ด๋ณด๋ ค๋ฉด docker compose down ํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ up ํ•˜๋ฉด ๋ ํ…๋ฐ, ์‹ค์€ docker compose up --watch๋ผ๊ณ  ๋ช…๋ น์„ ์ค˜์•ผ watch ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด๋‘๋ฉด ์ด์ œ ์ฝ”๋“œ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ๋นŒ๋“œํ•˜๊ณ  ์ง€๋ž„ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง€๋Š”๊ตฐ์š”.

docker_9-4

โ–ฒ ์ง„์งœ ๊ทธ๋Ÿฐ์ง€ ์ฝ”๋“œ ์ˆ˜์ •ํ•˜๊ณ  ์ €์žฅํ•ด๋ดค๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด docker desktop ๋“ค์–ด๊ฐ€์„œ ์ปจํ…Œ์ด๋„ˆ ๋“ค์–ด๊ฐ€์„œ ํŒŒ์ผ ๊ฒ€์‚ฌํ•ด๋ณด๋ฉด, ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์ง„์งœ๋กœ ์ปจํ…Œ์ด๋„ˆ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณต์‚ฌ๋œ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทผ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์—ด์–ด์„œ ์„œ๋ฒ„์— ์ ‘์†ํ•ด๋ณด๋ฉด.. ์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ๋˜๊ณ ์žˆ๋Š”๋ฐ์š”? ์™œ ๊ทธ๋Ÿฌ๋ƒ๋ฉด ์›๋ž˜ ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ๋„ ์ฝ”๋“œ ์ˆ˜์ •ํ–ˆ์œผ๋ฉด ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์ค˜์•ผ ๋ฐ˜์˜์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋Ÿด ๋ฟ์ด๋ผ ์„œ๋ฒ„๋„ ์žฌ์‹œ์ž‘ํ•˜๋ผ๊ณ  ์„ค์ •์„ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1
services:
2
webserver:
3
image: nodeserver:1
4
build: .
5
develop:
6
watch:
7
- action: sync+restart # ์ฝ”๋“œ ๋ณต๋ถ™ + ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘
8
path: .
9
target: /app
10
ignore:
11
- node_modules/
12
13
nginx:
14
image: nginx:1
15
ports:
16
- 80:80
  • action: sync+restart ์ด๋Ÿฐ ์˜ต์…˜์„ ๋„ฃ์œผ๋ฉด โ€œsyncํ•œ ํ›„์— ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘ํ•˜๋ผโ€๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  • ์ง„์งœ ์žฌ์‹œ์ž‘๊นŒ์ง€ ์ž˜ ๋˜๋‚˜ ํ…Œ์ŠคํŠธํ•ด๋ด…์‹œ๋‹ค.
1
docker build . -t nodeserver:1
2
docker compose up --watch

๋ณดํ†ต nginx๊ฐ™์€๊ฒƒ๋„ ์„ค์ •์„ ๋ฐ”๊พธ๋ฉด ํ•œ๋ฒˆ ์žฌ์‹œ์ž‘ํ•ด์•ผ ์ ์šฉ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ ๋ฐ”๊ฟ€ ๋•Œ ๋งˆ๋‹ค ์žฌ์‹œ์ž‘์ด ํ•„์š”ํ•œ ์ปจํ…Œ์ด๋„ˆ์— ๋‹ฌ์•„๋†“์œผ๋ฉด ๊ฐœ๋ฐœํ•  ๋•Œ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


3.5 command๋กœ CMD ๋ฎ์–ด์“ฐ๊ธฐ

cf. nodejs๋กœ ์„œ๋ฒ„๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”

  • nodemon๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์„œ nodemon server.js๋ผ๋Š” ๋ช…๋ น์–ด๋กœ ์„œ๋ฒ„๋ฅผ ๋„์šฐ๋ฉด,
  • ํŒŒ์ผ๋ณ€๊ฒฝ์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ์žฌ์‹œ์ž‘์„ ์•Œ์•„์„œ ํ•ด์ค˜์„œ ์ด๋Ÿฐ๊ฑฐ ์จ๋„ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ช…๋ น์–ด๋ฅผ node server.js์—์„œ nodemon server.js๋กœ ๋ฐ”๊พธ๋ฉด ๋ ํ…๋ฐ,

  • Dockerfile๊ฐ€์„œ ๋งˆ์ง€๋ง‰ CMD ๋ช…๋ น์–ด๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๊ทธ๋Ÿฐ๊ฒŒ ๊ท€์ฐฎ์œผ๋ฉด,
  • docker composeํŒŒ์ผ์—์„œ CMD ๋ช…๋ น์–ด๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
1
services:
2
webserver:
3
build: .
4
ports:
5
- 8080:8080
6
7
command: ["nodemon", "server.js"]
8
develop:
9
# ์ƒ๋žต

command: ์ด๋Ÿฐ๊ฑธ ์„œ๋น„์Šค๋งˆ๋‹ค ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ์„œ๋น„์Šค๋ฅผ ๋„์šธ ๋•Œ dockerfile์— ์žˆ๋˜ CMD ์˜†์— ์žˆ๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ฎ์–ด์“ฐ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ docker compose ์‹คํ–‰์‹œ ๋งค๋ฒˆ ๋‹ค๋ฅธ ๋ช…๋ น์–ด ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.


3.6 action: rebuild

1
services:
2
webserver:
3
image: nodeserver:1
4
build: .
5
develop:
6
watch:
7
- action: sync+restart
8
path: .
9
target: /app
10
ignore:
11
- node_modules/
12
- action: rebuild # path ํŒŒ์ผ๋“ค ๋ณ€๊ฒฝ์‹œ ์ž๋™์œผ๋กœ docker build
13
path: package.json
14
15
nginx:
16
image: nginx:1
17
ports:
18
- 80:80

action: rebuild ์ง‘์–ด๋„ฃ์œผ๋ฉด, โ€œpath์— ์žˆ๋Š” ํŒŒ์ผ์ด๋‚˜ ํด๋”๊ฐ€ ๋ณ€๋™์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด ๊ทธ๋ƒฅ ์•„์˜ˆ docker build๋ฅผ ๋‹ค์‹œ ํ•ด๋‹ฌ๋ผโ€๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋‹ค์‹œ ๋งŒ๋“ค๋ผ๋Š” ๋œป์ž„.

๊ทธ๋ž˜์„œ Node.js ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ™์€๊ฑฐ ์„ค์น˜ํ•˜๋Š”๊ฑฐ ๋ณ€๋™์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด,

  • ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ๋งŒ๋“œ๋Š”๊ฒŒ ๊น”๋”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— package.jsonํŒŒ์ผ ๋ณ€๊ฒฝ๋˜๋ฉด,
    • rebuildํ•˜๋ผ๊ณ  ์ฝ”๋“œ์งœ๋†“๋Š” ๊ฒฝ์šฐ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ์ˆ˜์ •ํ•˜๊ณ ๋‚˜์„œ ํ•ญ์ƒ ์ปดํŒŒ์ผ์ด ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ๋“ค๋„ ์ด๊ฑธ sync๊ฐ€ ์•„๋‹ˆ๋ผ rebuild๋กœ ์ ๋Š” ๊ฒฝ์šฐ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • action:์€ ์—ฌ๋Ÿฌ๊ฐœ ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ•„์š”ํ•˜๋ฉด ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

๐Ÿ’ก ๊ฒฐ๋ก 

  • ๋‚ด ์ฝ”๋“œ๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋„์›Œ๋ณด๋ฉด์„œ ์‹ค์‹œ๊ฐ„ ์ฝ”๋”ฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด docker compose์˜ watch ๊ธฐ๋Šฅ์„ ๊บผ๋‚ด์”์‹œ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ๊ป๋‹ค๊ฐ€ ์ผค ์ผ์ด ๋งŽ๋‹ค๋ฉด graceful shutdown ์ž˜ํ•ด๋†จ๋‚˜ ํ™•์ธํ•ฉ์‹œ๋‹ค.