Skip to Content
Sunbeen's Blog
DocumentsDockerDocker 네트워크

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 주소 직접 연결 (⛔ 추천하지 않음)

  1. MongoDB 컨테이너 실행

    docker run -d --name mongodb mongo
  2. 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 } ... }
  3. 코드에 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로 매핑해주는 거죠.

도커 내부 네트워크 처리 과정

  1. 컨테이너가 시작됨
  2. 도커 네트워크(예: favorites-net)에 연결됨
  3. 도커는 내부 DNS 서버를 실행
  4. 컨테이너가 mongodb로 요청을 보냄
  5. 도커가 해당 이름을 가진 컨테이너를 찾고 → 그 IP 주소를 반환
[mongoose] --> "mongodb" --> Docker DNS --> 172.17.0.3

결과적으로, 소스 코드에는 문자열 "mongodb"가 그대로 있지만,

애플리케이션이 실제로 네트워크 요청을 보낼 때,

도커가 해당 이름을 IP로 바꿔주는 겁니다.

도커 네트워크 필요 조건

  • 두 컨테이너가 같은 도커 네트워크에 있어야 함
  • DNS 변환은 컨테이너 내부에서 발생
  • host.docker.internal컨테이너 → 호스트 통신용 특수 주소

본 문서는 Udemy 강의: Docker & Kubernetes : 실전 가이드의 내용을 바탕으로 학습한 내용을 정리한 것입니다.

Last updated on