1. ์๋น์ค ์์ฑํ๊ธฐ
docker run ๋ช
๋ น์ด๊ฐ ์ฌ์ฌ ๊ธธ์ด์ง๋ฉด docker๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ถ์ด์ง๋๋ค.
๊ทธ๊ฒ ์ซ์ผ๋ฉด ๋ช
๋ น์ด๋ค์ ํ ํ์ผ์ ์
๋ ฅํด๋๊ณ ๊ทธ๊ฑธ ์คํํ๋ ์์ผ๋ก ์ฝ๋์ง๋์ผ์
๋ ๋ฉ๋๋ค.
๊ทธ๋ด๋ ค๋ฉด shell script ์ด๋ฐ๊ฑฐ ์ง์ ์คํํด๋ ๋๊ธด ํ๋๋ฐ,
docker compose๋ผ๋ ํ๋ก๊ทธ๋จ์ ์ฐ๋ฉด ํจ์ฌ ์ฝ๊ฒ ๊ตฌํ๊ฐ๋ฅํฉ๋๋ค.
๋ฐ๋ก ์ค์นํ ํ์๋ ์๊ณ , docker desktop ์ค์นํ ๋ ๊ฐ์ด ์ค์น๋ฉ๋๋ค.
1.1 docker compose ์ฌ์ฉํ๋ ๋ฒ
docker-compose.ymlํ์ผ ํ๋ ๋ง๋ค์ด์- ๊ฑฐ๊ธฐ๋ค๊ฐ
docker run ์ด์ฉ๊ตฌ ์ฐ๋ ๋ช ๋ น์ด๋ค์ ์ญ ๋์ดํ๊ณ , - ์ด์ ํฐ๋ฏธ๋์์
docker compose up์ด๋ผ๊ณ ์ ๋ ฅํ๋ฉด, ์ด ํ์ผ์ ์๋ ๋ด์ฉ์ด ์ญ ์คํ๋ฉ๋๋ค.
ํธ๋ฆฌํ์ฃ ? ํ์ง๋ง docker compose ๋ฌธ๋ฒ + yaml ํ์ผ ํ์์ ๋ง๊ฒ .yml ํ์ผ์ ์ฑ์์ผํฉ๋๋ค.
1.2 services
yml ํ์ผ์ด ๋ญ๋๋ฉด ์ผ๋จ ๋ฐ์ดํฐ ์ ์ฅํ๋ ์ฉ๋์ ํ์ผํ์์
๋๋ค.
.json ์๋ ๋ถ๋ค์ ๊ทธ ํ์ผ์ด๋ ๋น์ทํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
.yml ํ์ผ์ ๋ฐ์ดํฐ์ด๋ฆ : ๊ฐ์ด๋ฐ ์์ผ๋ก ์ ์ฅํฉ๋๋ค.
์ด๋ค ๋ฐ์ดํฐ์ ์ํ๋ ํ์ ๋ฐ์ดํฐ๋ ์ธ๋ดํธ ๋ฃ๊ณ ๋ฐ์ดํฐ์ด๋ฆ : ๊ฐ์ ์ ์ผ๋ฉด ๋์
๋๋ค.
1# docker-compose.yml2services:3์ปจํ ์ด๋์ด๋ฆ:4image: ์ด๋ฏธ์ง์ด๋ฆ5ports:6- ๋ด์ปดํจํฐํฌํธ:์ปจํ ์ด๋ํฌํธ
๊ทธ๋์ ๋ง๋ค์ด๋ dockerํ์ผ์ ๋ฃจํธ๊ฒฝ๋ก์์ docker-compose.yml ํ์ผ ๋ง๋ค์ด์ ์ด๋ ๊ฒ ์์ฑํด๋ด
์๋ค.
services: ๋ผ๊ณ ์ ๊ณ ์ธ๋ดํธ ๋ฃ์ด์ ํ์ ํญ๋ชฉ์ผ๋ก ์ปจํ
์ด๋ ์ด๋ฆ์ ํ๋ ์๋ช
ํฉ์๋ค.
์ ํํ๋ ์๋น์ค ์ด๋ฆ์ธ๋ฐ ์ผ๋จ์ ์ปจํ
์ด๋ ์ด๋ฆ์ด๋ผ๊ณ ๋ถ๋ฆ
์๋ค.
๊ทธ ๋ค์์ ํ์ ํญ๋ชฉ์ผ๋ก image: ์ด๋ฏธ์ง์ด๋ฆ์ ์ผ๋ฉด ์ด ์ด๋ฏธ์ง๋ฅผ ์ปจํ
์ด๋๋ก ๋์์ค๋๋ค.
ports: ํ์ํญ๋ชฉ์ผ๋ก ํฌํธ๋ฐ์ธ๋ฉ ์ด๋ป๊ฒ ํ ๊ฑด์ง๋ ์ ํ ์ ์์ต๋๋ค.
- VSCode ์๋ํฐ ์ฐ๋ ๋ถ๋ค์ ์ด๋ฐ๊ฑฐ ์์ฑํ ๋ Docker ๋ถ๊ฐ๊ธฐ๋ฅ ์ค์นํ๋ฉด ํธ๋ฆฌํ ์ ์์ต๋๋ค.
- cf. ์์ ์ ๋์ปค version ๋ถํฐ ๋งจ ์์ ๋ฃ๊ณ ์์ํ๋๋ฐ ์์ฆ์ ๊ทธ๋ด ํ์ ์์ต๋๋ค.
1.3 ํ๊ฒฝ๋ณ์ ๋ฃ์ผ๋ ค๋ฉด
1# docker-compose.yml2services:3์ปจํ ์ด๋์ด๋ฆ:4image: ์ด๋ฏธ์ง์ด๋ฆ5ports:6- ๋ด์ปดํจํฐํฌํธ:์ปจํ ์ด๋ํฌํธ7environment:8- ํ๊ฒฝ๋ณ์์ด๋ฆ=๊ฐ9- ํ๊ฒฝ๋ณ์์ด๋ฆ=๊ฐ
ํ๊ฒฝ ๋ณ์๋ ์ด๋ฐ์์ผ๋ก ํ๋ํ๋ ์ ์ด๋๋ฉด ๋ฉ๋๋ค. ํ๋ํ๋ ์ ๊ธฐ ๊ท์ฐฎ์ผ๋ฉด ๋ค๋ฅธ ํ์ผ์ ์๋๊ฑธ ๋์ด๋ค๊ฐ ์ธ ์ ์์ต๋๋ค.
1POSTGRES_USER=admin2POSTGRES_PASSWORD=qwer1234
e.g. ์ฐ๋ฆฌ๊ฐ ์ฝ๋ฉํ ๋ .envํ์ผ์ ํ๊ฒฝ๋ณ์๋ฅผ ๊ฐ๋ ์ ์ด๋๊ธฐ๋ ํฉ๋๋ค.
์ด ํ์ผ์ ์๋๊ฑธ docker compose ์ค์ ํ์ผ์์ ๊ทธ๋๋ก ๊ฐ์ ธ์ฌ ์๋ ์์ต๋๋ค.
1# docker-compose.yml2environment:3- POSTGRES_USER: ${POSTGRES_USER}
๊ทธ๋ด๋ ค๋ฉด ${} ์ฐ๊ณ .env ํ์ผ์ ์๋ ํ๊ฒฝ๋ณ์ ์ด๋ฆ ์ ์ด์ฃผ๋ฉด ๋๊ฒ ์ต๋๋ค.
1services:2# ์๋ต34db:5image: postgres:17-alpine6env_file:7- fileName.env8environment:9- POSTGRES_USER=${POSTGRES_USER}10- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
.env ํ์ผ์ด ์ฌ๋ฌ๊ฐ ์์ผ๋ฉด, ๊ทธ ์ค์ ์ด๋์ ๊ฐ์ ธ์ฌ๊ฑด์ง ๋ช
์ํ๋ ๊ธฐ๋ฅ๋ ์๋๋ฐ ํ์ํ ๋ ์ฐพ์์์๋ค.
1.4 ๋์ฐ๋ ๋ช ๋ น์ด๋
1# docker-compose.yml2services:3webserver:4image: nodeserver:15ports:6- 8080:8080
๊ทธ๋์ ์ ์ ๋ง๋ค์ด ๋์ ์น์๋ฒ ๋์ฐ๊ณ ์ถ์ด์ ์ด๋ ๊ฒ ์์ฑํด๋จ์ต๋๋ค.
1docker compose up -d # compose๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋ ๋์, -d๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ2docker compose stop # compose๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋ ์ ์ง3docker compose down # compose๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋ ์ญ์
docker compose ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ๋์ฐ๊ณ ,์ ์งํ๊ณ , ์ญ์ ํ๋ ค๋ฉด ์ฐจ๋ก๋ก ์ด๋ฐ๊ฑธ ์
๋ ฅํฉ์๋ค.
1.5 ๋ค๋ฅธ ์ปจํ ์ด๋ ๋์ฐ๊ธฐ
์น์๋ฒ๋ ์ ๋จ๋ ๊ฒ ๊ฐ์๋ฐ,
nginx๊ฐ์ ๋ค๋ฅธ ์ปจํ
์ด๋๋ฅผ ํ๋ ๋ ๋์ฐ๊ณ ์ถ์ผ๋ฉด, service: ํ์ ํญ๋ชฉ์ ๋ ์ ์ํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋๊น ๋์ธ ์ด๋ฏธ์ง๋ง๋ค ์๋น์ค ํ๋์ฉ ๋ง๋ค๋ฉด ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
1# docker-compose.yml2services:3webserver: # ์ปจํ ์ด๋ ์ด๋ฆ4image: nodeserver:15ports:6- 8080:808078nginx: # ์ปจํ ์ด๋ ์ด๋ฆ9image: nginx:110ports:11- 80:80
๊ทธ๋์ ์ ์ฅํ๊ณ docker compose downํ ๋ค์์,
docker compose up -dํด๋ณด๋ฉด, ์ปจํ
์ด๋ 2๊ฐ๊ฐ ๋์์ ์ ๋น๋๋ค.
1.6 ๋คํธ์ํฌ
์ปจํ
์ด๋๊ฐ ํต์ ์ด ํ์ํด์ ๋คํธ์ํฌ๊ฐ ํ์ํ๋ค๋ฉด, ์ค์ ๋คํธ์ํฌ๋ฅผ ๋ฐ๋ก ๋ง๋ค๊ณ ๊ทธ๋ด ํ์๊ฐ ์์ต๋๋ค.
services: ํ์ํญ๋ชฉ์ ์๋ ์ปจํ
์ด๋๋ค์ ์๋์ผ๋ก ๋คํธ์ํฌ ํ๋ ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ ์ ๋ถ ๋ฃ์ด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ต๋๋ค.
1// myconfig1.conf2server {3listen 80;4location / {5proxy_pass http://webserver:8080;6proxy_set_header Host $host;7proxy_set_header X-Real-IP $remote_addr;8proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;9proxy_set_header X-Forwarded-Proto $scheme;10}11}
๊ทธ๋ฆฌ๊ณ ๋คํธ์ํฌ ์์ ์๋ ์ปจํ
์ด๋๋ผ๋ฆฌ ์๋ก ์ฐพ์ผ๋ ค๋ฉด,
IP์ฃผ์ ํน์ ์ปจํ
์ด๋ ์ด๋ฆ (์๋น์ค ์ด๋ฆ)์ ๊ธฐ์ฌํ๋ฉด ๋๋๊น, ์์์ nginx์ ์น์๋ฒ ์ฐ๊ฒฐํด๋ณด์๋ฉด ๋๊ฒ ์ต๋๋ค.
1docker build ./nginx -t nginx:12docker build . -t nodeserver:1
1.7 ์ฌ๋ฌ ์ปจํ ์ด๋๋ค์ด ์๋ก dependency๊ฐ ์์ผ๋ฉด?
์ปจํ ์ด๋๋ค์ ๋์ฐ๋ค๋ณด๋ฉด, ์ด๋ค ์ปจํ ์ด๋๋ ๋ค๋ฅธ ์ปจํ ์ด๋๊ฐ ๋ ์์ด์ผ ์ ๋๋ก ๋์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
nginx โ webserver โ DB
- e.g. nginx๋ โ์น์๋ฒ์ ๋ณด๋ด์ฃผ์ธ์~โ, ์น์๋ฒ๋ โDB์ ์ฐ๊ฒฐํด์ฃผ์ธ์~โ
- ์ด๋ฐ ์์ผ๋ก ์ฝ๋๊ฐ ์ง์ฌ์ ธ์๋๊ฒ ์ผ๋ฐ์ ์ ๋๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ์๋ DB๋จผ์ ๋์ฐ๊ณ ์น์๋ฒ ๋์ฐ๊ณ ๊ทธ ๋ค์์ nginx ๋์ฐ๋ฉด ์ข ์์ ์ ์ด์ง ์๊ฒ ์ต๋๊น.
- ๊ทธ๋ฆฌ๊ณ ๊ทธ๋์ผ ์ ๋์๊ฐ ๊ฒ ๊ฐ์ต๋๋ค.
1# docker-compose.yml2services:3webserver:4image: nodeserver:15ports:6- 8080:808078nginx:9image: nginx:110ports:11- 80:8012depends_on:13- webserver
depends_on: ํ์ ํญ๋ชฉ์ผ๋ก ๋ค๋ฅธ ์๋น์ค ์ด๋ฆ์ ๊ธฐ์ฌํ ์ ์๋๋ฐ,
๊ทธ๋ฌ๋ฉด ์์ ์ฝ๋์์ โnginx๋ webserver์ ์์กดํ๋คโ๋ ๋ป์
๋๋ค.
๊ทธ๋ผ webserver ์ปจํ
์ด๋๊ฐ ๋จผ์ ์คํ๋ ๋ค์ nginx ์ปจํ
์ด๋๊ฐ ์คํ๋ฉ๋๋ค.
๊ทธ๋์ ์ปจํ
์ด๋ ์คํ ์์๋ฅผ ๊ฒฐ์ ํ๊ณ ์ถ์ผ๋ฉด depends_on:์ ์ฌ์ฉํด๋ด
์๋ค.
1.8 ์๋น์ค
docker compose์์ ์ปจํ
์ด๋๋ฅผ โ์๋น์คโ ์์ ์์ฑํ๋๋ฐ,
์๋น์ค๊ฐ ๋ญ๋๋ฉด ์ปจํ
์ด๋๋ฅผ ์ด๋ป๊ฒ ๋์ธ์ง ์ ์ํ๋ ์ผ์ข
์ ๊ฐ์ด๋๊ฐ์ ๊ฐ๋
์
๋๋ค.
1# docker-compose.yml2services:3webserver:4image: nodeserver:15ports:6- 8080:8080
์ด๋ฏธ์ง๊ฐ ์์ผ๋ฉด,
- ์ด๋ค ํฌํธ๋ฅผ ์ด์ง
- ์ด๋ค ํ๊ฒฝ๋ณ์๋ฅผ ๋ฃ์์ง
- ์ปจํ ์ด๋ ์ด๋ฆ์ ์ด๋ป๊ฒ ์ง์์ง
์ด๋ฐ๊ฑธ ๊ฒฐ์ ํด์ผ ์ด๋ฏธ์ง๋ฅผ ์ปจํ
์ด๋๋ก ์คํํ ์ ์์ง ์์ต๋๊น.
์ด๋ฐ ์ปจํ
์ด๋ ์คํ ๊ฐ์ด๋๋ฅผ docker compose์์ ์๋น์ค๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
์๋น์ค๋ผ๋ ๊ฐ๋
์ด ์ค์ํ๋ฐ,
์๋๋ฉด ์ฌ๋ฌ๋ถ์ด ๋์ค์ ์ปจํ
์ด๋ ์๋ฐฑ๊ฐ๋ฅผ ๋์ฐ๊ฒ ๋๋ฉด, ๊ทธ๊ฑธ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ์ ๋ฐ๋ก ์ฌ์ฉํฉ๋๋ค.
Docker swarm, Kubernetes, AWS ECS ์ด๋ฐ๊ฒ ์๋๋ฐ,
์ด๋ฐ๊ฑธ ์จ๋ ํญ์ ์๋น์ค์ ๋น์ทํ ๊ฑธ ์์ฑํ ๋ค์ ์ปจํ
์ด๋๋ค์ ๋์ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ์ ๊ธฐ์ตํด๋ก์๋ค.
์๋น์ค๋ฅผ ๋ง๋ค์ด๋๋ฉด ์ฅ์ ์ด ๋ญ๋๋ฉด,
- ์ปจํ ์ด๋ ์ค์ ์ ํ ๋์ ๋ณผ ์ ์๋ ๊ฒ๋ ์๋๋ฐ, ๋์ค์ ๊ฐ์ ์ปจํ ์ด๋ ์ฌ๋ฌ๊ฐ๊ฐ ํ์ํ ๋๋ ํธ๋ฆฌํด์ง๋๋ค.
- โ์๋น์ค์ ์จ์๋ ๋ด์ฉ๋๋ก ์ปจํ ์ด๋ ์ฌ๋ฌ๊ฐ ๋ณต์ฌํด์ ๋์์ฃผ์ธ์โ ์ด๋ฐ๊ฒ ๊ฐ๋ฅํด์ง๋๊น์.
1# docker-compose.yml2services:3webserver:4image: nodeserver:15ports:6- 8080:80807depends_on:8- db9deploy:10mode: replicated11replicas: 31213nginx:14image: nginx:115ports:16- 80:801718db:19image: postgres:17-alpine20environment: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: ์์ ์๋ ๋ชจ๋ ์ปจํ
์ด๋๋ค์ ์๋์ผ๋ก ๋คํธ์ํฌ ํ๋ ์์ ๋ด์์ค๋๋ค.
๊ทธ๋์ ๋คํธ์ํฌ ๋ฐ๋ก ์ค์ ํ๊ณ ๊ทธ๋ด ํ์๋ ์๋๋ฐ,
๊ฐํน ๋คํธ์ํฌ๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค์ด์ ์ปจํ
์ด๋๋ฅผ ์์ ํ๊ฒ ๋ฐฐ์นํ๊ณ ์ถ์ ๋๋ ์์ต๋๋ค.

e.g. nginx, ์น์๋ฒ, DB๊ฐ ์์ผ๋ฉด, nginx โโ ์น์๋ฒ๋ ์๋ก ํต์ ํด์ผํ๊ณ ,
์น์๋ฒ โโ DB๋ ์๋ก ํต์ ํด์ผํ๊ณ , ๊ทผ๋ฐ nginx โโ DB๋ ์๋ก ํต์ ํ ์ผ์ด ์๋ง ์์ต๋๋ค.
๊ทธ๋์ ๊ฐ๊ฐ ํต์ ์ด ํ์ํ ์ปจํ ์ด๋๋ผ๋ฆฌ ํ๋์ ๋คํธ์ํฌ์ ๋ณด๊ดํ๋ ๊ฒ๋ ์์ ํ๊ณ ์ข์ ์ ์์ต๋๋ค.
cf. ํ๋์ ์ปจํ ์ด๋๋ ์ฌ๋ฌ๊ฐ ๋คํธ์ํฌ์ ์ํ ์ ์์ต๋๋ค.
1services:2webserver:3image: nodeserver:14ports:5- 8080:80806networks:7- mynet18- mynet2910nginx:11image: nginx:112ports:13- 80:8014networks:15- mynet11617db:18image: postgres:17-alpine19environment:20- POSTGRES_USER=admin21- POSTGRES_PASSWORD=qwer123422networks:23- mynet22425networks:26mynet1:27mynet2:
๊ทธ๋์ ์ฌ์ง์ฒ๋ผ ๊ตฌํํด๋ดค์ต๋๋ค.
networks: ๋ผ๋ ์ต์์ ํญ๋ชฉ์ ํ๋ ๋ง๋ค์ด์ ์์ ๋คํธ์ํฌ ์ด๋ฆ์ ๋ฃ์ผ๋ฉด ๊ทธ ์ด๋ฆ์ผ๋ก ๋คํธ์ํฌ๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
1docker compose up
์ ์์์์ mynet1, mynet2 ๋คํธ์ํฌ๋ฅผ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ์๋น์ค๋ง๋ค networks: ๋ฃ์ด์ ๋คํธ์ํฌ์์ ๋ฃ์ ์ ์์ต๋๋ค.
1$ docker compose down23$ docker build ./nginx -t nginx:14$ docker run -d -p 8080:8080 --network mynet1 --name nodeserver-container nodeserver:156$ docker compose up -d
2.2 volume ์ฌ์ฉํ๊ธฐ
docker compose ํ์ผ ์ฌ์ฉํ ๋๋ ๋ณผ๋ฅจ ์ฅ์ฐฉํ๋ผ๊ณ ๋ช
๋ น๊ฐ๋ฅํฉ๋๋ค.
1services:2db:3image: postgres:17-alpine4environment:5- POSTGRES_USER=admin6- POSTGRES_PASSWORD=qwer12347volumes:8- ๋ณผ๋ฅจ์ด๋ฆ:/var/lib/postgresql/data910volumes:11๋ณผ๋ฅจ์ด๋ฆ:12external: true
volume: ์ฐ๊ณ ๊ทธ ์์ ๋ณผ๋ฅจ์ฅ์ฐฉํ๋ ๋ช
๋ น์ด ์
๋ ฅํ๋ฉด ๋๊ฒ ์ต๋๋ค.
ํ์ง๋ง ๊ทธ๋ฅ ์ฐ๋ฉด docker compose ์คํ์ ์ง์ ๋ณผ๋ฅจ์ ์๋ก ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์,
๊ทธ๊ฒ ์ซ๊ณ ๊ธฐ์กด์ ์๋ ๋ณผ๋ฅจ์ ์ธ๋ ค๋ฉด ์ต์๋จ์ volumes: ๋ฃ๊ณ , ๊ธฐ์กด ๋ณผ๋ฅจ์ด๋ฆ๊ณผ external: true๋ฅผ ๋ฃ์ด์ค์ผํฉ๋๋ค.
๐ก cf.
bind mount์์ผ๋ก ๋ณผ๋ฅจ์ ์ฐ๋ ค๋ฉด, ๋ณผ๋ฅจ์ด๋ฆ ๋์ ์ฌ๋ฌ๋ถ๋ค ํด๋๊ฒฝ๋ก๋ฅผ ์ ์ด์ฃผ๋ฉด ๋๊ฒ ์ต๋๋ค.1services:2db:3image: postgres:17-alpine4environment:5- POSTGRES_USER=admin6- POSTGRES_PASSWORD=qwer12347# ๋ด๊ฐ ๋ง๋ ํด๋๋ฅผ volume์ผ๋ก ์ฐ๋ ค๋ฉด bind mount8volumes:9# ./vol:/var/lib/postgresql/data10- ํด๋์ด๋ฆ:/var/lib/postgresql/data
- e.g.
docker composeํ์ผ๊ณผ ๊ฐ์ ๊ฒฝ๋ก์volํด๋๋ฅผ ๋ณผ๋ฅจ์ผ๋ก ์ฐ๋ ค๋ฉด,- ๋ณผ๋ฅจ์ด๋ฆ๋์
./vol์ด๋ ๊ฒ ์ ๋๊ฒ ์ด๋จ๊น์.
2.3 ๊ธฐํ ๋ช ๋ น์ด๋ค
๊ฐ๋๊ฐ๋ค๊ฐ ํ๋ก๊ทธ๋จ์ด ํผ์ ์ข ๋ฃ๋๋ ์ํฉ๋ค์ด ์์ต๋๋ค. ์น์๋ฒ์ ๊ฒฝ์ฐ์ ์ ์ ๊ฐ ๋๋ฌด ๋ง๊ฑฐ๋ ์ด์ํ ์ฝ๋๊ฐ ์๊ฑฐ๋ ๊ทธ๋ฌ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ์ ์์ต๋๋ค.
๊ทธ๋ด ๋ ์ด๋ป๊ฒ ํ๊ฒ์? ๊บผ์ง๋ฉด ์๋์ผ๋ก ๋ค์ ์คํํ๋ผ๊ณ ์ฝ๋๋ฅผ ์ง๋๊ฑฐ๋ ๊ทธ๋ด ์ ์์ต๋๋ค.
nodejs๊ฐ์ ๊ฒฝ์ฐ์pm2๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๋ฉด ๋ค์ด๋๊ฑฐ๋ ๊ทธ๋ด ๋ ๊ทธ๋ฅ ์์์ ๋ค์ ์์ํด์ฃผ๊ณ ๊ทธ๋ ์ต๋๋ค.nginx๊ฐ์ ๊ฒฝ์ฐ์ ๋ฆฌ๋ ์ค์systemctl๊ฐ์ ํ๋ก๊ทธ๋จ ์ฐ๋ฉด ๋ ๊ฐ๋จํ๊ณ ํธํ ์ ์์ต๋๋ค.
ํ์ง๋ง docker๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ ์์์ ์ฌ์์ํด์ฃผ๋ ๊ฐํธํ ์ต์ ์ด ์์ต๋๋ค.
1services:2webserver:3image: nodeserver:145nginx:6image: nginx:17ports:8- 80:809restart: always # ๋ค์ ์ฌ์์1011db:12image: postgres:17-alpine13environment:14- POSTGRES_USER=${POSTGRES_USER}15- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}16
restart: always ์ด๋ฐ๊ฑฐ ๋ฃ์ด๋๋ฉด ์ปจํ
์ด๋๊ฐ ๊บผ์ ธ๋ ์์์ ์ฌ์์๋ฉ๋๋ค.
- ์ฌ์ง์ด docker ์์ง ์์ฒด๊ฐ ๊ป๋ค ์ผ์ ธ๋ ์์์ ์๋น์ค๊ฐ ์๋์ผ๋ก ์์๋ฉ๋๋ค.
- ๊ทธ๋์ ํญ์ ์ฌ์์๋์ด์ผํ๋ ํ๋ก๊ทธ๋จ์ด ์์ผ๋ฉด ์ด๊ฑฐ ์ ์ด๋ก์๋ค.
- cf.
docker compose์์ธ๊ฑฐ๋ฉด,docker run -d --restart always์ด๋ฐ ์์ผ๋ก ์ต์ ์ ์ง์ด๋ฃ์ต๋๋ค.
1docker compose up -d
์๋ง๊ฐ ๋จ์ ๋ง ๋ฏฟ์ง ๋ง๋ฌ์ผ๋ ์ง์ง์ธ์ง ํ์ธํ๋ ค๋ฉด docker desktop ๊ป๋ค ์ผ๋ณด์
๋ ๋๊ณ ,
์๋๋ฉด ์ปจํ
์ด๋๋ฅผ ์ค๋ฅ๋ฐ์์์ผ์ ๋๊ณ ์ถ์ผ๋ฉด nginx๊ฐ์๊ฑฐ์ docker exec์ผ๋ก ์ ์ํด์ kill ๋ช
๋ นํ๋ฒ ์ค๋ณด๋ฉด ๋ฉ๋๋ค.

โฒ ํฐ๋ฏธ๋์ ps ์ ๋ ฅํ๋ฉด ํ์ฌ ์คํ์ค์ธ ํ๋ก์ธ์ค๋ค์ ๋ณผ ์ ์๋๋ฐ, ์๋ณด๋ฉด 1๋ฒ ํ๋ก์ธ์ค๋ก nginx ๋ช ๋ น์ด๊ฐ ์คํ์ค์ ๋๋ค. ์ด๊ฑธ ๊ฐ์ ์ข ๋ฃ ํด๋ฒ๋ฆฌ๊ณ ์ถ์ผ๋ฉด ํฐ๋ฏธ๋์ kill 1 ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค. ๊ทผ๋ฐ restart always๋ฅผ ์ ์ด๋จ๊ธฐ ๋๋ฌธ์ ์ข ๋ฃ๋์ด๋ ์๊ฐ ์์์ ์ฌ์์๋๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค. (์ฌ์์ ๋์๋์ง ๋ชจ๋ฅด๊ฒ ์ผ๋ฉด ์ปจํ ์ด๋์ Inspect ๋ฉ๋ด์์ restart ์ด์ฉ๊ตฌ ๊ฒ์ํด๋ด ์๋ค.)
๐ก cf. ์ฌ๋ฌ๋ถ๋ค์ด docker ๋ช ๋ น์ด๋ ์ด๋ฐ๊ฑธ๋ก ์ปจํ ์ด๋๋ฅผ ์ง์ ์ ์ง์์ผฐ์ ๋๋ restart๋ฅผ ๋ญ๋ก ํด๋จ๋ ๊ฐ์ ์๋ ์ฌ์์์ ์๋ฉ๋๋ค.
1services:2webserver:3image: nodeserver:145nginx:6image: nginx:17ports:8- 80:809restart: unless-stopped1011db:12image: postgres:17-alpine13environment:14- POSTGRES_USER=${POSTGRES_USER}15- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
restart: unless-stopped ์ด๋ฐ ๋ช
๋ น๋ ๋น์ทํ๋ฐ, ์๋ docker ์ฌ์์ํด๋ ์๋์ผ๋ก ์์์ ์๋ฉ๋๋ค.
์ค์ ๋น์ทํด์ ๊ทธ๋ฅ ์ด๊ฑฐ ์ฐ๋๋ก ํฉ์๋ค.
restart- ์ปจํ ์ด๋ ๊บผ์ ธ๋ ์๋ ์ฌ์์
- Docker ์์ง ๊ป๋ค์ผ๋ ์๋ ์์
unless-stopped- ์ปจํ ์ด๋ ๊บผ์ ธ๋ ์๋ ์ฌ์์
3. ์ค์๊ฐ ๊ฐ๋ฐ, graceful shutdown
๊ฐ๋ ๊ฐ๋ฐํ ๋ ์ปจํ ์ด๋๋ก ๋์๋ณด๋ฉด์ ๊ฐ๋ฐํด๋ณด๋ ๊ฒฝ์ฐ๋ค์ด ์์ต๋๋ค.
- ํ์๋ผ๋ฆฌ ๊ฐ๋ฐํ๊ฒฝ ์์ ๋๊ฐ์ด ๋ง์ถ ๋
- ๋ฐฐํฌ์ ์ ํ ์คํธํ๋ ค๊ณ
- ๊ทธ๋ฅ ํธํด์
์ด๋ฐ ์ด์ ๋ก ์ปจํ ์ด๋๋ก ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋์์ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ๋ค์ด ์์ต๋๋ค.
ํ์ง๋ง ์ด๋ฌ๋ฉด ๊ท์ฐฎ์ ์ ์ด ์๋๋ฐ, e.g. ์๋ฒ์์ โ์๋ โ์ด๋ผ๋ ๋ฉ์ธ์ง๋ฅผ โ์๋ 123โ ์ด๋ฐ ์์ผ๋ก ๋ฐ๊ฟจ์ต๋๋ค. ์ด ๋ณ๋์ฌํญ์ด ์ปจํ ์ด๋์์๋ ์ ๋์๊ฐ๋์ง ํ์ธํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ๊ฒ์?
docker compose downํ๊ณ- ์น์๋ฒ ์ด๋ฏธ์ง ๋ค์ ๋ง๋ค๊ณ
docker compose upํด์ผํฉ๋๋ค.
์ด๋ฌ๋ฉด ๊ท์ฐฎ์์ ๋์ปค ์ญ์ ํ๊ณ ์ถ์ด์งํ ๋ฐ ๋น์ฐํ ๊ฐ์ ๋ฐฉ๋ฒ์ด ๋ช๊ฐ ์์ต๋๋ค.
3.1 ๋น๋ ์๋ํ
๊ฐ์ฅ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ docker compose ํ์ผ์ โํญ์ docker build ํ๊ณ ๋์ ์ปจํ ์ด๋ ๋์ฐ์ธ์โ ์ด๋ ๊ฒ ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
1services:2webserver:3image: nodeserver:14build: . # ์ํ๋ Dockerfile ๊ฒฝ๋ก5ports:6- 8080:808078nginx:9image: nginx:110ports:11- 80:80
build: ๋์ปคํ์ผ๊ฒฝ๋ก์
๋ ฅํ๋ฉด ๋๋๋ฐ, ๊ทธ๋ผ ์ด์ docker compose upํ ๋๋ง๋ค,
ํด๋น ๊ฒฝ๋ก์ ์๋ ๋์ปคํ์ผ์ ๊ฐ์ ธ๋ค๊ฐ ์๋์ผ๋ก docker build ๋ช
๋ น์ ์ํํด์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ณ ,
๊ทธ ์ด๋ฏธ์ง๋ก ์ปจํ
์ด๋๋ฅผ ๋์์ค๋๋ค.
ํ์ง๋ง docker compose up ๋ง๊ณ , docker compose up --build ์ด๋ฐ ๋ช
๋ น์ด๋ฅผ ์จ์ผ
์๋์ผ๋ก docker build ๋ช
๋ น์ ์ํํด์ค๋๋ค.
๊ทธ๋ผ ์๊น์ ๋ค๋ฅด๊ฒ
docker compose downdocker compose up --build
์ ๋ ฅํ๋ฉด ๋๋๊น ๋ช ๋ น์ด๊ฐ 1๊ฐ ์ค์ด๋ค์ด์ ํธ๋ฆฌํด์ก๊ตฐ์.
3.2 graceful shutdown ๊ธฐ๋ฅ
์ปจํ ์ด๋ ๋๊ณ ์ฌ์์ํ๊ณ ๊ทธ๋ฐ๊ฒ ๋๋ฌด ๋๋ฆฐ๊ฒฝ์ฐ๋ค์ด ์์ต๋๋ค. ํนํ ์น์๋ฒํ๋ ๋๋๋ฐ 10์ด๋๊ฒ ๊ฑธ๋ฆฐ๋ค๋ฉด ๊ทธ ์ด์ ๋ ์๋ฒ ๊บผ์ฃผ๋ ์ฝ๋๋ฅผ ์์ง์ ๊ทธ๋ฐ ๊ฒ์ผ ๋ฟ์ ๋๋ค.

โฒ ์๋ docker ์์ง์ด ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃ์ํฌ ๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋๋ฉด, โ์ข์๋งํ ๋ ์์์ ๋๋ผโ ์ด๋ฐ ์์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ์ปจํ ์ด๋์ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ณด๋ ๋๋ค. ๊ทธ๋์ ํ๋ก๊ทธ๋จ์ ๊ทธ ๊ฒฝ๊ณ ์ฑ ๋ฉ์ธ์ง๋ฅผ ์์ ํ๋ฉด ์์์ ์ข ๋ฃํ๋ผ๊ณ ์ฝ๋์ง๋์ผ๋ฉด ๋ฉ๋๋ค. ๊ทผ๋ฐ ์ข ๋ฃํ๋ ์ฝ๋๊ฐ ์๊ฑฐ๋ ๊ทธ๋ฌ๋ฉด 10์ด ์ ๋ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๊ฐ์ ๋ก ๊บผ์ง๋๋ค. ๊ทธ๋์ ์ข ๋ฃํ๋ ์ฝ๋๋ฅผ ์ข ์์ฑํด๋ณด๋๋ก ํฉ์๋ค.
1const express = require('express')2const app = express()34const server = app.listen(8080, () => {5console.log('์๋ฒ ์คํ์ค http://localhost:8080')6})78app.get('/', (req, res) => {9res.send('์๋ ')10})1112process.on('SIGTERM', () => {13server.close(() => {14console.log('HTTP server closed')15})16})1718process.on('SIGINT', () => {19server.close(() => {20console.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 ๊ธฐ๋ฅ์ ํ ํด๋๋ฉด, - ํน์ ํ์ผ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๊ฐ ๋ฐ๋ก๋ฐ๋ก ์ปจํ ์ด๋์ ๋ณต์ฌ๋ฅผ ํด์ฃผ๊ธฐ ๋๋ฌธ์,
- ๊ทธ๋์ ์ด๊ฑฐ ์ฐ๋ฉด ๋งค๋ฒ ๋น๋ ๊ทธ๋ด๊ฑฐ ํ ํ์๊ฐ ์์ด์ ๋งค์ฐ ํธ๋ฆฌํด์ง๋๋ค. ๋๋ฆ ์ต์ ๊ธฐ๋ฅ์
1services:2webserver:3image: nodeserver:14build: .5develop:6watch:7- action: sync8path: .9target: /app10ignore:11- node_modules/1213nginx:14image: nginx:115ports:16- 80:80
์ฐ์ ์ด๋ฐ ์์ผ๋ก ์์ฑํด๋ก์๋ค. ์ค์๊ฐ ๋ฐ์์ํ๋ ์ปจํ
์ด๋์ develop: ๋ฃ๊ณ , watch: ๋ฃ๊ณ ์์ํ๋ฉด ๋ฉ๋๋ค.
action: sync๋ ๋ด ์ปดํจํฐ์ ์๋ ํ์ผ ๋ณ๊ฒฝ์ฌํญ์ ์ปจํ ์ด๋๋ก ๋ณต์ฌํด์ฃผ๋ผ๋ ๋ป์ ๋๋ค.- ๋ณต๋ถ๋ง๊ณ ๋น๋, ์ปจํ ์ด๋ ์ฌ์์ ๋ฑ ๋ค๋ฅธ ํ์๋ ํ ์ ์๋๋ฐ ๊ทธ๊ฑด ๋์ค์ ํ์ธํด๋ด ์๋ค.
path:์๋ ๋ด ์ปดํจํฐ์ ์ด๋ค ํ์ผ๋ค ๊ฐ์ํ ๊ฑด์ง ๊ฒฝ๋ก ์ ์ผ๋ฉด ๋ฉ๋๋ค.target:์๋ ์ปจํ ์ด๋ ์ด๋์ ๋ณ๋์ฌํญ์ ๋ณต์ฌํ ๊ฑด์ง ๊ฒฝ๋ก ์ ์ผ๋ฉด ๋ฉ๋๋ค.ignore:์์๋ ๋ณ๋์ฌํญ์ ๋ณต์ฌํ ํ์๊ฐ ์๋ ํ์ผ์ด๋ ํด๋๋ค ๊ธฐ๋กํด๋๋ฉด ๋๋๋ฐ,.dockerignoreํ์ผ ์ฐ๊ณ ์์ผ๋ฉด ๋ฐ๋ก ์ ์ ํ์๋ ์์ต๋๋ค.
๊ทธ๋์ ์์ฒ๋ผ ์ ์ผ๋ฉด ํ์ฌ ํด๋์ ์๋ ํ์ผ๋ค์ด ๋ณ๋์ฌํญ์ด ์๊ฒผ์ ๋ app ํด๋ ์์ ๊ทธ๋๋ก ๋ณ๋์ฌํญ์ด ๋ณต์ฌ๋ฉ๋๋ค.
๐ก cf. build: ์ต์ ์ด ๋ค์ด์์ด์ผ ์๋ฉ๋๋ค.
3.4 ์ง์ง ์ง ํ ์คํธ
ํ
์คํธํด๋ณด๋ ค๋ฉด docker compose down ํ๋ค๊ฐ ๋ค์ up ํ๋ฉด ๋ ํ
๋ฐ,
์ค์ docker compose up --watch๋ผ๊ณ ๋ช
๋ น์ ์ค์ผ watch ๊ธฐ๋ฅ์ด ๋์ํฉ๋๋ค.
์ด๋ ๊ฒ ํด๋๋ฉด ์ด์ ์ฝ๋ ๋ณ๊ฒฝํ ๋๋ง๋ค ๋น๋ํ๊ณ ์ง๋ํ ํ์๊ฐ ์์ด์ง๋๊ตฐ์.

โฒ ์ง์ง ๊ทธ๋ฐ์ง ์ฝ๋ ์์ ํ๊ณ ์ ์ฅํด๋ดค๋๋ฐ, ๊ทธ๋ฌ๋ฉด docker desktop ๋ค์ด๊ฐ์ ์ปจํ
์ด๋ ๋ค์ด๊ฐ์ ํ์ผ ๊ฒ์ฌํด๋ณด๋ฉด,
์์ค์ฝ๋๊ฐ ์ง์ง๋ก ์ปจํ
์ด๋์ ์ค์๊ฐ์ผ๋ก ๋ณต์ฌ๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
๊ทผ๋ฐ ๋ธ๋ผ์ฐ์ ์ด์ด์ ์๋ฒ์ ์ ์ํด๋ณด๋ฉด.. ์ ๋ฐ์ดํธ๊ฐ ์๋๊ณ ์๋๋ฐ์? ์ ๊ทธ๋ฌ๋๋ฉด ์๋ ๋ก์ปฌ์์ ๊ฐ๋ฐํ ๋๋ ์ฝ๋ ์์ ํ์ผ๋ฉด ์๋ฒ๋ฅผ ์ฌ์์ํด์ค์ผ ๋ฐ์์ด ๋ฉ๋๋ค. ๊ทธ๋์ ๊ทธ๋ด ๋ฟ์ด๋ผ ์๋ฒ๋ ์ฌ์์ํ๋ผ๊ณ ์ค์ ์ ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค.
1services:2webserver:3image: nodeserver:14build: .5develop:6watch:7- action: sync+restart # ์ฝ๋ ๋ณต๋ถ + ์ปจํ ์ด๋ ์ฌ์์8path: .9target: /app10ignore:11- node_modules/1213nginx:14image: nginx:115ports:16- 80:80
action: sync+restart์ด๋ฐ ์ต์ ์ ๋ฃ์ผ๋ฉด โsyncํ ํ์ ์ปจํ ์ด๋ ์ฌ์์ํ๋ผโ๋ ๋ป์ ๋๋ค.- ์ง์ง ์ฌ์์๊น์ง ์ ๋๋ ํ ์คํธํด๋ด ์๋ค.
1docker build . -t nodeserver:12docker 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 ๋ช ๋ น์ด๋ฅผ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
1services:2webserver:3build: .4ports:5- 8080:808067command: ["nodemon", "server.js"]8develop:9# ์๋ต
command: ์ด๋ฐ๊ฑธ ์๋น์ค๋ง๋ค ๋ฃ์ ์ ์๋๋ฐ,
๊ทธ๋ฌ๋ฉด ๊ทธ ์๋น์ค๋ฅผ ๋์ธ ๋ dockerfile์ ์๋ CMD ์์ ์๋ ๋ช
๋ น์ด๋ฅผ ๋ฎ์ด์ฐ๊ธฐํ ์ ์์ต๋๋ค.
๊ทธ๋์ docker compose ์คํ์ ๋งค๋ฒ ๋ค๋ฅธ ๋ช
๋ น์ด ๋ฃ์ ์ ์์ผ๋๊น ํ์ํ ๋ ์ฌ์ฉํฉ์๋ค.
3.6 action: rebuild
1services:2webserver:3image: nodeserver:14build: .5develop:6watch:7- action: sync+restart8path: .9target: /app10ignore:11- node_modules/12- action: rebuild # path ํ์ผ๋ค ๋ณ๊ฒฝ์ ์๋์ผ๋ก docker build13path: package.json1415nginx:16image: nginx:117ports:18- 80:80
action: rebuild ์ง์ด๋ฃ์ผ๋ฉด,
โpath์ ์๋ ํ์ผ์ด๋ ํด๋๊ฐ ๋ณ๋์ฌํญ์ด ์๊ธฐ๋ฉด ๊ทธ๋ฅ ์์ docker build๋ฅผ ๋ค์ ํด๋ฌ๋ผโ๋ ๋ป์
๋๋ค.
์ด๋ฏธ์ง ๋ค์ ๋ง๋ค๋ผ๋ ๋ป์.
๊ทธ๋์ Node.js ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ์๊ฑฐ ์ค์นํ๋๊ฑฐ ๋ณ๋์ฌํญ์ด ์๊ธฐ๋ฉด,
- ์ด๋ฏธ์ง๋ฅผ ๋ค์๋ง๋๋๊ฒ ๊น๋ํ๊ธฐ ๋๋ฌธ์
package.jsonํ์ผ ๋ณ๊ฒฝ๋๋ฉด,- rebuildํ๋ผ๊ณ ์ฝ๋์ง๋๋ ๊ฒฝ์ฐ๋ค์ด ์์ต๋๋ค.
- ์ฝ๋์์ ํ๊ณ ๋์ ํญ์ ์ปดํ์ผ์ด ํ์ํ ํ๋ก์ ํธ๋ค๋ ์ด๊ฑธ sync๊ฐ ์๋๋ผ rebuild๋ก ์ ๋ ๊ฒฝ์ฐ๋ค์ด ์์ต๋๋ค.
action:์ ์ฌ๋ฌ๊ฐ ์ง์ด๋ฃ์ ์ ์์ผ๋ ํ์ํ๋ฉด ์ฌ์ฉํฉ์๋ค.
๐ก ๊ฒฐ๋ก
- ๋ด ์ฝ๋๋ฅผ ์ปจํ ์ด๋๋ก ๋์๋ณด๋ฉด์ ์ค์๊ฐ ์ฝ๋ฉํ๊ณ ์ถ์ผ๋ฉด
docker compose์ watch ๊ธฐ๋ฅ์ ๊บผ๋ด์์๋ค.- ์ปจํ ์ด๋ ๊ป๋ค๊ฐ ์ผค ์ผ์ด ๋ง๋ค๋ฉด
graceful shutdown์ํด๋จ๋ ํ์ธํฉ์๋ค.