🐳 Docker 네트워크 합치기는 귀찮고, 호스트 포트로 '급하게' 통신하고 싶을 때
보통 컨테이너끼리 통신할 때는 공용 브릿지 네트워크를 하나 파서 서비스 이름(예: http://app-b:8080)으로 호출하는 게 정석입니다. 하지만 살다 보면 정석대로 하기 힘든 '피치 못할 상황'이 생기곤 하죠.
이런 '억울한 상황'이라면 이 방법을 쓰세요
- 호스트에 직접 설치된 서비스와 통신할 때: DB나 Redis가 컨테이너가 아니라 호스트 OS에 직접 설치되어 있어, 네트워크를 합칠래야 합칠 수가 없을 때.
- 남이 만든 컨테이너라 네트워크 설정을 건드리기 무서울 때: 내가 관리하지 않는 복잡한 네트워크 설정에 내 컨테이너를 강제로 끼워 넣었다가 장애가 날까 봐 두려울 때.
- 로컬 개발 중 '임시'로 연결만 확인하고 싶을 때: 네트워크 설계고 뭐고, 일단 지금 당장 호스트 포트로 뚫려 있는 서비스에 요청이 가는지 확인부터 해야 할 때.
이럴 때 유용한 치트키가 바로 host.docker.internal입니다.

해결책 : "컨테이너 밖 세상을 보는 창" host.docker.internal
컨테이너 안에서 127.0.0.1을 외쳐봐야 자기 자신(컨테이너)만 보일 뿐입니다. 이때 host.docker.internal이라는 특수 도메인을 사용하면 컨테이너 벽을 뚫고 호스트 머신의 IP를 찾아냅니다.
파이썬(DRF) 코드 예시:
# 'localhost' 대신 'host.docker.internal'을 써서 호스트 포트로 나갑니다.
# App-B가 호스트의 8080 포트에 바인딩되어 있다면 아래와 같이 호출합니다.
NEXTCLOUD_URL = "http://host.docker.internal:8080"
response = requests.get(NEXTCLOUD_URL)
⚠️ Linux 유저라면 '수동 설정'이 필수입니다
Docker Desktop(Mac/Windows)은 이게 기본으로 되지만, 순수 리눅스 서버에서는 Docker가 이 도메인을 자동으로 잡아주지 않습니다. 빌드나 실행 시 "이 도메인은 호스트 IP를 뜻해"라고 명시해줘야 합니다.
Docker Compose 설정 예시:
services:
drf-app:
image: my-drf-app-image
extra_hosts:
# host.docker.internal이라는 이름으로 호스트 게이트웨이에 접근하겠다는 선언
- "host.docker.internal:host-gateway"
언제나 정답은 아닙니다
다시 한번 강조하지만, 이 방식은 최후의 수단에 가깝습니다.
- 가장 좋은 방법: 공용 브릿지 네트워크를 만들고 컨테이너 이름으로 통신하기 (보안상 가장 안전).
- 이 방법을 쓰는 이유: 호스트에 직접 띄운 프로세스에 접근해야 하거나, 네트워크 구조를 도저히 합칠 수 없는 '고립된' 환경일 때.
작년에 적어둔 이 '비상구' 사용법은 정석이 막혔을 때 꺼내 쓰는 히든 카드로만 활용해 보세요!
댓글이 없습니다.