[Docker] Docker Compose

cup-wanΒ·2025λ…„ 3μ›” 2일
2

Docker

λͺ©λ‘ 보기
3/3

벌써 도컀 3번째 μ‹œλ¦¬μ¦ˆμž…λ‹ˆλ‹€. μ§€κΈˆκΉŒμ§€ λ„μ»€μ˜ 기초, 이미지와 μ»¨ν…Œμ΄λ„ˆ, λ„€νŠΈμ›Œν¬μ— λŒ€ν•΄ λ°°μ› μŠ΅λ‹ˆλ‹€. μ΄λ²ˆμ—” μ €λ²ˆ 글에 살짝 μ–ΈκΈ‰ν–ˆλ˜ docker compose에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

곡식 docsμ—μ„œλŠ” python을 ν™œμš©ν•œ compose v1을 더 이상 μ§€μ›ν•˜μ§€ μ•Šμ„ κ²ƒμ΄λ‹ˆ Go 기반의 compose v2λ₯Ό μ‚¬μš©ν•˜λΌκ³  ν•˜λ„€μš”. κ·ΈλŸ¬λ‹ˆ 이 글에선 v2λ₯Ό κΈ°μ€€μœΌλ‘œ μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ“±μž₯ λ°°κ²½

μ•žμ„œ μ„€λͺ…ν–ˆλ“―이 ν˜„λŒ€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 단일 μ»¨ν…Œμ΄λ„ˆλ‘œ κ΅¬λ™ν•˜κΈ°μ—” λ„ˆλ¬΄λ‚˜λ„ λ§Žμ€ 것을 μš”κ΅¬ν•©λ‹ˆλ‹€. μ›Ή κ°œλ°œμ„ μ˜ˆμ‹œλ‘œ λ“€μ–΄λ΄…μ‹œλ‹€. μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜, λ°μ΄ν„°λ² μ΄μŠ€ (MySQL, PostgreSQL), 캐싱 μ‹œμŠ€ν…œ (Redis, Memcached), λ©”μ‹œμ§€ 브둜컀 (RabbitMQ, Kafka), λ‘œκΉ… 및 λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œ (Prometheus, ELK Stack) 등이 μ‚¬μš©λ  수 μžˆλŠ”λ° 이 λ§Žμ€ μš”μ†Œμ˜ μ»¨ν…Œμ΄λ„ˆλ“€μ„ 각자 κ΄€λ¦¬ν•˜κΈ°μ—” λ„ˆλ¬΄ λΉ„νš¨μœ¨μ μž…λ‹ˆλ‹€. 이 λΆˆνŽΈν•¨μ„ docker compose κ°€ ν•΄κ²°ν•΄μ€λ‹ˆλ‹€.

κΈ°λŠ₯

  • 닀쀑 μ»¨ν…Œμ΄λ„ˆ 관리 : μ—¬λŸ¬ 개의 μ»¨ν…Œμ΄λ„ˆλ₯Ό ν•œ λ²ˆμ— μ‹€ν–‰ 및 쀑지
  • μ„œλΉ„μŠ€ μ •μ˜ : μ»¨ν…Œμ΄λ„ˆ κ°„ λ„€νŠΈμ›Œν¬ μ„€μ •, λ³Όλ₯¨ 마운트, ν™˜κ²½ λ³€μˆ˜ μ„€μ • 등을 파일 (docker-compose.yml)둜 관리 κ°€λŠ₯
  • μž¬μ‚¬μš©μ„± : λ™μΌν•œ docker-compose.yml 을 μ‚¬μš©ν•΄ λ™μΌν•œ ν™˜κ²½μ„ μ‰½κ²Œ 배포 κ°€λŠ₯
  • μŠ€μΌ€μΌλ§ 지원 : νŠΉμ • μ„œλΉ„μŠ€μ˜ μ»¨ν…Œμ΄λ„ˆ 개수 μ‘°μ • κ°€λŠ₯

πŸ’‘ YAML

  • 데이터 ꡬ쑰화 문법 쀑 ν•˜λ‚˜ (CSV, JSON, XML, YAML λ“±)
  • κΈ°λ³Έ 문법
    • # : 주석
    • ... or --- : λ¬Έμ„œμ˜ λ§ˆμ§€λ§‰ λͺ…μ‹œ
    • key: value : key-value κ°’, λ°˜λ“œμ‹œ 띄어쓰기가 ν•„μš”
    • 계측 ꡬ쑰λ₯Ό λ“€μ—¬μ“°κΈ°(indent)둜 λ‚˜νƒ€λƒ„
    • int, string, boolean 지원
      • μž‘μ€ λ”°μ˜΄ν‘œ = 문자 κ·ΈλŒ€λ‘œ ('\n' 을 κ·Έλƒ₯ \n으둜 인식)
      • 큰 λ”°μ˜΄ν‘œ = μ΄μŠ€μΌ€μ΄ν”„λ¬Έ ꡬ뢄 ("\n"을 κ°œν–‰λ¬Έμžλ‘œ 인식)
    • 배열은 ν•˜μ΄ν”ˆ (-)으둜 ν‘œν˜„

예제

version: '3.8'

services:
  postgres:
    image: postgres:17.2
    container_name: postgres
    restart: always
    env_file:
      - .env
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - backend_network

  redis:
    image: redis:latest
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    networks:
      - backend_network

  spring-app:
    image: my-backend:latest
    container_name: spring-app
    restart: always
    depends_on:
      - postgres
      - redis
    ports:
      - "8080:8080"

    environment:
      REDIS_HOST: ${REDIS_HOST}
      REDIS_PORT: ${REDIS_PORT}

    networks:
      - backend_network

networks:
  backend_network:
    driver: bridge

volumes:
  postgres_data:

version

  • Docker Compose 버전 μ§€μ • (μ˜ˆμ œλŠ” 3.8 μ‚¬μš©)
  • Docker Compose의 κΈ°λŠ₯ λ²”μœ„ κ²°μ •
  • μ‚¬μš© 쀑인 Docker μ—”μ§„κ³Ό ν˜Έν™˜μ„±μ„ νŒλ‹¨ν•˜λŠ”λ° μ‚¬μš©

services

  • μ‹€ν–‰ν•  μ»¨ν…Œμ΄λ„ˆ (μ„œλΉ„μŠ€) μ •μ˜
  • λ™μΌν•œ μ΄λ―Έμ§€λ‘œ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ κ°€λŠ₯
  • μ„œλΉ„μŠ€μ˜ 이름 = μ»¨ν…Œμ΄λ„ˆ 이름 = 도컀 λ„€νŠΈμ›Œν¬ 상 λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆλ“€μ΄ ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹λ³„ν•˜λŠ” DNS
  • ν•„λ“œ μ’…λ₯˜
    • image : ν•΄λ‹Ή μ„œλΉ„μŠ€(μ»¨ν…Œμ΄λ„ˆ)μ—μ„œ μ‹€ν–‰ν•  이미지
    • environments : ν•΄λ‹Ή μ„œλΉ„μŠ€μ—μ„œ μ‚¬μš©ν•  ν™˜κ²½ λ³€μˆ˜
      • .env νŒŒμΌμ„ 생성 ν›„ env_file을 톡해 μ„€μ •ν•  μˆ˜λ„ 있음 (ꢌμž₯)
    • ports : κ³΅κ°œν•  포트 정보
    • networks : μ»¨ν…Œμ΄λ„ˆκ°€ 접속할 도컀 λ„€νŠΈμ›Œν¬ μ •μ˜
    • depends_on : νŠΉμ • μ„œλΉ„μŠ€κ°€ μ‹€ν–‰λœ 이후에 μ‹œμž‘λ˜λ„λ‘ μ„€μ • (μ™œ? 와이? DB μ•ˆμ—΄λ ΈλŠ”λ° spring μ‹€ν–‰ν•˜λ©΄ μ—λŸ¬ 와바박 λ‚˜λ‹ˆκΉŒ.)

networks

  • 각 μ»¨ν…Œμ΄λ„ˆλ“€μ΄ μ‚¬μš©ν•  networks μ„€μ •
    • ν˜„μž¬ μ˜ˆμ œλŠ” backend_network 만 μ‚¬μš©
    • μ—¬λŸ¬ network μ„€μ • κ°€λŠ₯
  • driverλ₯Ό μ„€μ •ν•΄ λ„€νŠΈμ›Œν¬ μ’…λ₯˜ 선택 κ°€λŠ₯ (λ””ν΄νŠΈ = bridge)
  • defaultλŠ” 단일 λ„€νŠΈμ›Œν¬ 생성 ν›„ μ»¨ν…Œμ΄λ„ˆ κ°„ 톡신
  • external을 μ„€μ •ν•˜λ©΄ μ™ΈλΆ€ λ„€νŠΈμ›Œν¬λ„ μ‚¬μš© κ°€λŠ₯

volumes

  • 파일 μ΅œμƒλ‹¨ μ„Ήμ…˜μ—μ„œ volumes μ •μ˜ ν›„ μ„œλΉ„μŠ€μ—μ„œ μ°Έμ‘°
    • μ»¨ν…Œμ΄λ„ˆκ°€ μ‚­μ œλ˜μ–΄λ„ 데이터 μœ μ§€
    • μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆμ—μ„œ 같은 λ³Όλ₯¨ 곡유 κ°€λŠ₯
  • μ„œλΉ„μŠ€ λ‚΄λΆ€μ—μ„œ 직접 volumes μ§€μ •
    services:
      postgres:
        image: postgres:17.2
        volumes:
          - /var/lib/postgresql/data
    • 이 방식은 읡λͺ… λ³Όλ₯¨ 생성
    • μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ μ‹œ λ³Όλ₯¨λ„ ν•¨κ»˜ μ‚­μ œλ¨
    • 같은 λ³Όλ₯¨μ„ λ‹€λ₯Έ μ„œλΉ„μŠ€μ—μ„œ μž¬μ‚¬μš©ν•  수 μ—†μŒ

μ£Όμš” λͺ…λ Ήμ–΄

  • μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ (-d : λ°±κ·ΈλΌμš΄λ“œ μ‹€ν–‰)
docker compose up -d
  • μ»¨ν…Œμ΄λ„ˆ 확인 및 쀑지
docker compose ps
docker compose down
  • νŠΉμ • μ„œλΉ„μŠ€ μ‹€ν–‰ 및 쀑지
docker compose up -d μ„œλΉ„μŠ€μ΄λ¦„
docker compose stop μ„œλΉ„μŠ€μ΄λ¦„
  • μ»¨ν…Œμ΄λ„ˆ 둜그 확인 (-f : μ‹€μ‹œκ°„ 둜그 확인)
docker compose logs -f
  • μ»¨ν…Œμ΄λ„ˆ μž¬μ‹œμž‘
docker compose restart

마무리

λ„€.. 생각보닀 λ‚΄μš©μ΄ λ³„λ‘œ μ–΄λ €μšΈ 것 μ—†μ£ ? μ€‘μš”ν•œ 것은 networks μ„€μ •κ³Ό volumesλ₯Ό μ–΄λ–»κ²Œ λ‹€λ£°μ§€ κ°™μŠ΅λ‹ˆλ‹€. λ˜ν•œ docker composeλŠ” μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜μ΄ μ•„λ‹ˆλΌλŠ” 점, λ‹€μŒ 글에 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜μ— λŒ€ν•΄ λ‹€λ£° κ²ƒμ΄λΌλŠ” 것.
그것이 μ•½μ†μ΄λ‹ˆκΉŒ.

profile
아무것도 μ•ˆν•΄μ„œ μœ μ£„ 판결 λ°›μŒ

1개의 λŒ“κΈ€

comment-user-thumbnail
2025λ…„ 3μ›” 16일

음... μ–΄λ ΅μŠ΅λ‹ˆλ‹€ μ‹¬μ˜€ν•œ μΈν”„λΌμ˜ 세계, κ·Έλž˜λ„ 잘 보고 κ°‘λ‹ˆλ‹€!!

λ‹΅κΈ€ 달기