μ„œλΉ„μŠ€ & 툴

[Docker] 3. 도컀 컴포즈(Docker compose)

μ„œμ•„λž‘πŸ˜ 2025. 1. 6. 00:00

 

 

도컀 컴포즈(Docker compose)

도컀 μ»΄ν¬μ¦ˆλŠ” 도컀 μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ μˆœμ„œμ™€ 흐름을 ν•œλˆˆμ— λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 싀행에 κ΄€ν•œ λͺ…μ„Έλ₯Ό 적어 λ†“μœΌλ‹ˆ μ–΄λ–€ μ„œλΉ„μŠ€λ“€μ΄ μ—°κ΄€λ˜μ–΄ 있고 μˆœμ„œκ°€ μ–΄λ–»κ²Œ μ§„ν–‰λ˜λŠ”μ§€ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ 상세 μ„€λͺ…이 λ‚˜μ˜€κ² μ§€λ§Œ, μ œκ°€ μƒκ°ν•˜λŠ” 도컀 컴포즈의 μ΅œλŒ€ μž₯점은 "Docker run(μ‹€ν–‰)의 μ½”λ“œν™”"라고 μƒκ°ν•©λ‹ˆλ‹€. μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μ‹œμ£ .

 

Docker Composeλž€?

Docker ComposeλŠ” μ—¬λŸ¬ 개의 Docker μ»¨ν…Œμ΄λ„ˆλ₯Ό μ •μ˜ν•˜κ³  λ™μ‹œμ— 관리할 수 μžˆλ„λ‘ λ•λŠ” λ„κ΅¬μž…λ‹ˆλ‹€. 단일 docker-compose.yml νŒŒμΌμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ μ •μ˜(μ„œλΉ„μŠ€, λ„€νŠΈμ›Œν¬, λ³Όλ₯¨ λ“±)λ₯Ό μž‘μ„±ν•˜κ³ , λͺ…λ Ή ν•œ μ€„λ‘œ κ΄€λ ¨ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹œμž‘, 쀑지, 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.


 

Docker Composeλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

Docker ComposeλŠ” μ»¨ν…Œμ΄λ„ˆ 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발 및 λ°°ν¬μ—μ„œ μ•„λž˜μ™€ 같은 이유둜 맀우 μœ μš©ν•©λ‹ˆλ‹€:

1. 닀쀑 μ»¨ν…Œμ΄λ„ˆ 관리

λ³΅μž‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ’…μ’… μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€(예: μ›Ή μ„œλ²„, λ°μ΄ν„°λ² μ΄μŠ€, μΊμ‹œ μ„œλ²„ λ“±).

Composeλ₯Ό μ‚¬μš©ν•˜λ©΄ 각 μ»¨ν…Œμ΄λ„ˆμ˜ 섀정을 ν•œκ³³μ—μ„œ μ •μ˜ν•˜κ³ , μ‰½κ²Œ 전체 μ‹œμŠ€ν…œμ„ μ‹œμž‘ν•˜κ±°λ‚˜ 쀑지할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 예: frontend, backend, database μ»¨ν…Œμ΄λ„ˆλ₯Ό ν•œκΊΌλ²ˆμ— μ‹€ν–‰.

2. κ°„νŽΈν•œ μ„€μ • 및 μž¬μ‚¬μš©μ„±

μ»¨ν…Œμ΄λ„ˆμ˜ μ„€μ • 정보λ₯Ό docker-compose.yml νŒŒμΌμ— μ„ μ–Έμ μœΌλ‘œ μ •μ˜ν•˜λ―€λ‘œ:

  • 섀정을 κ³΅μœ ν•˜κ±°λ‚˜ 버전 관리(Git)ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
  • νŒ€μ› κ°„ λ™μΌν•œ 개발 ν™˜κ²½μ„ κ΅¬μΆ•ν•˜κΈ° μš©μ΄ν•©λ‹ˆλ‹€.

3. 개발 ν™˜κ²½ ꡬ좕 및 ν…ŒμŠ€νŠΈ

둜컬 개발 ν™˜κ²½μ—μ„œ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ†μ‰½κ²Œ μ‹€ν–‰ν•˜μ—¬ ν”„λ‘œλ•μ…˜ ν™˜κ²½κ³Ό μœ μ‚¬ν•œ μƒνƒœλ₯Ό μž¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 예: docker-compose up을 톡해 개발, ν…ŒμŠ€νŠΈ, QA ν™˜κ²½μ„ λ™μΌν•˜κ²Œ μž¬ν˜„.

4. λ„€νŠΈμ›Œν‚Ή 및 μ—°κ²° 관리

ComposeλŠ” λ„€νŠΈμ›Œν¬λ₯Ό μžλ™μœΌλ‘œ μ„€μ •ν•˜κ³ , μ„œλ‘œ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆ κ°„ 톡신을 κ°„νŽΈν•˜κ²Œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

  • 예: backend μ»¨ν…Œμ΄λ„ˆκ°€ database μ»¨ν…Œμ΄λ„ˆμ˜ μ΄λ¦„μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯ (service name 기반).

5. 효율적인 배포 및 μŠ€μΌ€μΌλ§

Docker ComposeλŠ” Docker Swarmκ³Ό μ—°κ³„ν•˜μ—¬ μŠ€μΌ€μΌλ§ 및 배포도 κ°€λŠ₯ν•˜λ©°, μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€μ˜ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‰½κ²Œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 예: docker-compose up --scale web=3으둜 μ›Ή μ„œλ²„λ₯Ό 3개둜 ν™•μž₯.

6. λ³Όλ₯¨ 및 데이터 μœ μ§€ 관리

μ„œλΉ„μŠ€ κ°„ κ³΅μœ λ˜λŠ” 데이터 λ³Όλ₯¨μ„ μ‰½κ²Œ μ •μ˜ν•˜κ³  관리할 수 μžˆμ–΄ 데이터 μ˜μ†μ„±μ„ μœ μ§€ν•©λ‹ˆλ‹€.

  • 예: volumesλ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ 데이터λ₯Ό 호슀트 머신에 μ €μž₯.

 

Docker Compose의 μ£Όμš” ꡬ성 μš”μ†Œ

  1. Services: μ»¨ν…Œμ΄λ„ˆ λ‹¨μœ„μ˜ μ‹€ν–‰ ν™˜κ²½ μ •μ˜.
    • 예: web, db와 같은 μ„œλΉ„μŠ€.
  2. Networks: μ»¨ν…Œμ΄λ„ˆ κ°„ 톡신을 μœ„ν•œ λ„€νŠΈμ›Œν¬ μ„€μ •.
  3. Volumes: 데이터 곡유 및 μ˜μ†μ„±μ„ μœ„ν•œ λ³Όλ₯¨ μ„€μ •.

 

Docker Compose μ‚¬μš© μ˜ˆμ‹œ

docker-compose.yml 예제 파일

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    networks:
      - app-network

  app:
    build:
      context: ./app
    volumes:
      - .:/app
    depends_on:
      - db
    networks:
      - app-network

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network

volumes:
  db-data:

networks:
  app-network:

μ‹€ν–‰ 방법

  1. μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰: docker-compose up -d
  2. μ‹€ν–‰λœ μ»¨ν…Œμ΄λ„ˆ 확인: docker-compose ps
  3. μ»¨ν…Œμ΄λ„ˆ μ’…λ£Œ 및 μ‚­μ œ: docker-compose down

 

μ΅œμ‹  Docker Compose

docker-compose up/down λ“±μœΌλ‘œ μ‹€ν–‰ν•˜λŠ” 것은 파이썬 기반의 version1이며 더이상 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(λ‹€λ§Œ κ΄€λ¦¬λŠ” 계속 됨). μ΅œμ‹ λ²„μ „μ€ compose.yaml둜 κ΄€λ¦¬λ˜λ©° docker compose up/downμ‹μ˜ Go기반의 v2μž…λ‹ˆλ‹€.

Docker compose v2 μ‹€μŠ΅

docker compose --help

# compose.yaml μ„œλΉ„μŠ€μ— buildκ°€ μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  것듀 λΉŒλ“œ 진행
docker compose build

# μ„œλΉ„μŠ€ 및 λ„€νŠΈμ›Œν¬ 생성
docker compose up

# μ„œλΉ„μŠ€ 및 λ„€νŠΈμ›Œν¬ μ‚­μ œ
docker compose down

# μ„œλΉ„μŠ€ 및 λ„€νŠΈμ›Œν¬ 생성(λ°±κ·ΈλΌμš΄λ“œ)
docker compose up -d

# 컴포즈 ν”„λ‘œμ νŠΈ ν˜„ν™©(μ„œλΉ„μŠ€λŠ” ν”„λ‘œμ νŠΈμ˜ ν•˜μœ„)
docker compose ls

# 항상 λΉŒλ“œ ν•˜λ©΄μ„œ up μ‹œν‚€κΈ°
# μ»΄ν¬μ¦ˆλŠ” λ™μΌν•œ 이미지 이름이 μ‘΄μž¬ν•˜λŠ” 경우, buildλ₯Ό μƒλž΅ν•¨
docker compose up -d --build

docker compose logs -h

docker compose logs -f

docker compose down

 

 

 

docker compose ls, docker compose images

두 λͺ…λ Ήμ–΄λŠ” Docker Compose ν™˜κ²½μ—μ„œ 정보λ₯Ό μ‘°νšŒν•˜λŠ” 데 μ‚¬μš©λ˜μ§€λ§Œ, μ„œλ‘œ λ‹€λ₯Έ λŒ€μƒκ³Ό 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.


1. docker compose ls

  • λͺ©μ : Docker Compose둜 관리 쀑인 ν”„λ‘œμ νŠΈ λͺ©λ‘μ„ ν‘œμ‹œ.
  • μ£Όμš” 정보:
    • 각 ν”„λ‘œμ νŠΈμ˜ 이름.
    • ν”„λ‘œμ νŠΈκ°€ μ‹€ν–‰λ˜κ³  μžˆλŠ” μƒνƒœ(Status).
    • ꡬ성 파일의 경둜(Working Directory).
  • μ‚¬μš© 이유:
    • μ—¬λŸ¬ Docker Compose ν”„λ‘œμ νŠΈλ₯Ό 관리할 λ•Œ 각각의 μƒνƒœλ₯Ό ν•œλˆˆμ— 확인.
    • μ‹€ν–‰ 쀑인 ν”„λ‘œμ νŠΈλ₯Ό μ‹λ³„ν•˜κ±°λ‚˜ μž‘μ—… 디렉토리λ₯Ό 확인.
  • 좜λ ₯ μ˜ˆμ‹œ:
    • NAME: Docker Compose ν”„λ‘œμ νŠΈ 이름.
    • STATUS: ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ˜ μ»¨ν…Œμ΄λ„ˆ μƒνƒœ(running, exited λ“±).
    • CONFIG FILES: μ‚¬μš©λœ docker-compose.yml 파일 경둜.
$ docker compose ls
NAME                STATUS       CONFIG FILES
my_project          running      ./docker-compose.yml
another_project     exited       ./another-dir/docker-compose.yml

2. docker compose images

  • λͺ©μ : νŠΉμ • Docker Compose ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©λœ Docker 이미지 λͺ©λ‘μ„ ν‘œμ‹œ.
  • μ£Όμš” 정보:
    • 이미지 이름과 νƒœκ·Έ.
    • μ»¨ν…Œμ΄λ„ˆ 이름.
    • 이미지 ID.
    • 이미지 크기.
  • μ‚¬μš© 이유:
    • ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©λœ 이미지 정보λ₯Ό 확인.
    • 이미지 νƒœκ·Έλ₯Ό κ²€ν† ν•˜κ±°λ‚˜, ν•„μš” μ—†λŠ” 이미지λ₯Ό μ œκ±°ν•˜κΈ° 전에 μ°Έκ³ .
  • 좜λ ₯ μ˜ˆμ‹œ:
    • Container: Compose ν”„λ‘œμ νŠΈμ—μ„œ μ •μ˜λœ μ„œλΉ„μŠ€ 이름.
    • Repository: μ‚¬μš©λœ Docker μ΄λ―Έμ§€μ˜ 리포지토리 이름.
    • Tag: Docker 이미지 νƒœκ·Έ.
    • Image ID: μ΄λ―Έμ§€μ˜ 고유 ID.
    • Size: μ΄λ―Έμ§€μ˜ 크기.
$ docker compose images
Container           Repository      Tag       Image ID       Size
my_project_web      nginx           latest    a1b2c3d4e5f6   23MB
my_project_db       postgres        14.1      f6e5d4c3b2a1   40MB

 

차이점 μš”μ•½

 

λͺ…λ Ήμ–΄ μ£Όμš” λŒ€μƒ 좜λ ₯ 정보 μ‚¬μš© λͺ©μ 
docker compose ls Docker Compose ν”„λ‘œμ νŠΈ ν”„λ‘œμ νŠΈ 이름, μƒνƒœ, ꡬ성 파일 경둜 μ—¬λŸ¬ ν”„λ‘œμ νŠΈλ₯Ό κ΄€λ¦¬ν•˜κ±°λ‚˜ μƒνƒœλ₯Ό ν•œλˆˆμ— νŒŒμ•…ν•  λ•Œ.
docker compose images Docker Compose 이미지 μ»¨ν…Œμ΄λ„ˆ, 이미지 이름/νƒœκ·Έ, ID, 크기 νŠΉμ • ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©λœ Docker 이미지 정보λ₯Ό 확인할 λ•Œ.

 

μ‚¬μš© μ˜ˆμ‹œ

1. ν”„λ‘œμ νŠΈ μƒνƒœ 확인

$ docker compose ls
NAME                STATUS       CONFIG FILES
my_app              running      ./docker-compose.yml

2. νŠΉμ • ν”„λ‘œμ νŠΈμ˜ 이미지 정보 확인

$ docker compose images
Container           Repository      Tag       Image ID       Size
my_app_web          python          3.10      abc12345       150MB
my_app_db           mysql           8.0       def67890       300MB