Quick Flow
docker network create appnet
docker run -d --name db --network appnet \
-e POSTGRES_USER=app -e POSTGRES_PASSWORD=password -e POSTGRES_DB=app postgres:17
docker run -d --name api --network appnet \
-e DATABASE_URL=postgres://app:password@db:5432/app my-api
# api 안의 application은 host=db, port=5432로 연결
docker exec api printenv DATABASE_URL같은 사용자 정의 bridge network의 container는 이름 또는 network alias로 서로를 찾습니다. Compose에서는 보통 service 이름(db, redis)을 hostname으로 쓰며, IP와 published host port를 내부 연결 문자열에 넣지 않습니다.
DNS 발견
사용자 정의 bridge network는 container 이름과 network alias를 DNS로 해석합니다. container를 다시 만들면 IP는 달라질 수 있지만 application이 새 연결을 열 때 이름을 다시 해석하면 새 address로 연결할 수 있습니다.
docker network create appnet
docker run -d --name redis --network appnet redis:7
docker run --rm --network appnet alpine nslookup redisCompose는 application별 기본 network를 만들고 같은 Compose project의 service를 연결합니다. 아래에서는 api가 host name db로 database에 접근합니다. service 이름은 내부 DNS 이름이고 container_name을 고정할 이유가 없습니다.
services:
api:
image: my-api
environment:
DATABASE_URL: postgres://app:password@db:5432/app
db:
image: postgres:17
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: password
POSTGRES_DB: app기존 TCP connection이 container 재생성 뒤 자동으로 복구되는 것은 아닙니다. DNS가 새 IP를 돌려도 client가 reconnect·retry하도록 application timeout과 connection 정책을 따로 둡니다.
network 경계
Docker가 시작할 때 만드는 기본 bridge는 사용자 정의 bridge와 달리 자동 DNS 서비스 발견을 기대하기 어렵습니다. 새 multi-container 구성이면 custom bridge 또는 Compose 기본 network를 사용합니다. 같은 user-defined bridge의 container끼리는 port를 publish하지 않고 container port로 직접 통신할 수 있습니다.
docker network create frontend
docker network create backend
docker run -d --name api --network frontend my-api
docker network connect backend api
docker run -d --name db --network backend -e POSTGRES_PASSWORD=password postgres:17api는 두 network에 속하므로 양쪽과 통신하지만, db는 backend에만 있으므로 frontend의 container가 바로 연결할 수 없습니다. bridge network는 동일 Docker daemon host 안에서의 경계입니다. 여러 host에 걸친 service discovery는 overlay network, Kubernetes, cloud network, OS routing처럼 별도 구조를 선택해야 합니다.
연결 오류
container 안에서 localhost는 그 container 자신입니다. api에서 localhost:5432는 db가 아니라 api가 열고 있는 5432를 찾습니다. 다른 service에는 service name과 container port를 씁니다.
services:
api:
environment:
# 잘못된 내부 연결: api 자신의 5432를 찾음
DATABASE_URL: postgres://localhost:5432/app
# 올바른 내부 연결: Compose service 이름과 container port
DATABASE_URL: postgres://db:5432/appdocker network inspect <network>로 연결된 container와 alias를 확인하고, docker inspect <container>로 실제 network 설정을 확인합니다. port를 host에 publish하는 목적과 내부 이름 연결의 차이는 포트 공개와 bridge 네트워크 카드에서 다룹니다.
사용자 정의 network의 DNS는 연결 대상을 찾는 기능이지 readiness 보장이 아닙니다. 이름이 해석돼도 DB가 아직 query를 받을 준비가 되지 않을 수 있으므로 healthcheck, retry, timeout 정책을 함께 둡니다.
참고 링크
3 sources