Docker 네트워크
| topics | 400-인프라 & 아키텍처 |
| types | 실습 |
Docker는 호스트 안에 가상 네트워크를 만든다. 호스트가 공유기 역할, 컨테이너들이 그 아래 기기.
네트워크 구조
graph TB
subgraph 호스트
eth0[eth0: 192.168.0.10]
docker0[docker0: 172.17.0.1]
subgraph 컨테이너들
c1[컨테이너A: 172.17.0.2]
c2[컨테이너B: 172.17.0.3]
c3[컨테이너C: 172.17.0.4]
end
docker0 --- c1
docker0 --- c2
docker0 --- c3
end
외부 --> eth0
eth0 --> docker0
docker0 브릿지
# <span id="확인"></span>확인
ip addr | grep docker0
docker network inspect bridge | grep Gateway
- 보통
172.17.0.1 - 커스텀 네트워크 만들면
172.18.0.1,172.19.0.1등으로 증가 - 프로세스가 아니라 커널 인터페이스 (별도 PID 없음)
veth pair
Virtual Ethernet. 가상 네트워크 케이블. 항상 쌍으로 존재.
호스트 컨테이너
│ │
veth123 ◄───────────────► eth0
│
docker0 브릿지
- 한쪽에 패킷 넣으면 다른 쪽에서 나옴
- 물리적 케이블 없이 커널이 소프트웨어로 패킷 전달
# <span id="호스트에서-확인"></span>호스트에서 확인
ip link | grep veth
외부 접근이 안 되는 이유
172.17.0.x는 사설 IP 대역.
- 호스트 내부에만 존재
- 외부에서
172.17.0.2로 직접 접근 불가능 - 라우터도 이 주소를 모름
비유
인터넷 ─── 공유기 (192.168.0.1) ─── 내 PC (192.168.0.10)
│
docker0 (172.17.0.1)
│
컨테이너 (172.17.0.2)
컨테이너는 "내 PC 안의 또 다른 사설 네트워크"에 있음.
포트 매핑 (-p)
외부 접근하려면 필수.
docker run -p 8080:80 nginx
# <span id="-"></span>↑ ↑
# <span id="호스트-컨테이너"></span>호스트 컨테이너
외부 → 호스트:8080 → (iptables NAT) → 172.17.0.2:80
가상 네트워크 ≠ 포트 매핑
| 개념 | 설명 |
|---|---|
| 가상 네트워크 | 커널이 만든 가상 인터페이스 (docker0) |
| 포트 매핑 (-p) | iptables로 트래픽 포워딩 |
둘은 다른 레이어.
host.docker.internal
컨테이너에서 호스트 서비스 접근할 때 사용.
# <span id="mysql이-호스트-1270013306에-열려있어도"></span>MySQL이 호스트 127.0.0.1:3306에 열려있어도
mysql -h host.docker.internal -P 3306 -u root -p
| 환경 | 지원 |
|---|---|
| Mac/Windows | 기본 지원 |
| Linux | 수동 추가 필요 |
# <span id="linux에서-추가"></span>Linux에서 추가
docker run --add-host=host.docker.internal:host-gateway ...