ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 네트워크
    Docker 2025. 7. 1. 17:36

    도커 네트워킹(Docker Networking)


    - 컨테이너 간의 통신 및 컨테이너와 외부와의 네트워크 연결을 관리하는 핵심 개념
    - 도커를 사용한 현대적인 애플리케이션 배포 및 관리에서 필수적인 역할을 수행함
    - 독립된 환경(컨테이너화된 애플리케이션) 간 서로 통신할 수 있어야함

     

    도커 네트워크(Docker Network)

     

    도커 컨테이너는 내부 IP를 순차적으로 할당하며, 이 IP는 컨테이너를 재시작 할 때 마다 변경될 수 있다.
    이 내부 IP는 도커가 설치된 호스트, 즉 내부 망에서만 쓸 수 있는 IP 이므로 외부와 연결될 필요가 있다.
    이 과정은 컨테이너를 시작할 때마다 호스트에 veth..라는 네트워크 인터페이스를 생성함으로써 이뤄진다.
    도커는 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너 마다 가상 네트워크 인터페이스를 호스트에 생성하며 이 인터페이스의 이름은 veth(virtual eth) 로 시작한다.
    veth 인터페이스는 사용자가 직접 생성할 필요는 없으며 컨테이너가 가상화 될 때 도커 엔진이 자동으로 생성한다.

    도커가 설치된 호스트에서 ifconfig나 ip addr과 같은 명령어로 네트워크 인터페이스를 확인하면 실행 중인 컨테이너 수만큼 veth로 시작하는 인터페이스가 생성된 것을 알 수 있다.

     

    --network=host를 사용할 경우

    • 컨테이너는 호스트 네트워크 네임스페이스를 그대로 공유
    • 별도 네임스페이스, 별도 veth 쌍이 필요 없음 → veth가 생성되지 않음


    eth0(enp0s3)은 공인 IP 또는 내부 IP가 할당되어 실제로 외부와 통신할 수 있는 호스트의 네트워크 인터페이스
    최근 리눅스 배포판에서는 eth0 대신 enp0s3, enp0s8 같은 새로운 방식의 인터페이스 이름을 사용
    veth로 시작하는 인터페이스는 컨테이너를 시작할 때 생성되었으며 각 컨테이너의 eth0과 연결


    veth 인터페이스 뿐 아니라 docker0이라는 브리지도 존재하는 데 docekr0 브리지는 각 veth 인터페이스와 바인딩돼 호스트 eth0(enp0s3) 인터페이스와 이어주는 역할을 한다.
    정리하면 컨테이너의 eth0 인터페이스는 호스트의 veth... 라는 인터페이스와 연결됐으며 veth 인터페이스는 docker0 브리지와 바인딩돼 외부와 통신할 수 있다.



    도커 컨테이너와 호스트 간의 네트워크 연결 구조

    Docker 네트워크 구조 (기본 브리지 모드 기준)

    [도커 컨테이너]
     ├── lo           ← 루프백 (자기 자신)
     └── eth0         ← 컨테이너 내부 네트워크 인터페이스
          │
          ▼
      [vethXXX]       ← 호스트에 생성된 가상 인터페이스 (컨테이너 eth0과 쌍)
          │
          ▼
      [docker0]       ← 호스트에 있는 브리지 네트워크
          │
          ▼
      [호스트의 외부 NIC]
       ├─ enp0s3       ← NAT 네트워크 (VirtualBox에서 기본 생성)
       └─ enp0s8       ← 브리지 어댑터 (로컬 공유기에서 IP 받음)
    
    • eth0: 컨테이너 내부 네트워크 인터페이스 (컨테이너 입장에선 메인 인터페이스)
    • vethXXX: eth0과 연결된 호스트 쪽 가상 인터페이스
    • docker0: 기본 도커 브리지, veth들이 여기에 연결됨
    • enp0s3: VirtualBox가 만든 NAT 인터페이스 (10.0.2.x)
    • enp0s8: 브리지 모드에서 물리적 NIC처럼 작동 (192.168.x.x)

    컨테이너를 생성하면 기본적으로 docker0 브리지를 통해 외부와 통신할 수 있는 환경을 사용할 수 있지만 사용자의 선택에 따라 여러 네트워크 드라이버를 쓸 수 있다.
    도커가 자체적으로 제공하는 대표적인 네트워크 드라이버로는 브리지, 호스트, none, 컨테이너, 오버레이가 있다.
    브리지 네트워크는 컨테이너를 생성할 때 자동으로 연결되는 docker0 브리지를 활용하도록 설정되어있다.
    이 네트워크는 172.17.0.X IP 대역을 컨테이너에 순차적으로 할당한다.

    # 네트워크 목록 확인
    docker network ls

    # 네트워크 상세 정보 확인
    docker network inspect [네트워크]

     

    브리지 네트워크 

    도커 엔진 내부에서 컨테이너 간 통신을 위한 기본 네트워크

    기본적으로 컨테이너 간 통신을 허용하고 IP 주소를 할당함
    브리지 네트워크는 docker0이 아닌 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조이다.
    컨테이너는 연결된 브리지를 통해 외부와 통신할 수 있다. 

     

    아무런 설정을 하지 않고 컨테이너를 생성하면 자동으로 docker0 브리지를 사용한다.

    • 네트워크 연결 / 해제
    • 브리지 네트워크와 오버레이 네트워크와 같이 특정 IP 대역을 갖는 네트워크 모드에만 이 명령어를 사용할 수 있다.
    # 네트워크 연결
    docker network connect [네트워크] [컨테이너]

    # 네트워크 연결 해제
    docker network disconnet [네트워크] [컨테이너]

     

    • 도커 브리지 네트워크 생성

    • bridge-network를 사용하는 nginx 컨테이너 생성
    • docker run -d --network brige-network --name container1 nginx 
    • -p 옵션으로 포트 매핑을 하지 않으면 외부(호스트 또는 인터넷) 접속 불가

    포트 매핑

    컨테이너 내부 포트와 호스트 머신의 포트를 매핑하여 외부에서 컨테이너에 접근할 수 있게 하는 기능
    -p 옵션 사용 : 포트 매핑을 설정

    • docker network inspect brige-network

    • docker exec -it container1 /bin/bash : 컨테이너 내부 접속


    호스트 네트워크 

    네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 쓸 수 있다.
    컨테이너의 네트워크를 호스트 모드로 설정하면 컨테이너 내부의 애플리케이션을 별도의 포트포워딩 없이 바로 서비스 할 수 있다.

    호스트 네트워크를 사용하는 컨테이너라도 NAT 모드라면 127.0.0.1 접속 시 반드시 포트포워딩 필요,
    브리지 모드에선 192.168.x.x IP로 바로 접속 가능하다!

    • 브리지 어댑터

    • NAT(Virtual Box 포트 포워딩 필요)

    • 네트워크 상태 확인을 위해 컨테이너 내부에 net-tools 설치

    • 컨테이너 내부에서 ifconfig를 치면 호스트와 똑같은 네트워크 인터페이스가 그대로 보인다.

    • 호스트

    •  리눅스 네트워크 상태를 확인하는 명령어 : ifconfig 와 ip addr 의 차이
    항목 ifconfig ip addr (ip a)
    사용 여부 구버전 도구 (Deprecated) 신버전 도구 (현재 표준)
    패키지 net-tools iproute2
    설치 여부 최신 OS에선 기본 미설치 대부분 기본 설치됨
    기능 범위 기본적인 IP/인터페이스 확인만 가능 훨씬 많은 정보 제공 (link 상태, scope 등)
    세부 제어 제한적 매우 세밀한 제어 가능 (route, link 등)

     

    host 네트워크를 사용하는 nginx 컨테이너 생성(-p 옵션을 사용하지 않아도 된다)

    • -p 옵션 없이도 호스트 포트에 직접 바인딩되므로, 외부에서 접속 가능 (포트 충돌 주의)
    • docker run -d --network host --name container3 nginx 

    • 80 포트 포트 포워딩

     

    논(none) 네트워크

    네트워크를 쓰지 않는 것 외부와의 연결이 단절된다.

     

    오버레이 네트워크

    여러 호스트에서 컨테이너 간 통신을 지원하기 위해 사용되며 가상 네트워크를 생성하여 컨테이너를 연결한다.


    • ss -tnlp | grep :80 : 어떤 프로세스가 80 포트를 사용 중 인지 확인

    • iptables -t nat -L -n : NAT(Network Address Translation) 규칙 확인

     

    참고

    시작하세요! 도커/쿠버네티스 및 ChatGPT

    'Docker' 카테고리의 다른 글

    docker 설치 - Rocky Linux8  (0) 2025.06.25
Designed by Tistory.