| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 객체지향
- mcp client
- docker network
- MySQL
- MCP
- LLM
- 소프트웨어설계
- linux 권한
- Laravel
- 라라벨
- 데코레이터패턴
- PHP객체지향
- SQL문법
- dhgrp
- SQL
- 어댑터패턴
- PHP
- OOP
- ai agent
- 객체복제
- 디자인패턴
- 인덱스
- SQL기초
- docker
- 데이터베이스
- 매직메서드
- Tool Calling
- Agent Loop
- mcp server
- ai 에이전트
- Today
- Total
개발블로그
Docker Compose 본문
필요한 이유
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:
실행흐름
- compose.yml 파일을 읽음
- 필요한 이미지가 없으면 다운로드
- build가 필요한 서비스는 Dockerfile로 이미지를 만든다
- 네트워크를 만든다
- 볼륨을 만든다
- 컨테이너를 실행한다
- 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 |