Search

Docker Compose

Date
2024/12/09
Category
Devops
Tag
Docker
๋ชฉ์ฐจ

ย 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 ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰๋จ