이 글에서 얻는 것
- Docker Compose로 복잡한 실행 명령어(
docker run ...)를 깔끔하게 관리하는 법을 배웁니다. - Service Discovery: 컨테이너끼리 IP가 아닌 “이름"으로 통신하는 원리(DNS)를 이해합니다.
- Network Mode: Bridge 모드와 Host 모드의 차이, 그리고 언제 무엇을 써야 할지 기준을 잡습니다.
1. 왜 Docker Compose인가?
터미널에 매번 이렇게 칠 수는 없습니다.
# 😱 매번 이걸 친다고?
docker run -d --name db -e MYSQL_ROOT_PASSWORD=1234 mysql:8.0
docker run -d --name app --link db:db -p 8080:8080 myapp:latest
Docker Compose는 이 명령어를 yaml 파일 하나로 정의하고, docker-compose up 한 방으로 실행하게 해주는 IaC(Infrastructure as Code) 도구의 시작입니다.
2. Docker Network의 마법 (DNS)
Docker Compose로 실행하면, 자동으로 사용자 정의 브리지 네트워크(Custom Bridge Network) 가 생성됩니다. 이 네트워크 안에서는 Internal DNS가 돕니다.
services:
my-web:
image: nginx
my-db:
image: mysql
my-web컨테이너 안에서ping my-db를 치면?- 👉 Docker 내장 DNS가
my-db를 172.x.x.x(네트워크 내부 IP)로 변환해줍니다. - 애플리케이션 설정(
application.yml)에서 IP 대신url: jdbc:mysql://my-db:3306/...라고 적을 수 있는 이유입니다.
3. 네트워크 드라이버 종류
| 모드 | 설명 | 특징 | 용도 |
|---|---|---|---|
| Bridge | (기본값) 가상 스위치를 통해 통신 | Port Forwarding 필요 | 일반적인 웹 앱/DB 구성 |
| Host | 호스트 네트워크 직접 사용 | 성능 좋음, 포트 충돌 위험 | 네트워크 성능이 중요한 경우 |
| None | 네트워크 없음 | 외부 통신 불가 | 배치 작업 등 보안 격리 |
| Overlay | 다중 호스트 연결 | Swarm/K8s 전용 | 클러스터 환경 |
graph TD
subgraph Host[Host Machine]
subgraph BridgeNet[Docker Bridge Network (172.17.0.0/16)]
C1[Container A <br/> 172.17.0.2]
C2[Container B <br/> 172.17.0.3]
end
Eth0[Host Eth0 <br/> 192.168.0.100]
end
C1 -- Internal DNS --> C2
C1 -. NAT (Port:8080) .-> Eth0
4. 실전 Compose 패턴
1) 순서 제어 (depends_on)
DB가 켜지기도 전에 앱이 뜨면 에러가 납니다.
version: "3.8"
services:
app:
depends_on:
db:
condition: service_healthy # ✨ 꿀팁: 헬스체크 통과까지 대기
db:
image: mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 5
2) 환경변수 관리 (.env)
비밀번호는 yaml에 하드코딩하지 말고 .env 파일로 뺍니다.
# docker-compose.yml
environment:
MYSQL_PASSWORD: ${DB_PASS}
요약
- Compose는 필수: 다중 컨테이너 관리는 선택이 아니라 필수입니다.
- DNS: 컨테이너끼리는
Service Name으로 통신합니다. (localhost 아님!) - Bridge vs Host: 격리가 필요하면 Bridge, 성능이 최우선이면 Host를 고려합니다.
💬 댓글