정리용/Docker

[Docker] 3. Docker Network

hee-ya07 2025. 2. 21. 21:38

0. Docker Network

:: 컨테이너 생성 시, 컨테이너는 NET namespace를 통해 구현된 가상화 기법으로 각각 독립된 네트워크 공간 할당

:: 이때, 기본적으로 외부와 통신이 불가능한 상태

:: 컨테이너의 포트를 노출(expose)해서 외부와 연결이 필요

  • Docker Network는 다중 컨테이너 간의 네트워크 연결을 처리
    • 즉, Docker Compose 네트워크의 원리
      :: Linux의 IP Tables 기반 네트워크를 사용하여 컨테이너 연결
      :: 가상 브릿지 / L2 Switch(Docker0)를 중심으로
      ==> 내부 :: 가상 / 물리 NIC 연결
      ==> 외부 :: NAPT(Network Address Port Translation) or IP Masquerade 지원

0.1 Docker0

출처 : https://yoo11052.tistory.com/208

항목 설명
생성 시점 :: Docker의 실행 시, Docker Daemon에 의해 docker0 자동 생성
역할 :: 컨테이너 - 호스트 사이의 연결을 관리하는 가상의 브릿지 네트워크 인터페이스
=> 가상의 리눅스 브릿지(Virtual Linux Bridge) 네트워크
ip 주소 :: 생성 시, 내부의 IP 대역을 할당 받음
host와의 통신 :: 호스트의 eth0과 연결 - 이를 통해 외부와 통신 가능
container와의 통신 :: 동일한 Docker 브릿지 네트워크 간의 컨테이너끼리는 doker0을 통해 통신 가능(가교 역할)
  • veth(Virtual ethernet)
    :: 컨테이너에서 docker0과 동신하기 위한 가상의 네트워크 장치 사용
    :: veth 쌍
    - 한쪽 끝은 컨테이너의 eth0 인터페이스에 바인딩
    - 다른 끝은 docker0 네트워크에 바인딩

0.2 NAT, NAPT, Port Forwarding

출처: https://8iggy.tistory.com/249

구분 특징
1. NAT(Network Address Translation) :: 1개의 외부 IP 주소로 내부망 구성
:: 공용 IP주소와 사설 IP주소 간의 변환을 통해 여러 장비가 하나의 IP 공유
:: 호스트 구별 불가
1-1. IP Masquerade :: NAT 응용편이지만, Docker에서는 NAPT 방식으로 구현됨
:: 내부의 여러 클라이언트가 단일 공용 IP를 이용해 외부와 통신
:: 여러 컨테이너가 하나의 공인 IP와 다양한 포트 번호를 이용해 외부와 통신
2. NAPT(Network Address Port Translation) :: 1개의 외부 IP 주소  포트 번호로 내부망 구성, 호스트 구별
3. Port Forwarding :: NAPT에서 port의 번호를 Dynamic NAT가 아닌 고정 포트를 사용

1. Docker Network - Bridge와 Host 옵션

  • 컨테이너 간의 소통을 위한 옵션
    - 자주 쓰이는 것 :: Bridge와 Host
    - 이외에도 :: Overlay, IPvlan, Macvlan, None 등
더보기

# Docker Network 드라이버 종류

  • bridge
    :: 기본 네트워크 드라이버.
    :: 동일 호스트 내의 컨테이너들 간의 네트워크 연결을 처리

  • host
    :: 컨테이너가 호스트의 네트워크 네임스페이스를 공유
    :: 외부와의 연결을 처리

  • overlay
    :: 여러 호스트에서 실행 중인 컨테이너들 간의 네트워크 연결을 처리
    :: Docker Swarm을 사용할 때 많이 사용

1.1 Bridge 옵션

:: Bridge 네트워크는 Docker 컨테이너들의 동일 호스트(=동일 인스턴스) 내 소통을 지원

:: 기본 네트워크 옵션으로 사용

:: Docker 컨테이너 간의 네트워크 연결을 위해 가상 네트워크 브리지(Ex: docker0)를 생성 및 연결

  1. Default Bridge
    :: 기본적으로 제공되는 Bridge 네트워크
    :: 따로 설정하지 않으면 해당을 사용
    :: 컨테이너간 Automatic DNS Resolution 제공 X
        => 기본 네트워크에서 실행되는 컨테이너들은 자동 DNS 해결이나 이름을 사용한 네트워크 연결 X

  2. User-defined Bridge
    :: 사용자가 명시적으로 설정한 Bridge 네트워크
    :: 개발자가 네트워크를 명시적으로 정의하여 컨테이너 간의 연결을 구성
    :: 컨테이너간 Automatic DNS Resolution 제공 O
        => 자동 DNS 해결 기능을 제공, 같은 네트워크에 있는 컨테이너들은 컨테이너 이름을 통해 서로 통신 가능
// 사용자 정의 브리지 네트워크 생성
docker network create --driver bridge my_custom_network
더보기

출처 : ASAC 수업자료

docker-compose.yml 파일 내 ports: 옵션만 준 경우 Spring 에서 MySQL 사용 시 어떤 포트 사용하나?

 

  • Docker Bridge Network 사용 시 Automatic DNS Resolution 미제공
    -> 아래의 옵션을 사용하여 Automatic DNS Resolution 설정 가능

1) User-defined Bridge 방법

:: 도커가 자동 제공해주는 Automatic DNS Resolution 사용

// 가장 먼저 Bridge 네트워크를 정의하고 (User-defined)
networks:
  x-network:
    driver: bridge
//  다음에 해당 브릿지 네트워크를 공유하여 사용하고자하는 컨테이너들에 연결
version: "3"
services:
  postgres:
    container_name: postgres_host
    image: postgres:15
    ports:
      - 5432:5432
    networks:
      - x-network
    environment:
      POSTGRES_DB: tutorial
      POSTGRES_USER: "user"
      POSTGRES_PASSWORD: "!@#"

  docker_tutorial:
    build: .
    ports:
      - 8080:8080
    networks:
      - x-network
    environment:
      # export SPRING_PROFILE=develop
      # SPRING_PROFILE: ${SPRING_PROFILE}
      SPRING_PROFILE: ${SPRING_PROFILE}
    depends_on:
      - postgres

 

2) Hostname 방법

:: 명시적으로 DNS 내 컨테이너의 hostname 등록하기

//  컨테이너마다 hostname 정의 
version: "3"
services:
  postgres:
    container_name: postgres_host
    hostname: postgres_host
    image: postgres:15
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: tutorial
      POSTGRES_USER: "user"
      POSTGRES_PASSWORD: "!@#"

  docker_tutorial:
    build: .
    ports:
      - 8080:8080
    environment:
      # export SPRING_PROFILE=develop
      # SPRING_PROFILE: ${SPRING_PROFILE}
      SPRING_PROFILE: ${SPRING_PROFILE}
    depends_on:
      - postgres

1.2 Host 옵션

:: Host 네트워크는 컨테이너와 호스트 시스템이 동일한 네트워크를 공유하는 방식

:: 컨테이너의 네트워크가 호스트의 네트워크와 격리 X =>컨테이너가 호스트의 네트워크를 직접 사용

:: 호스트와 동일한 네트워크 인터페이스를 사용 => 컨테이너 외부 IP와 호스트 외부 IP가 동일

// 적용 방법
docker run --network host my_container

 

- Docker Compose의 경우

// Linux에서만 지원
services:
  my_service:
    image: my_image
    network_mode: "host" // 미지원 시, Hostname을 사용

 


참고

ASAC 수업자료

 

 

[Docker] 도커 네트워킹과 docker0

목차  대부분의 애플리케이션들은 다른 시스템과 네트워킹하며 실행되는 경우가 많습니다.이번 포스팅에선 컨테이너가 외부와 어떻게 통신하는지 알아보겠습니다. 1. 외부에서 컨테이너에

cloudwithbass.tistory.com

 

 

 

[Docker] Docker Network (docker0와 veth)

Docker Network 컨테이너를 생성하게 되면 컨테이너는 NET namespace라는 기술을 통해 구현된 가상화 기법을 사용하여 각자 독립된 네트워크 공간을 할당 받습니다. 그렇다면 이 독립된 네트워크 공간

yoo11052.tistory.com