이 글에서 얻는 것

  • 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}

요약

  1. Compose는 필수: 다중 컨테이너 관리는 선택이 아니라 필수입니다.
  2. DNS: 컨테이너끼리는 Service Name으로 통신합니다. (localhost 아님!)
  3. Bridge vs Host: 격리가 필요하면 Bridge, 성능이 최우선이면 Host를 고려합니다.