kind: capsule status: active visibility: private license: CC-BY-SA-4.0 summary: 컨테이너에서 호스트의 localhost 서비스 접근은 host.docker.internal 사용. Linux 20.10+는 --add-host=host.docker.internal:host-gateway 필요. tags: - docker - networking - localhost - capsule
Docker Container → Host localhost (host.docker.internal) Capsule
Summary#
컨테이너 안에서 127.0.0.1은 컨테이너 자신을 가리키므로 호스트 서비스에 닿지 못한다. Docker Desktop (Mac/Win)은 host.docker.internal DNS를 자동 제공하고, Linux는 20.10+에서 명시적 설정이 필요하다.
Claim#
환경별 설정#
- Mac / Windows (Docker Desktop 18.03+):
host.docker.internal기본 제공, 추가 설정 없음 - Linux (Docker Engine 20.10+): ```yaml # docker run docker run --add-host=host.docker.internal:host-gateway ...
# docker-compose.yml
services:
app:
extra_hosts:
- "host.docker.internal:host-gateway"
``
- **호환 레거시 해법 (모든 환경)**: 호스트를0.0.0.0로 bind하고 bridge gateway IP(172.17.0.1`) 사용
호스트 서비스 bind 점검#
- MySQL/Postgres가
127.0.0.1에만 bind되어 있으면 컨테이너에서 도달 불가 —0.0.0.0또는 특정 인터페이스로 변경 필요 ss -tlnp또는netstat -tlnp로 bind 확인
대안: host network mode#
docker run --network=host ...
- 호스트 네트워크를 그대로 공유 — 격리 없음, Mac/Win은 제한적 지원
Scope#
- Linux Docker Engine 20.10.0+ — 그 이전은
172.17.0.1하드코딩 또는 호스트명 수동 추가 - Kubernetes는 별도 개념 (Service + externalName, hostNetwork pod)
Caveats#
- host-gateway magic은 Linux Docker Engine only. containerd/Podman은 별도 설정 필요
127.0.0.1에만 bind한 서비스는 여전히 안 닿음 — bind 주소 확인 필수- 프로덕션에서
host.docker.internal의존하지 말 것 (DX 용도) — 서비스 디스커버리는 별도 네트워크/DNS로
Source#
- Q: https://stackoverflow.com/q/24319662
- A: https://stackoverflow.com/a/24326540 — by Thomasleveil
- License: CC BY-SA 4.0 (Stack Exchange)
- last_edit: 2024
- 조회일: 2026-04-19
Sagwan Revalidation 2026-04-18T21:15:52Z#
- verdict:
ok - note: Docker Desktop 자동 제공, Linux 20.10+
--add-host=host.docker.internal:host-gateway방식 모두 2026년 현재도 유효한 공식 권장사항임.