![[Docker] 도커 네트워크](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJC47W%2FbtsJuX53clH%2FkJyYICMih3ucXlk5gmx770%2Fimg.webp)
[Docker] 도커 네트워크DevOps/Docker2025. 5. 16. 12:46
Table of Contents
이 글은 인프런의 개발자를 위한 쉬운도커(데브위키) 강의를 수강하고 개인적으로 정리하는 글임을 알립니다.
도커 네트워크
가상 네트워크
Docker는 컨테이너 간의 통신을 관리하기 위해 가상 네트워크를 사용하며, 기본적으로 브리지 네트워크(bridge network)를 통해 각 컨테이너에 IP 주소를 할당하고 통신할 수 있도록 한다.
- Docker는 가상 네트워크(브리지)를 통해 각 컨테이너에 고유한 IP를 할당하고, 컨테이너 간의 통신을 관리한다.
- 브리지 네트워크를 통해 컨테이너 간에 직접적인 통신이 가능하며, 외부 네트워크와 통신할 때는 NAT를 사용해 공인 IP와 사설 IP를 변환한다.
- Docker 네트워크를 사용하면, 각 컨테이너가 독립적인 네트워크 환경에서 동작하면서도 필요한 경우 외부 네트워크와 통신할 수 있다.
가상 네트워크 브리지 (docker0)
- Docker는 기본적으로 가상 브리지 네트워크를 생성한다. 이 브리지 네트워크는 컨테이너들이 같은 네트워크 안에서 서로 통신할 수 있도록 해준다.
- 그림에서는 docker0이라는 가상 네트워크 인터페이스가 생성되어 있으며, 이 브리지를 통해 각 컨테이너들이 서로 연결된다.
가상의 IP 할당
- Docker는 각 컨테이너에 고유한 IP 주소를 할당한다. 이 IP 주소는 Docker가 생성한 브리지 네트워크 내에서만 유효하며, 기본적으로 172.17.0.x 대역을 사용한다.
- 예시로 컨테이너1은 172.17.0.2, 컨테이너2는 172.17.0.3 등의 IP 주소를 할당받아 서로 독립적으로 동작하지만, 동일한 브리지 네트워크 안에 있기 때문에 서로 통신할 수 있다.
컨테이너 간 통신
- 동일한 브리지 네트워크에 속해 있는 컨테이너들끼리는 할당된 IP 주소를 통해 직접 통신할 수 있다. 그림에서 컨테이너1은 컨테이너2와 같은 네트워크 내에 있기 때문에 172.17.0.x 대역을 통해 서로 데이터를 주고받을 수 있다.
- 외부 네트워크(공인망이나 사설망)와의 통신이 필요하다면, Docker가 IP 마스커레이딩(NAT)을 통해 외부와 통신할 수 있도록 한다.
외부 네트워크와의 연결
- 서버(실습용 PC)의 192.168.0.10 IP는 내부 네트워크에서 할당된 IP이며, 이 서버에 설치된 Docker 컨테이너들은 외부 네트워크로의 접속이 필요할 때 192.168.0.10 또는 공인 IP 124.111.46.91을 통해 외부와 통신하게 된다.
- 이때 Docker의 NAT 기능이 활용되어, 컨테이너의 내부 IP와 외부 IP 간의 변환을 통해 외부와의 통신이 이루어진다.
주요 동작 과정
- 가상의 네트워크 브리지 생성: Docker는 기본적으로 docker0이라는 브리지를 자동으로 생성하여, 각 컨테이너가 이 브리지 네트워크에 연결되도록 한다.
- 컨테이너에 가상 IP 할당: 브리지 네트워크에 연결된 각 컨테이너는 172.17.0.x 대역의 IP 주소를 할당받는다. 이 IP 주소는 컨테이너 간 통신을 가능하게 한다.
- 컨테이너 간의 통신 전달: 같은 브리지 네트워크에 속해 있는 컨테이너끼리는 IP 주소를 통해 서로 통신할 수 있다. 외부 네트워크와 통신할 경우 NAT를 통해 IP 주소를 변환하여 외부와 연결한다.
가상 네트워크와 가상 인터페이스
- 기본적으로 각 브릿지 네트워크는 서로 격리되어 있다. 즉, 서로 다른 브릿지 네트워크에 속한 컨테이너들은 직접적으로 통신할 수 없다.
- docker0 브릿지 네트워크는 Docker 컨테이너 간의 통신을 위한 가상 네트워크를 제공하며, 각 컨테이너는 가상 인터페이스(Veth)를 통해 연결된다.
- Veth 인터페이스는 각 컨테이너에 고유한 IP를 할당하고, 이 인터페이스를 통해 트래픽을 주고받는다.
- Docker가 자동으로 iptables를 수정하여, 컨테이너 간 통신이나 외부 네트워크로의 트래픽 흐름을 제어한다.
- 물리적 인터페이스인 eth0는 외부 네트워크와 연결되며, Docker 컨테이너가 외부 네트워크와 통신할 때 사용된다.
브릿지 네트워크 (docker0)
- docker0는 Docker가 기본적으로 생성하는 가상 브리지 네트워크이다. Docker는 이 네트워크를 통해 모든 컨테이너들이 서로 연결될 수 있도록 한다.
- Docker는 기본적으로 docker0이라는 브릿지 네트워크를 생성하며, 모든 컨테이너는 이 기본 브릿지 네트워크에 속하게 된다. 하지만, 사용자가 새로운 브릿지 네트워크를 생성하여 특정 컨테이너들을 격리할 수 있다. 이러한 경우, 각각의 브릿지 네트워크는 독립적으로 작동하며, 그 안에 속한 컨테이너끼리만 통신이 가능하다.
- IP 주소: docker0의 IP는 172.17.0.1로 설정되어 있으며, 이는 가상 네트워크 안에서 컨테이너들과 통신할 때 사용된다.
가상 인터페이스 (Veth 인터페이스)
- Veth(Virtual Ethernet)는 각 컨테이너와 호스트 머신 간에 가상 네트워크 인터페이스를 제공하는 장치이다. 그림에서 각 컨테이너는 Veth 인터페이스를 통해 호스트 머신의 docker0와 연결된다.
- 예를 들어, 컨테이너1은 Veth1(172.17.0.2), 컨테이너2는 Veth2(172.17.0.3)로 연결된다. 각 컨테이너가 브리지 네트워크를 통해 독립적으로 통신할 수 있도록 Veth 인터페이스가 만들어진다.
- Veth 인터페이스는 페어로 구성되며, 한 쪽은 컨테이너 내부에, 다른 쪽은 호스트 머신에 존재한다.
물리 인터페이스 (eth0)
- eth0는 실제 물리적 네트워크 인터페이스로, 호스트 머신(서버)이 외부 네트워크와 연결되기 위해 사용하는 인터페이스이다.
- 호스트 머신의 IP는 192.168.0.10으로 설정되어 있으며, 이 IP를 통해 물리적으로 외부 네트워크와 통신한다.
iptables
- iptables는 Linux 시스템에서 네트워크 트래픽을 관리하고 제어하는 방화벽 역할을 하는 도구이다. Docker는 iptables 규칙을 자동으로 생성하여, 컨테이너 간의 통신과 외부 네트워크와의 트래픽 흐름을 제어한다.
- Docker가 생성하는 규칙은 Veth 인터페이스를 통해 흐르는 트래픽을 제어하며, 이를 통해 네트워크 보안을 유지하거나 특정 통신을 차단할 수 있다.
트래픽 흐름 및 제어
- 각 컨테이너는 가상 인터페이스를 통해 docker0 브릿지에 연결되고, 외부 네트워크와 연결되려면 물리적 인터페이스인 eth0를 통해 통신한다.
- 컨테이너1 (172.17.0.2)과 같은 컨테이너는 Veth1을 통해 네트워크에 연결되고, 다른 컨테이너나 외부와 통신할 때 iptables 규칙을 따르게 된다.
도커 네트워크 관련 명령어
# 네트워크 리스트 조회
docker network ls
# 네트워크 상세 정보 조회
docker network inspect 네트워크명
# 네트워크 생성
docker network create 네트워크명
# 네트워크 삭제
docker network rm 네트워크명
# 호스트OS의 포트와 컨테이너의 포트 연결 (포트 포워딩)
docker run -p 호스트OS의포트:컨테이너의포트 이미지명
가상 네트워크와 DNS
- 기본 브리지 네트워크에서는 DNS 기능이 제공되지 않으며, 컨테이너들은 IP 주소로만 통신할 수 있다.
- 커스텀 브리지 네트워크(second-bridge)에서는 Docker DNS를 통해 도메인 이름으로 통신이 가능하다. 이로 인해 컨테이너 간 통신이 더 쉽고 직관적으로 이루어진다.
- Docker DNS는 도메인 이름을 IP 주소로 변환해주며, 이를 통해 컨테이너 간에 IP 주소 대신 컨테이너 이름으로 쉽게 접근할 수 있다.
브리지 네트워크
- 브리지 네트워크(Bridge)는 Docker에서 기본적으로 제공하는 네트워크로, 각 컨테이너가 가상 네트워크에 연결되어 동일한 네트워크 내에서 통신할 수 있게 한다.
- 그림에서 기본 브리지 네트워크는 DNS 기능이 제공되지 않는다. 즉, 기본 브리지 네트워크에 있는 컨테이너는 IP 주소로만 서로 통신할 수 있으며, 도메인 이름을 사용한 통신이 불가능하다.
second-bridge 네트워크
- second-bridge는 사용자가 정의한 커스텀 브리지 네트워크이다. 이 네트워크에서는 Docker DNS를 사용하여 컨테이너들의 이름을 통해 통신할 수 있다.
- 그림에서는 containerA와 containerB가 이 커스텀 브리지 네트워크에 연결되어 있으며, 각각의 컨테이너에 IP 주소가 할당되어 있다. containerA는 10.0.0.2, containerB는 10.0.0.3의 IP 주소를 가진다.
Docker DNS
- Docker는 기본적으로 커스텀 네트워크에서는 내장된 DNS 서비스를 제공한다. 이를 통해 컨테이너들은 서로를 IP 주소 대신 컨테이너 이름으로 접근할 수 있다.
- 예를 들어, containerA는 containerB의 IP 주소(10.0.0.3)를 직접 사용할 필요 없이, 도메인 이름 containerB를 사용해 통신할 수 있다.
- Docker DNS의 IP는 127.0.0.11로 설정되어 있으며, 이 주소를 통해 도메인 이름을 IP 주소로 변환해준다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker Compose (0) | 2025.05.16 |
---|---|
[Docker] 컨테이너 리소스 사용량 제한 (0) | 2025.05.15 |
[Docker] Dockerfile (0) | 2025.05.14 |
[Docker] 볼륨 (Volume) (0) | 2025.05.14 |
[Docker] 자주 사용하는 명령어 정리 (1) | 2025.05.13 |