Docker Compose์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. Docker Compose๋ ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ด์ํ ์ ์๊ฒ ๋์์ฃผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๋จ์ผ ํ์ผ(docker-compose.yaml)์ ํตํด ์ด๋ฏธ์ง ๋น๋, ์ปจํ ์ด๋ ์คํ, ๋ณผ๋ฅจ ๋ฐ ๋คํธ์ํฌ ์์ฑ ๋ฑ์ ๊ฐํธํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ Docker Compose์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ์ค์ต ์์ ๊น์ง ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
Docker Compose๋?
Compose file reference
Find the latest recommended version of the Docker Compose file format for defining multi-container applications.
docs.docker.com
Docker Compose๋ ๋ค์ค ์ปจํ ์ด๋ Docker ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ณ ์คํํ ์ ์๋ ๋๊ตฌ์ ๋๋ค. YAML ํ์์ ํ์ผ(docker-compose.yaml)์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋น์ค, ๋คํธ์ํฌ, ๋ณผ๋ฅจ ๋ฑ์ ์ ์ธ์ ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ๋จ์ํํ๊ณ , ์ผ๊ด๋ ํ๊ฒฝ์ ์ ์งํ ์ ์์ต๋๋ค.
์ฃผ์ ํน์ง
- ๊ฐํธํ ์ค์ : YAML ํ์ผ์ ํตํด ์ฌ๋ฌ ์ปจํ ์ด๋์ ์ค์ ์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ์ผ๊ด ๊ด๋ฆฌ: ๋จ์ผ ๋ช ๋ น์ด๋ก ๋ชจ๋ ์ปจํ ์ด๋๋ฅผ ๋น๋, ์์, ์ค์ง, ์ญ์ ํ ์ ์์ต๋๋ค.
- ํ๊ฒฝ ์ผ๊ด์ฑ: ๊ฐ๋ฐ, ํ ์คํธ, ํ๋ก๋์ ํ๊ฒฝ์์ ๋์ผํ ์ค์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์์กด์ฑ ๊ด๋ฆฌ: ์๋น์ค ๊ฐ์ ์์กด์ฑ์ ์ ์ํ์ฌ ์ฌ๋ฐ๋ฅธ ์์๋ก ์ปจํ ์ด๋๋ฅผ ์์ํ ์ ์์ต๋๋ค.
Docker Compose์ ์ฃผ์ ๊ธฐ๋ฅ
- ์ด๋ฏธ์ง ๋น๋: docker-compose.yaml ํ์ผ ๋ด์์ ๋น๋ํ ์ด๋ฏธ์ง๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
- ์ปจํ ์ด๋ ์คํ: ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ๋์์ ์คํํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ณผ๋ฅจ ๋ฐ ๋คํธ์ํฌ ๊ด๋ฆฌ: ํ์ํ ๋ณผ๋ฅจ๊ณผ ๋คํธ์ํฌ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
- ์๋น์ค ๊ฐ ์์กด์ฑ: ์๋น์ค ๊ฐ์ ์์กด์ฑ์ ์ ์ํ์ฌ ์ฌ๋ฐ๋ฅธ ์์๋ก ์คํํ ์ ์์ต๋๋ค.
- ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ: ํ๊ฒฝ ๋ณ์๋ฅผ ํ์ผ์ด๋ ์ธ๋ถ ์์ค์์ ๋ก๋ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Docker Compose ์ค์นํ๊ธฐ
Docker Compose๋ Docker Desktop์ ํฌํจ๋์ด ์์ด ๋ณ๋์ ์ค์น๊ฐ ํ์ ์์ต๋๋ค. ๋ค๋ง, Linux ํ๊ฒฝ์์๋ ๋ณ๋๋ก ์ค์นํด์ผ ํ ์๋ ์์ต๋๋ค. ์ค์น ๋ฐฉ๋ฒ์ ์๋์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
docker compose
docs.docker.com
์ค์น ํ์ธ
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
์๋น์ค ๊ฐ ์์กด์ฑ ์ค์
Control startup order
How to control service startup and shutdown order in Docker Compose
docs.docker.com
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 |