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