๋ชฉ์ฐจ
ย Docker Compose
Docker Compose๋ ๋ค์ค ์ปจํ
์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ํ๊ณ ์คํํ๊ธฐ ์ํ ๋๊ตฌ์ด๋ค. ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ์๋น์ค๋ฅผ ๊ตฌ์ฑํด์ ๊ฐ๊ฐ ์คํ์ํค๋ ๊ฒ์ด ์๋ ํ๋์ ๋ช
๋ น์ด๋ก ์ฌ๋ฌ ์ปจํ
์ด๋๋ก ๊ตฌ์ฑ๋ ์๋น์ค๋ฅผ ์์ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ๊ฒฝํ์ ๊ฐ์ํํ๊ณ ํจ์จ์ ์ธ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. Docker Compose์ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ๋ค.
โข
๋จ์ผ YAML ํ์ผ
โฆ
๋ชจ๋ ์๋น์ค, ๋คํธ์ํฌ, ๋ณผ๋ฅจ์ ๊ด๋ฆฌํ ์ ์๋ YAML ๊ตฌ์ฑ ํ์ผ ์ฌ์ฉ
โข
๋จ์ผ ๋ช
๋ น์ผ๋ก ์คํ
โฆ
๊ตฌ์ฑ ํ์ผ์์ ๋ชจ๋ ์๋น์ค๋ฅผ ์์ฑํ๊ณ ์์ํ๋ ๋จ์ผ ๋ช
๋ น์ด๋ก ์์
โข
๋ค์ํ ํ๊ฒฝ ์ง์
โฆ
Production, Staging, Develop, Test ๋ฐ CI Workflow ๋ฑ ๋ชจ๋ ํ๊ฒฝ์์ ์๋
โข
์ ์ฒด ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ
โฆ
์๋น์ค ์์, ์ค์ง, ์ฌ๋น๋
โฆ
์คํ ์ค์ธ ์๋น์ค์ ์ํ ํ์ธ
โฆ
์๋น์ค์ ๋ก๊ทธ ์ถ๋ ฅ ์คํธ๋ฆฌ๋ฐ
โฆ
์๋น์ค์์ ์ผํ์ฑ ๋ช
๋ น ์คํ
ย Docker Compose์ ์ฅ์
ย ๊ฐ์ํ๋ ๊ด๋ฆฌ
๋จ์ผ YAML ํ์ผ: ์ฌ๋ฌ ์ปจํ
์ด๋๋ฅผ ๋จ์ผ YAML ํ์ผ๋ก ์ ์ํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์
์คํ์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
ย ํจ์จ์ ์ธ ํ์
๊ณต์ ์ฉ์ด์ฑ: Compose ํ์ผ์ ๊ณต์ ํ์ฌ, ํ์ ๊ฐ์ ํ์
์ ์ํํ ํ๋ฉฐ, ๋์ผํ ํ๊ฒฝ์ ์ฌ์ฉํ ์ ์๋ค.
ย ๋น ๋ฅธ ๊ฐ๋ฐ ์ฌ์ดํด
์บ์ฑ ๊ธฐ๋ฅ: ๋ณ๊ฒฝ๋์ง ์์ ์๋น์ค๋ ๊ธฐ์กด ์ปจํ
์ด๋๋ฅผ ์ฌ์ฌ์ฉํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์
ํ๊ฒฝ์ ๋น ๋ฅด๊ฒ ๋ณ๊ฒฝํ๊ณ ํ
์คํธ ํ ์ ์๋ค.
ย ์ด์์ฑ
ํ๊ฒฝ ๋ณ์ ์ง์: Compose ํ์ผ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ, ๋ค์ํ ํ๊ฒฝ(๊ฐ๋ฐ, ํ
์คํธ, ํ๋ก๋์
)์ ๋ง๊ฒ ์ฝ๊ฒ ๊ตฌ์ฑ์ ์กฐ์ ํ ์ ์๋ค.
ย ์๋ํ๋ ํ
์คํธ ํ๊ฒฝ
๊ฒฉ๋ฆฌ๋ ํ
์คํธ ํ๊ฒฝ: ํ
์คํธ๋ฅผ ์ํ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ ์ฝ๊ฒ ์์ฑ/ํ๊ดดํ ์ ์์ด CI/CD ํ๋ก์ธ์ค์ ์ ํฉํ๋ค.
ย Setting
docker compose๋ฅผ ์ฌ์ฉํ์ฌ๋ ์๊ด ์๋ค.
Docker Compose Standalone
โข
Docker Compose
โฆ
์ผ๋ฐ์ ์ผ๋ก Docker์ ํจ๊ป ์ค์น๋์ด ์ฌ์ฉ
โฆ
Docker daemon์ ์์กดํ๋ฉฐ, Docker๊ฐ ์คํ ์ค์ธ ํ๊ฒฝ์์๋ง ์๋
โฆ
docker compose ๋ก ์คํ
โข
Docker Compose Standalone
โฆ
Docker ํ๊ฒฝ๊ณผ ๋
๋ฆฝ์ ์ผ๋ก ์คํํ ์ ์๋ ๋ฒ์
โฆ
ํน์ ํ๊ฒฝ์์ Docker Compose๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์ด ์์ด Docker์์ ์ง์ ์ ์ธ ์์กด์ฑ์ด ์์
โฆ
docker-compose ๋ก ์คํ
Docker Compose์ Docker Compose Standalone์ ์ฃผ์ ์ฐจ์ด๋ ์คํ ํ๊ฒฝ, ์ค์น ๋ฐฉ๋ฒ, ์ฌ์ฉ ์ฌ๋ก์์์ ์ ์ฐ์ฑ์ด๋ค. ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ Docker Compose๊ฐ ์ ํฉํ์ง๋ง, ํน์ ํ๊ฒฝ์ด๋ CI/CD ์ํฌํ๋ก์ฐ์์๋ Standalone ๋ฒ์ ์ด ๋ ์ ์ฉํ ์ ์๋ค.
Install the Docker Compose Standalone
sudo curl -SL "https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# ๋ฒ์ ํ์ธ
docker-compose -v
Shell
๋ณต์ฌ
์ฃผ์ ๋ช ๋ น์ด
# ํ์ธ
docker-compose ps
# .yml ํ์ผ์ ์ค์ ์ ๋ณด๋ก ์ปจํ
์ด๋ ์คํ
## ์กด์ฌํ์ง ์๋ network ๋ฑ ์์ ์๋ ์์ฑ
docker-compose up
## Dockerfile ๋ณ๊ฒฝ์ฌํญ ์๊ธด๊ฒฝ์ฐ, ์๋กญ๊ฒ ๋ฐ์ํ์ฌ ๋น๋
### -d detach ๋ชจ๋
docker-compose up --build -d
# ๋ก๊ทธ ์ถ๋ ฅ
docker-compose logs
# ์ปจํ
์ด๋ ์ ์ง
docker-compose stop
# ์ปจํ
์ด๋ ์์
docker-compose start
# ์ปจํ
์ด๋ ์ฌ์์
docker-compose restart
# ์ปจํ
์ด๋ ์ข
๋ฃ ๋ฐ ์ญ์
docker-compose down
Shell
๋ณต์ฌ
ย Practical Exercise
์ค์ต ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ๋ค:
OS: Ubuntu
Backend:
- Framework: Springboot
- Build Tool: maven
Database: MySQL
Network: Bridge Network
Prerequisites
โข
bind mountํ ๋๋ ํ ๋ฆฌ ์์ฑ
โฆ
mkdir -p ~/data/mysql
โข
ํ๋ก์ ํธ ๋น๋ โ .jar
โข
Dockerfile ์์ฑ
FROM openjdk:17
COPY app-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
Docker
๋ณต์ฌ
YAML
services:
db:
container_name: mysql-server
image: mysql:latest
ports:
- 3306:3306
volumes:
- /home/ubuntu/data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app
MYSQL_USER: app
MYSQL_PASSWORD: app
networks:
- app-network
healthcheck:
test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD']
interval: 10s
timeout: 2s
retries: 100
backend:
container_name: backend-server
build:
context: .
dockerfile: ./Dockerfile
ports:
- 8080:8080
environment:
MYSQL_HOST: db
depends_on:
db:
condition: service_healthy
networks:
- app-network
networks:
app-network:
driver: bridge
YAML
๋ณต์ฌ
โข
environment: ํ๊ฒฝ๋ณ์
โข
healthcheck: ์ฐ๊ฒฐ ์ํ ํ์ธ
โข
depends_on: ์์กด ์๋น์ค
โฆ
ํด๋น yaml์์๋ db๊ฐ ์คํ๋๊ณ healthcheck๊ฐ ์ ์์ ์ผ๋ก ์ด๋ค์ ธ์ผ backend ์๋น์ค๊ฐ ์คํ๋จ