Study/Docker&Kubernetes

[Docker] Docker Compose & 유틸리티 컨테이너

kimdaepa 2026. 6. 22. 21:21

docker compose

  • docker build와 docker run을 합친 오케스트레이션 명령 셋
  • 누구와도 공유할 수 있는, 명확히 정의된 언어를 사용하는 구성 파일을 가짐
  • 컨테이너가 여러 개 있을수록 유용
  • Dockerfile, image, container를 대체하는 것이 아님
  • 다수의 호스트에서 다중 컨테이너를 관리하는 데는 적합하지 않음 (하나의 호스트에서 다중 컨테이너를 관리하는 데 적합)

docker compose 시작

docker-compose.yaml 파일을 작성한다. 정의할 수 있고 정의해야 하는 핵심이자 가장 중요한 요소 항목을 서비스(Service) 라고 부른다. (서비스 == 컨테이너)

  • 포트, 환경변수, 볼륨, 네트워크를 할당할 수 있음
  • 콜론과 공백이 없는 단일 값의 경우 - 필요
  • 이름, 콜론, 공백으로 키-값 쌍이 있는 경우 - 불필요
# 1) 사용하려는 도커 컴포즈 사양 버전 지정
version: "3.8"

# 2) services 작성
services:
  # 3) children(=container) label 지정; 코드에서 실제 사용하는 이름; 컨테이너의 실제 이름은 아님.
  mongodb:
    # 4) 각 Container의 image 작성
    image: 'mongo'
    volumes:
      # 5) 다중 볼륨이 있을 경우 "-"로 추가
      - data:/data/db
    # 12) container 이름 지정할 경우
    container_name: mongodb

    # 6) 환경 변수 작성 or .env 지정
    # 6-1) 환경 변수 작성
    #environment:
      #MONGO_INITDB_ROOT_USERNAME: daepa
      # or
      #- MONGO_INITDB_ROOT_USERNAME = daepa
      #MONGO_INITDB_ROOT_PASSWORD: secret
    # 6-2) .env 지정(상대 경로)
    env_file:
      - ./env/mongo.env

  backend:
    # 8) 이미지 빌드 대체
    # 8-1) 단순 표기
    build: ./backend
    # 8-2) 상세 표기
    #build:
      # Dockerfile을 보유하는 폴더 상대 경로 제시
      #context: ./backend
      #dockerfile: Dockerfile
      #args:
        #some-arg: 1

    # 9) port 작성
    ports:
      - '80:80'
    volumes:
     - logs:/app/logs
     # 5-1) 바인드 볼륨 작성 방법(상대 경로)
     - ./backend:/app
     # 5-2) 익명 볼륨 작성 방법(그냥 그대로 작성)
     - /app/node_modules
    env_file:
      - ./env/backend.env
    # 10) 의존성 작성
    depends_on:
      - mongodb

  frontend:
    build: ./frontend
    ports:
      - '3000:3000'
    volumes:
      - ./frontend/src:/app/src
    # 11) -it 옵션 추가할 경우
    stdin_open: true # 개방형 입력 연결
    tty: true # 터미널 연결
    depends_on:
      - backend

# 7) 볼륨 작성; services에서 사용 중인 명명된 볼륨이 나열되어야 함.(익명, 바인드 볼륨은 X)
volumes:
  data:
  logs:

docker compose 특징

  • detached mode가 default
  • compose 파일에 특정된 모든 서비스에 대해 새 환경을 자동으로 생성하고 모든 서비스를 즉시 그 네트워크에 추가 → 즉 networks 기입 안 해도 됨 (추가해도 상관 없음)
  • Dockerfile이 수정될 경우 리빌드 강제 필요
  • 소스 코드는 볼륨 마운트가 되어 있어야 자동 재빌드

docker compose 실행 명령어

# 일반 실행
docker compose up

# Detached
docker compose up -d

# 서비스, 컨테이너 중지(볼륨 제거 x)
docker compose down

# 서비스, 컨테이너 중지(볼륨 제거 o)
docker compose down -v

# 이미지 리빌드 강제
docker compose up --build
docker compose build # 시작은 안 함.

 

유틸리티 컨테이너

  • 특정 환경만 포함하는 컨테이너
  • 모든 부가 도구(Node.js 등)를 설치하지 않아도 사용할 수 있음

관련 명령어

특정 작업을 실행하기 위해 지정한 명령과 함께 실행:

# 예시
docker run -it node npm init

실행 중인 컨테이너 안에서 새 명령을 실행 / 컨테이너 시작할 때 기본 명령 변경:

# 실행 중인 컨테이너 안에서 추가 명령을 실행
docker exec -it <"Container Name"> <"명령어">

# 컨테이너 시작할 때 기본 명령 변경
docker run <"Image Name"> <"명령어">

EntryPoint

  • Dockerfile에 적는 명령어
  • 특정 명령어의 입장 구문을 작성

docker compose 옵션

# detach
docker compose up -d

# 변경 사항 존재 시 이미지 재빌드 (레이어 캐시 값 보존)
docker compose up --build

# 특정 일회성 명령 실행
docker compose run

# 특정 일회성 명령 실행 후 삭제
docker compose run --rm