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 ...

연결 노트