Docker 네트워크
1️⃣ 컨테이너의 외부 통신
✅ 외부 웹 API 통신
-
컨테이너는 기본적으로 인터넷에 나갈 수 있습니다.
-
예시:
fetch("https://some-api.com")
✅ 호스트 머신의 로컬 서비스 통신
-
localhost
는 컨테이너 내부 자신을 의미하므로 사용 불가. -
해결책:
// 호스트 머신의 MongoDB에 연결 mongoose.connect("mongodb://host.docker.internal:27017/mydb");
host.docker.internal은
- macOS / Windows: 기본 지원
- Linux: 수동 네트워크 설정 필요
2️⃣ 컨테이너 간 통신
방법 1: IP 주소 직접 연결 (⛔ 추천하지 않음)
-
MongoDB 컨테이너 실행
docker run -d --name mongodb mongo
-
IP 확인
docker container inspect mongodb # 컨테이너 IP : 172.17.0.3 { ... "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "MacAddress": "e2:87:be:90:35:f0", "DriverOpts": null, "GwPriority": 0, "NetworkID": "7f0e1fb74cc8c7d8a8a2fdd52f694a645a4f030f24536bb78290217c831e1c0e", "EndpointID": "ce712afd3aad3e073cfbb7390af7c5360f722dd3ea8b3945706962f1cd937285", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "DNSNames": null } ... }
-
코드에 IP 하드코딩
mongoose.connect("mongodb://172.17.0.3:27017/mydb");
⚠️ 단점
- IP가 컨테이너 재시작 시 바뀔 수 있습니다.
- 이미지 수정 & 재빌드 필요
방법 2: 도커 네트워크 사용 (추천)
- 컨테이너는 기본적으로 서로 고립되어 있습니다.
- 같은 네트워크에 넣으면 컨테이너 이름으로 통신 가능
🛠 컨테이너 네트워크 만들기 & 적용하기
1. 네트워크 생성
docker network create favorites-net
2. MongoDB 컨테이너 실행
docker run -d --name mongodb --network favorites-net mongo
3. Node.js 앱 컨테이너 실행
docker run -d --name favorites --rm \
--network favorites-net \
-p 3000:3000 favorites-node
4. Node.js 코드 수정
mongoose.connect("mongodb://mongodb:27017/mydb");
“mongodb”는 컨테이너 이름
도커가 내부 DNS로 IP 자동 매핑
✅ 결과 확인
GET http://localhost:3000/favorites
→ 빈 배열 응답 ✅POST /favorites
→ 데이터 저장 ✅- 다시
GET
→ 저장한 데이터 확인 ✅
⚠️ 포트 노출 (-p) 정리
상황 | -p 필요 여부 | 이유 |
---|---|---|
호스트 → 컨테이너 접근 | 필요 ✅ | 외부 노출 |
컨테이너 → 컨테이너 접근 (같은 네트워크) | 불필요 ❌ | 내부에서 직접 통신 가능 |
정리 요약 테이블
항목 | 요약 |
---|---|
컨테이너 간 통신 조건 | 동일 네트워크에 있어야 함 |
네트워크 생성 | docker network create <name> |
코드 내 접속 주소 | 컨테이너 이름 사용 가능 (mongodb ) |
포트 노출 | 외부 접근 시에만 필요 |
Docker는 어떻게 컨테이너 이름을 IP로 바꿔줄까?
대표적인 예:
host.docker.internal
→ 호스트 머신의 IP 주소로 자동 변환- 컨테이너 이름 (예:
mongodb
) → 해당 컨테이너의 IP 주소로 자동 변환
도커는 소스 코드를 절대 읽지 않습니다
도커가 mongoose.connect("mongodb://mongodb:27017")
같은 코드를 “읽고”, “변경해서”, IP로 바꾸는 건 아닙니다.
도커는 코드를 해석하거나 수정하지 않습니다.
대신, 도커는 컨테이너가 네트워크 요청을 보낼 때,
그 요청의 도메인 이름을 감지하고,
자신이 관리하는 네트워크 내에서 자동으로 이름을 IP로 매핑해주는 거죠.
도커 내부 네트워크 처리 과정
- 컨테이너가 시작됨
- 도커 네트워크(예:
favorites-net
)에 연결됨 - 도커는 내부 DNS 서버를 실행
- 컨테이너가
mongodb
로 요청을 보냄 - 도커가 해당 이름을 가진 컨테이너를 찾고 → 그 IP 주소를 반환
[mongoose] --> "mongodb" --> Docker DNS --> 172.17.0.3
결과적으로, 소스 코드에는 문자열 "mongodb"
가 그대로 있지만,
애플리케이션이 실제로 네트워크 요청을 보낼 때,
도커가 해당 이름을 IP로 바꿔주는 겁니다.
도커 네트워크 필요 조건
- 두 컨테이너가 같은 도커 네트워크에 있어야 함
- DNS 변환은 컨테이너 내부에서 발생
host.docker.internal
은 컨테이너 → 호스트 통신용 특수 주소
본 문서는 Udemy 강의: Docker & Kubernetes : 실전 가이드 의 내용을 바탕으로 학습한 내용을 정리한 것입니다.
Last updated on