개발블로그

Docker Compose 본문

STUDY/Docker

Docker Compose

devmel 2026. 8. 26. 10:17
Contents 접기
 

필요한 이유

 

Container가 하나라면 docker run만으로도 충분함. 

하지만 실제 Web Application은 여러 Container가 함께 동작하는 경우가 많음. 

여러 docker run 명령을 기억해저 실행하기보다 Application 전체 Container 구성을 하나의 설정으로 관리할 방법이 필요해짐

 


 

Docker Compose란?

 

여러 Container로 구성된 Application을 하나의 YAML 설정 파일로 정의하고 관리하기 위한 Docker 도구

compose.yaml
     ↓
docker compose up
     ↓
Application에 필요한
여러 Container 실행

 


 

compose.yaml 기본 구조

 

services:
  서비스이름:
    서비스옵션:
      옵션값

networks:
  네트워크이름:
    네트워크옵션:

volumes:
  볼륨이름:
    볼륨옵션:

최상위 하위 옵션 설명 하위 값 예시  
services:     컨테이너 목록   services:
app:
mysql:
redis:
nginx:
⇒ 각각은 서비스 이름
 
app :
(임의)
  내가 정하는 서비스 이름      
image: 어떤 Docker Image로 컨테이너를 만들지 정하는 옵션
(local에 image가 없다면 Registry에서 가져와 사용할 수 있음) 
  image: nginx:latest
image: mysql:8.0
image: redis:alpine
image: php:8.3-fpm
image: node:20
 
build Dockerfile로 직접 이미지를 만들 때
: 미리 만들어진 Image를 사용하는 대신 Dockerfile을 기준으로 Image를 Build할 때 사용
- context: Build Context
- dockerfile : 사용할 Dockerfile
   
container_name 컨테이너 이름 직접 지정
⇒ 이 이름으로 확인 및 조작 가능
ex) docker logs|restart 컨테이너 이름
• MYSQL_ROOT_PASSWORD : MySQL root 비밀번호
• MYSQL_DATABSE : 생성할 기본 DB이름
container_name:laravel-app  
ports 외부 포트와 컨테이너 포트 연결

• 형태 : 호트스포트:컨테이너포트
ports:
- "80:80"
- "443:443"
- "127.0.0.1:81:81”
“8080:80”
⇒ 호스트의 8080포트로 들어온 요청을 nginx 컨테이너의 80포트로 보냄
 
expose 내부 네트워크용 포트 표시   9000  
volumnes 파일/폴더/볼륨 연결
⇒ 이 컨테이너에 어떤 저장소를 붙일지 지정

• 형태 : 호스트경로:컨테이너내부경로
ex) ./data:/data
⇒ 현재 Compose파일 위치 기준 ./data 디렉터리를 컨테이너 안의 /data로 연결

cf) 최상위 volumnes
⇒ 이 이름의 볼륨을 만들어라.
  .:/var/www/html  
environment 환경변수 직접 지정   APP_ENV:locale  
env_file env파일 불러오기
(환경변수 많을 때 별도 File에서 읽음) 
  .env  
networks 컨테이너를 어떤 네트워크에 붙일지 지정

cf. networks > app-network ⇒ 이 이름의 네트워크 자체를 정의
  app-network  
restart 재시작 정책   unless-stopped  
command 컨테이너 실행 명령 변경   php artisan queue:Work  
entrypoint 시작 진입점 변경   entrypoint.sh  
working_dir 컨테이너 내부 작업 폴더   /var/www/html  
healthcheck 정상 상태 확인 명령   mysqladmin ping  
logging 로그 보관 정책 • driver
• options
max-size:10m  
depends_on Service간 시작 순서의 의존 관계 정의 

※ 기본적으로 Container가 시작되는 순서를 제어하는 것이지, 실제로 요청을 받을 준비까지 완료되었음을 보장하는 것은 아님. 
     
networks:     컨테이너들이 사용할 네트워크를 정의      
  app-network :
(임의 이름)
  네트워크 명

• 주의 : 이 이름의 네트워크는 Compose가 만들지 않으므로, 이미 존재하는 Docker네트워크를 사용
⇒ 사전 명령어 필요
docker network create app-network
     
volumes:     컨테이너 데이터 저장소를 정의      
configs:     설정 파일 주입용      
secrets:     비밀번호, 인증키 같은 민값값 관리      
name     Compose 프로젝트 이름 지정      

 

ex)

services:
  app:
    build: .
    container_name: laravel-app
    volumes:
      - .:/var/www/html
    depends_on:
      - mysql
      - redis

  nginx:
    image: nginx:latest
    container_name: laravel-nginx
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app

  mysql:
    image: mysql:8.0
    container_name: laravel-mysql
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

  redis:
    image: redis:7-alpine
    container_name: laravel-redis

volumes:
  mysql_data:

 

 


 

실행흐름

 

  1. compose.yml 파일을 읽음
  2. 필요한 이미지가 없으면 다운로드
  3. build가 필요한 서비스는 Dockerfile로 이미지를 만든다
  4. 네트워크를 만든다
  5. 볼륨을 만든다
  6. 컨테이너를 실행한다
  7. depends_on 기준으로 실행 순서를 조정한다

 


 

.dockerignore

 

이미지를 빌드할 때 제외할 파일을 정하는 파일

 


 

명령어

 

docker <대상> <행동> [옵션]

 

명령어 설명 옵션
docker compose up compose 실행 - d : 백그라운드에서 실행
--build : build도 같이 실행 
docker compose stop service 중지   
docker compose down compose로 실행한 컨테이너와 네트워크를 종료 (환경 제거) -v : 
docker compose logs compose 로그 보기 -f : 실시간 확인 
docker compose logs 이미지명 특정 서비스 로그 보기 -f : 실시간 확인 
docker compose ps compose 서비스 목록 확인  
docker compose exec 서비스명 bash 특정 서비스 안으로 접속  
docker compose restart 서비스명 특정 서비스 재시작   
docker compose build build 설정이 있는 Service의 Image를 빌드  
docker compose build [서비스] 특정 서비스만  

 

 


 

Docker Compose 사용 시 알아둘 점

 

depends_on의 한계

준비 완료를 보장하지 않음. 

Service가 실제로 준비되었는지까지 확인해야 한다면 healthcheck 등을 함께 고려해야 함. 

 

ex) 

services:
  app:
    depends_on:
      - db

  db:
    image: mysql:8.0

 

db Container 시작 → MYSQL Process 초기화 → Connection 가능 

즉, Container 시작 ≠ Service 준비 완료

 

 

Volumn 삭제 주의

docker compose down -v 

를 사용하면 Compose에서 관리하는 Volume도 함께 제거될 수 있음

 

 

환경변수와 Secret 관리

다음과 같은 값은 Source Code와 함께 공개되지 않도록 관리해야 함

EX) Database Password, API Key, Access Token, Secret Key 

 

민감한 정보는 별도의 Secret 관리 방식 검토 

 

 

개발 환경과 운영 환경의 차이

개발환경에서는 Souce Code를 바로 변경하기 위해 Bind Mount를 사용할 수 있다. 

개발자가 Host에서 Code를 수정하면 Container에서도 즉시 확인할 수 있어 편리함

 

하지만 운영 환경에서는 일반적으로 Souce Code와 Dependency가 포함된 완성된 Image를 Build하여 배포하는 방식이 더 적합

 

즉, 같은 Docker을 사용하더라도 개발과 운영에서는 목적에 따라 구성이 달라질 수 있음 

 

 

Compose의 적용 범위 

Docker Compose
→ 여러 Container의 구성과 실행 관리

Container Orchestration
→ 여러 Host에 걸친 Container 배치와 운영 관리

 

다음 상황에서 사용하기 좋다

  • Local 개발 환경 - 여러 Service를 한 번에 구성
  • Test 환경 - 동일한 환경 반복 생성
  • 소규모 Application - 한 Host의 여러 Container 관리
  • 개발용 DB / Redis - 필요한 Infrastructure를 빠르게 구성

다만 Host가 여러 대이고 Container 수가 많아지면서 다음과 같은 기능이 필요하다면 Compose만으로는 관리 범위가 부족 할 수 있다

여러 Server
자동 Scaling
자동 복구
Service 분산 배치
Rolling Update
복잡한 Deployment

 

위아 같은 영역은 Kubernetes 같은 Container Orchestration 도구의 범위로 넘어감. 

'STUDY > Docker' 카테고리의 다른 글

Dockerfile  (0) 2026.08.26
Docker  (0) 2026.08.26
Docker Volumn과 데이터 영속성  (0) 2026.08.26
Docker Container의 Port와 Network 통신 구조  (0) 2026.08.26
Docker Image  (0) 2026.08.26