Docker Compose์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. Docker Compose๋ ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ด์ํ ์ ์๊ฒ ๋์์ฃผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๋จ์ผ ํ์ผ(docker-compose.yaml)์ ํตํด ์ด๋ฏธ์ง ๋น๋, ์ปจํ ์ด๋ ์คํ, ๋ณผ๋ฅจ ๋ฐ ๋คํธ์ํฌ ์์ฑ ๋ฑ์ ๊ฐํธํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ Docker Compose์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ์ค์ต ์์ ๊น์ง ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
Docker Compose๋?
Docker Compose๋ ๋ค์ค ์ปจํ ์ด๋ Docker ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ณ ์คํํ ์ ์๋ ๋๊ตฌ์ ๋๋ค. YAML ํ์์ ํ์ผ(docker-compose.yaml)์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋น์ค, ๋คํธ์ํฌ, ๋ณผ๋ฅจ ๋ฑ์ ์ ์ธ์ ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ๋จ์ํํ๊ณ , ์ผ๊ด๋ ํ๊ฒฝ์ ์ ์งํ ์ ์์ต๋๋ค.
์ฃผ์ ํน์ง
- ๊ฐํธํ ์ค์ : YAML ํ์ผ์ ํตํด ์ฌ๋ฌ ์ปจํ ์ด๋์ ์ค์ ์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ์ผ๊ด ๊ด๋ฆฌ: ๋จ์ผ ๋ช ๋ น์ด๋ก ๋ชจ๋ ์ปจํ ์ด๋๋ฅผ ๋น๋, ์์, ์ค์ง, ์ญ์ ํ ์ ์์ต๋๋ค.
- ํ๊ฒฝ ์ผ๊ด์ฑ: ๊ฐ๋ฐ, ํ ์คํธ, ํ๋ก๋์ ํ๊ฒฝ์์ ๋์ผํ ์ค์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์์กด์ฑ ๊ด๋ฆฌ: ์๋น์ค ๊ฐ์ ์์กด์ฑ์ ์ ์ํ์ฌ ์ฌ๋ฐ๋ฅธ ์์๋ก ์ปจํ ์ด๋๋ฅผ ์์ํ ์ ์์ต๋๋ค.
Docker Compose์ ์ฃผ์ ๊ธฐ๋ฅ
- ์ด๋ฏธ์ง ๋น๋: docker-compose.yaml ํ์ผ ๋ด์์ ๋น๋ํ ์ด๋ฏธ์ง๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
- ์ปจํ ์ด๋ ์คํ: ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ๋์์ ์คํํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ณผ๋ฅจ ๋ฐ ๋คํธ์ํฌ ๊ด๋ฆฌ: ํ์ํ ๋ณผ๋ฅจ๊ณผ ๋คํธ์ํฌ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
- ์๋น์ค ๊ฐ ์์กด์ฑ: ์๋น์ค ๊ฐ์ ์์กด์ฑ์ ์ ์ํ์ฌ ์ฌ๋ฐ๋ฅธ ์์๋ก ์คํํ ์ ์์ต๋๋ค.
- ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ: ํ๊ฒฝ ๋ณ์๋ฅผ ํ์ผ์ด๋ ์ธ๋ถ ์์ค์์ ๋ก๋ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Docker Compose ์ค์นํ๊ธฐ
Docker Compose๋ Docker Desktop์ ํฌํจ๋์ด ์์ด ๋ณ๋์ ์ค์น๊ฐ ํ์ ์์ต๋๋ค. ๋ค๋ง, Linux ํ๊ฒฝ์์๋ ๋ณ๋๋ก ์ค์นํด์ผ ํ ์๋ ์์ต๋๋ค. ์ค์น ๋ฐฉ๋ฒ์ ์๋์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ค์น ํ์ธ
docker compose version
์์ ์ถ๋ ฅ
Docker Compose version v2.20.3
Docker Compose ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
Docker Compose๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ docker-compose.yaml ํ์ผ์ ์์ฑํด์ผ ํฉ๋๋ค.
์ด ํ์ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์๋น์ค๋ฅผ ์ ์ํ๊ณ , Docker Compose ๋ช ๋ น์ด๋ฅผ ํตํด ์ด๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
Compose ํ์ผ ๊ตฌ์กฐ
Compose ํ์ผ์ YAML ํ์์ผ๋ก ์์ฑ๋๋ฉฐ, ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
version: '3.8' # Compose ํ์ผ ๋ฒ์
services: # ์๋น์ค ์ ์
service_name: # ์๋น์ค ์ด๋ฆ
image: image_name # ์ฌ์ฉํ Docker ์ด๋ฏธ์ง
build: # ์ด๋ฏธ์ง ๋น๋ ์ค์ (์ ํ ์ฌํญ)
context: ./path # ๋น๋ ์ปจํ
์คํธ
dockerfile: Dockerfile # ์ฌ์ฉํ Dockerfile
args: # ๋น๋ ์ธ์
- ARG_NAME=value
container_name: container_name # ์ปจํ
์ด๋ ์ด๋ฆ (์ ํ ์ฌํญ)
environment: # ํ๊ฒฝ ๋ณ์ ์ค์
- VAR_NAME=value
ports: # ํฌํธ ๋งคํ
- "host_port:container_port"
volumes: # ๋ณผ๋ฅจ ๋ง์ดํธ
- volume_name:/container/path
networks: # ๋คํธ์ํฌ ์ฐ๊ฒฐ
- network_name
depends_on: # ์๋น์ค ์์กด์ฑ
- other_service
networks: # ๋คํธ์ํฌ ์ ์
network_name:
driver: bridge
volumes: # ๋ณผ๋ฅจ ์ ์
volume_name:
driver: local
์ปจํ ์ด๋ ๋น๋ ๋ฐ ์คํ
Compose ํ์ผ์ ์์ฑํ ํ, ๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด ๋ชจ๋ ์๋น์ค๋ฅผ ๋น๋ํ๊ณ ์คํํ ์ ์์ต๋๋ค.
docker compose up
๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ค๋ฉด -d ์ต์ ์ ์ฌ์ฉํฉ๋๋ค.
docker compose up -d
์ปจํ ์ด๋ ๊ด๋ฆฌ
Docker Compose๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ฃผ์ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์คํ ๋ฐ ๋น๋: docker compose up --build
- ์ค์ง ๋ฐ ์ญ์ : docker compose down
- ๋ก๊ทธ ํ์ธ: docker compose logs -f
- ํน์ ์๋น์ค ์คํ: docker compose up -d service_name
Example) MySQL๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ฐ๋ํ๊ธฐ
Docker Compose๋ฅผ ์ฌ์ฉํ์ฌ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฐ๋ํ๋ ์์ ๋ฅผ ์ค์ตํด๋ณด๊ฒ ์ต๋๋ค.
ํ๋ก์ ํธ ์ค๋น
๋จผ์ , ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ํ์ํ ํ์ผ์ ์ค๋นํฉ๋๋ค.
mkdir mbti-docker-compose
cd mbti-docker-compose
docker-compose.yaml ํ์ผ ์์ฑ
์๋ ์์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ํ docker-compose.yaml ํ์ผ์ ๋๋ค.
version: '3.8'
name: mbti # ์ง์ ํ์ง ์์ผ๋ฉด ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ผ๋ก ์ง์ ๋จ
services:
app: # ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์ด๋
image: daehyunbigbread/mbti:mysql
build:
args:
- NODE_VERSION=20.15.1
dockerfile: ./Dockerfile
pull: true
context: .
container_name: app
environment:
- PORT=3000
- DB_HOST=db
- DB_PORT=3306
- DB_NAME=db_mbti
- DB_USERNAME=user_mbti
- DB_PASSWORD=pw_mbti
networks:
- mbti-net
ports:
- "4000:3000"
depends_on:
- db
db: # MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ
์ด๋
image: mysql:8.3.0
container_name: db
environment:
- MYSQL_ROOT_PASSWORD=pw_root
- MYSQL_DATABASE=db_mbti
- MYSQL_USER=user_mbti
- MYSQL_PASSWORD=pw_mbti
networks:
- mbti-net
volumes:
- mbti-vol:/var/lib/mysql
networks:
mbti-net:
name: mbti-net
volumes:
mbti-vol:
name: mbti-vol
Docker Compose๋ก ์๋น์ค ์คํ
docker-compose.yaml ํ์ผ์ด ์์นํ ๋๋ ํ ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์๋น์ค๋ฅผ ๋น๋ํ๊ณ ์คํํฉ๋๋ค.
docker compose up --build -d
์คํ ๊ฒฐ๊ณผ
[+] Building 2.1s (10/10) FINISHED
[+] Running 2/4
โ Network mbti-net Created
โ Volume mbti-vol Created
โ Container db Started
โ Container app Started
์๋น์ค ๊ฐ ์์กด์ฑ ์ค์
Compose ํ์ผ์์ depends_on ์ต์ ์ ์ฌ์ฉํ์ฌ ์๋น์ค ๊ฐ์ ์์กด์ฑ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ ์์ ์์๋ app ์๋น์ค๊ฐ db ์๋น์ค์ ์์กดํ๋๋ก ์ค์ ํ์์ต๋๋ค. ์ด๋ app ์๋น์ค๊ฐ db ์๋น์ค๊ฐ ์์๋ ํ์ ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ฐธ๊ณ : depends_on์ ์ปจํ ์ด๋์ ์์ ์์๋ง ๋ณด์ฅํ๋ฉฐ, ์๋น์ค๊ฐ ์์ ํ ์ค๋น๋์๋์ง ํ์ธํ์ง๋ ์์ต๋๋ค.
์๋น์ค์ ์ค๋น ์ํ๋ฅผ ํ์ธํ๋ ค๋ฉด healthcheck๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
services:
app:
# ...
depends_on:
db:
condition: service_healthy
db:
# ...
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
Docker Compose ์ฃผ์ ๋ช ๋ น์ด
Docker Compose๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์์๋๋ฉด ์ข์ ์ฃผ์ ๋ช ๋ น์ด๋ค์ ์๊ฐํฉ๋๋ค.
docker compose up | Compose ํ์ผ์ ์ ์๋ ๋ชจ๋ ์๋น์ค๋ฅผ ๋น๋ํ๊ณ ์คํํฉ๋๋ค. |
docker compose up -d | ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋น์ค๋ฅผ ์คํํฉ๋๋ค. |
docker compose down | ๋ชจ๋ ์๋น์ค๋ฅผ ์ค์งํ๊ณ ์ปจํ ์ด๋, ๋คํธ์ํฌ, ๋ณผ๋ฅจ์ ์ญ์ ํฉ๋๋ค. |
docker compose build | Compose ํ์ผ์ ์ ์๋ ๋ชจ๋ ์๋น์ค๋ฅผ ๋น๋ํฉ๋๋ค. |
docker compose logs | ์๋น์ค์ ๋ก๊ทธ๋ฅผ ํ์ธํฉ๋๋ค. |
docker compose restart | ๋ชจ๋ ์๋น์ค๋ฅผ ์ฌ์์ํฉ๋๋ค. |
docker compose stop | ๋ชจ๋ ์๋น์ค๋ฅผ ์ค์งํฉ๋๋ค. |
docker compose start | ์ค์ง๋ ์๋น์ค๋ฅผ ์์ํฉ๋๋ค. |
docker compose exec [service] | ์คํ ์ค์ธ ์๋น์ค์ ์ปจํ ์ด๋ ๋ด๋ถ์์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค. |
docker compose ps | ํ์ฌ ์คํ ์ค์ธ ์๋น์ค์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. |
docker compose pull | Compose ํ์ผ์ ์ ์๋ ๋ชจ๋ ์๋น์ค์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค. |
docker compose push | Compose ํ์ผ์ ์ ์๋ ๋ชจ๋ ์๋น์ค์ ์ด๋ฏธ์ง๋ฅผ ํธ์ํฉ๋๋ค. |
์ถ๊ฐ ํ ๋ฐ ์ฃผ์์ฌํญ
Docker Compose๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ํ๊ณผ ์ฃผ์์ฌํญ์ ์์๋๋ฉด ์ข์ต๋๋ค.
1. ํ๊ฒฝ ๋ณ์ ํ์ผ ํ์ฉ
์ฌ๋ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ๊ด๋ฆฌํ ๋๋ .env ํ์ผ์ ์ฌ์ฉํ์ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ์ ์ํ๊ณ , Compose ํ์ผ์์ ์ด๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
- .env ํ์ผ ์์:
PORT=3000
DB_HOST=db
DB_PORT=3306
DB_NAME=db_mbti
DB_USERNAME=user_mbti
DB_PASSWORD=pw_mbti
MYSQL_ROOT_PASSWORD=pw_root
MYSQL_DATABASE=db_mbti
MYSQL_USER=user_mbti
MYSQL_PASSWORD=pw_mbti
- docker-compose.yaml ํ์ผ์์ ์ฐธ์กฐ:
environment:
- PORT=${PORT}
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- DB_NAME=${DB_NAME}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
2. ๋ณผ๋ฅจ๊ณผ ๋คํธ์ํฌ ๊ด๋ฆฌ
Compose ํ์ผ ๋ด์์ ๋ณผ๋ฅจ๊ณผ ๋คํธ์ํฌ๋ฅผ ์ ์ํ์ฌ, ์๋น์ค ๊ฐ์ ๋ฐ์ดํฐ ๊ณต์ ์ ๋คํธ์ํฌ ํต์ ์ ์์ฝ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
3. ์๋น์ค ์ค์ผ์ผ๋ง
Compose ํ์ผ์ ์ฌ์ฉํ๋ฉด ๋์ผํ ์๋น์ค๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ์ค์ผ์ผ๋งํ ์ ์์ต๋๋ค. ๋จ์ผ ํธ์คํธ ํ๊ฒฝ์์๋ง ๊ฐ๋ฅํ๋ฉฐ, ๋ถ์ฐ ํ๊ฒฝ์์๋ Docker Swarm์ด๋ Kubernetes์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
docker compose up --scale app=3 -d
4. ๋น๋ ์บ์ ํ์ฉ
์ด๋ฏธ์ง๊ฐ ์ด๋ฏธ ๋น๋๋ ๊ฒฝ์ฐ, docker compose build ๋ช ๋ น์ด๋ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋ค์ ๋น๋ํ์ฌ ๋น๋ ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์์ต๋๋ค.
5. Healthcheck ์ค์
์๋น์ค๊ฐ ์์ ํ ์์๋์๋์ง ํ์ธํ๊ธฐ ์ํด healthcheck๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ ์์กด์ฑ์ด ์๋ ์๋น์ค์ ์์ ์ ์ธ ์์์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
services:
db:
image: mysql:8.3.0
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
6. Compose ํ์ผ ๋ฒ์ ๊ด๋ฆฌ
Compose ํ์ผ์ ๋ฒ์ ์ ์ ์ ํ ๊ด๋ฆฌํ์ฌ Docker์ ์ต์ ๊ธฐ๋ฅ์ ํ์ฉํ๊ณ , ํธํ์ฑ์ ์ ์งํ์ธ์. ํ์ฌ๋ version: '3.8'์ด ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
์ฐธ๊ณ ์๋ฃ
- Docker Compose ๊ณต์ ๋ฌธ์: https://docs.docker.com/compose/
- Compose ํ์ผ ์ฐธ์กฐ: Compose file reference
- Docker CLI Reference - Compose: Docker Compose Commands
- MySQL Docker ์ด๋ฏธ์ง: MySQL Docker Hub
- BusyBox ๊ณต์ ๋ฌธ์: BusyBox
- Docker Networking Best Practices: Networking Best Practices
- Docker Bind Mounts vs Volumes: Bind Mounts vs Volumes
'โ๏ธ Cloud Native > ๐ณ Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] ENTRYPOINT์ CMD์ ๊ด๊ณ (0) | 2025.01.17 |
---|---|
[Docker] Docker Volume: ๋์ปค ๋ณผ๋ฅจ, ์ปจํ ์ด๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ (0) | 2025.01.17 |
[Docker] Docker Network: ๋์ปค ๋คํธ์ํฌ (0) | 2025.01.15 |
[Docker] Docker Container ์คํํ๊ธฐ: ๋จ๊ณ๋ณ ๊ฐ์ด๋ (0) | 2025.01.15 |
[Docker] Docker ์ด๋ฏธ์ง ๋น๋ & ๋ฐฐํฌ (0) | 2025.01.10 |