[Docker] 3. Docker Network
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 지원
- 즉, Docker Compose 네트워크의 원리
0.1 Docker0

항목 | 설명 |
생성 시점 | :: 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


구분 | 특징 |
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)를 생성 및 연결
- Default Bridge
:: 기본적으로 제공되는 Bridge 네트워크
:: 따로 설정하지 않으면 해당을 사용
:: 컨테이너간 Automatic DNS Resolution 제공 X
=> 기본 네트워크에서 실행되는 컨테이너들은 자동 DNS 해결이나 이름을 사용한 네트워크 연결 X - User-defined Bridge
:: 사용자가 명시적으로 설정한 Bridge 네트워크
:: 개발자가 네트워크를 명시적으로 정의하여 컨테이너 간의 연결을 구성
:: 컨테이너간 Automatic DNS Resolution 제공 O
=> 자동 DNS 해결 기능을 제공, 같은 네트워크에 있는 컨테이너들은 컨테이너 이름을 통해 서로 통신 가능
// 사용자 정의 브리지 네트워크 생성
docker network create --driver bridge my_custom_network

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