Docker Compose๋ ์ฌ๋ฌ ๊ฐ์ Docker ์ปจํ
์ด๋๋ฅผ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์
์ฒ๋ผ ์ฝ๊ฒ ์ ์ํ๊ณ , ์คํํ๊ณ , ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ์
๋๋ค.
ํ ๋ง๋๋ก ์์ฝํ๋ฉด โ โ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ yaml ํ์ผ ํ ์ฅ์ผ๋ก ๋ฌถ์ด์ ํ ๋ฒ์ ๋์ฐ๊ณ ๋ด๋ฆฌ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒโ
ํ ๋ง๋๋ก ์์ฝํ๋ฉด โ โ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ yaml ํ์ผ ํ ์ฅ์ผ๋ก ๋ฌถ์ด์ ํ ๋ฒ์ ๋์ฐ๊ณ ๋ด๋ฆฌ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒโ
์ Docker Compose๋ฅผ ์ฐ๋์? (์ฃผ์ ์ฅ์ )
- 3๊ฐ ์ด์๋ถํฐ ๋งค์ฐ ํธํจ
- yaml ํ์ผ์ ํ ๋ฒ๋ง ์์ฑ
- ์๋์ผ๋ก ๊ฐ์ ๋คํธ์ํฌ ์์ฑ & ์๋น์ค ์ด๋ฆ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ
- depends_on์ผ๋ก ์์ ๋ณด์ฅ
- docker-compose.yml ํ๋๋ก ๋์ผ ํ๊ฒฝ ๋ณด์ฅ
- docker compose down ํ ๋ฐฉ์ ์ ๋ฆฌ
๊ธฐ๋ณธ ์ฌ์ฉ ํ๋ฆ (๊ฐ์ฅ ํํ ํจํด)
- ํ๋ก์ ํธ ๋ฃจํธ์ docker-compose.yml ํ์ผ ๋ง๋ค๊ธฐ
- ์๋น์ค๋ค ์ ์ํ๊ธฐ
- ๋ช ๋ น์ด๋ก ์คํ
๊ฐ์ฅ ๋ง์ด ์ฐ๋ ๋ช ๋ น์ด Top 5
docker compose up -d # ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ docker compose down # ๋ชจ๋ ์ปจํ ์ด๋ + ๋คํธ์ํฌ + ๋ณผ๋ฅจ(์กฐ๊ฑด) ์ ๋ฆฌ docker compose logs -f # ์ค์๊ฐ ๋ก๊ทธ ๋ณด๊ธฐ docker compose ps # ํ์ฌ ์ํ ํ์ธ docker compose exec ์น bash # ํน์ ์ปจํ ์ด๋ ์์ผ๋ก ๋ค์ด๊ฐ๊ธฐ
๊ธฐ๋ณธ ์ฌ์ฉ ํ๋ฆ (๊ฐ์ฅ ํํ ํจํด)
# compose.yaml (์ต์ ํ๋ก์ ํธ๋ค์ compose.yaml ๋ผ๊ณ ์ฐ๋ ์ถ์ธ)
services:
web: # ์๋น์ค ์ด๋ฆ (๋ด๋ถ DNS๋ก ์ฌ์ฉ๋จ)
image: nginx:alpine
ports:
- "8080:80" # ํธ์คํธ:์ปจํ
์ด๋
volumes:
- ./html:/usr/share/nginx/html:ro
depends_on:
- api
api:
build: ./backend # ํ์ฌ ํด๋์ Dockerfile๋ก ๋น๋
environment:
- DB_HOST=db
- DB_USER=app
depends_on:
db:
condition: service_healthy # ๊ฑด๊ฐํ ๋๊น์ง ๊ธฐ๋ค๋ฆผ (v2.20+)
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpw
MYSQL_DATABASE: myapp
volumes:
- mysql-data:/var/lib/mysql
healthcheck: # depends_on condition๊ณผ ํจ๊ป ์์ฃผ ์ฌ์ฉ
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 3s
retries: 5
volumes:
mysql-data: # ๋ช
๋ช
๋ ๋ณผ๋ฅจ (docker volume ls๋ก ํ์ธ ๊ฐ๋ฅ)
postgres:
image: docker.io/library/postgres:15-alpine
container_name: postgres
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
ports:
- "25432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: docker.io/library/redis:7-alpine
container_name: redis
restart: always
ports:
- "6379:6379"
volumes:
- redis_data:/data์์ฃผ ์ฐ์ด๋ ์ฃผ์ ํค์๋ ํ๋์ ์ ๋ฆฌ
ํค | ์๋ฏธ | ์์ |
|---|---|---|
| image | ์ฌ์ฉํ ์ด๋ฏธ์ง | nginx:latest |
| build | ์ง์ ๋น๋ํ ๊ฒฝ๋ก | . ๋๋ ./frontend |
| ports | ํฌํธ ๋งคํ | "3000:3000" |
| key | 0.75rem | 12px |
| volumes | ๋ฐ์ดํฐ/์ฝ๋ ๋ง์ดํธ | ./app:/app |
| environment | ํ๊ฒฝ๋ณ์ | - DEBUG=true - API_PORT=${API_PORT} - POSTGRESQL_USERNAME=${POSTGRESQL_USERNAME} - POSTGRESQL_PASSWORD=${POSTGRESQL_PASSWORD} - POSTGRESQL_DB=${POSTGRESQL_DB} |
| env_file | .env ํ์ผ ์ฝ๊ธฐ | .env |
| depends_on | depends_on | - db |
| networks | ์ปค์คํ ๋คํธ์ํฌ ์ฌ์ฉ | backend-net |
| restart | ์๋ ์ฌ์์ ์ ์ฑ | unless-stopped |
| healthcheck | ์ปจํ ์ด๋ ๊ฑด๊ฐ ์ฒดํฌ | CMD curl -f http://localhost |
docker compose ์ฌ์คํ
up docker-compose --env-file .env.local -f docker-compose.yml up down docker-compose --env-file .env.local -f docker-compose.yml down volume (db ํฌํจ) ๋ ๋ค ์ ๊ฑฐ docker-compose --env-file .env.local -f docker-compose.yml down -v