목차
- Docker Network 일반적인 구조
- Docker Network 종류
- Doccker Container가 외부와 통신할 때 흐름
🔷 Doker Network 일반적인 구조
![](https://velog.velcdn.com/images/suk13574/post/5553f26e-d3ed-457e-b12b-408f338a90ca/image.png)
- 도커는 컨테이너에 내부 IP를 순차적으로 할당한다. (172.17.0.x 순차적 할당)
- 따라서, 내부 IP는 컨테이너를 재시작할 때마다 변경될 수 있다.
- 내부 IP는 도커가 설치된 호스트, 즉 내부망에서만 쓸 수 있는 IP이므로 외부와 연결될 필요가 있다.
- 컨테이너를 시작할 때마다 호스트에 veth(Virtual Ethernet) 라는 네트워크 인터페이스를 생성한다.
- 도커는 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너마다 가상 네트워크 인터페이스를 호스트에 생성하며 이 인터페이스의 이름은 veth로 시작한다.
- veth 인터페이스는 호스트가 갖고 있는 eth0, eth1 등과 연결되어 있다.
- docker0 브리지는 각 veth 인터페이스와 바인딩돼 호스트의 eth0 인터페이스와 이어주는 역할을 한다.
veth란?
- 리눅스의 virtual ethernet interfae
- 랜카드에 연결된 실제 네트워크 인터페이스가 아니라 가상으로 생성한 네트워크 인터페이스이다.
(가상이란 쉽게 말하자면 소프트웨어 구조라고 생각하면 된다.)
- 패킷 전달받으면 자신에게 연결된 다른 네트워크 인터페이스로 패킷을 보내주는 식으로 동작한다.
- 도커에서 실행 중인 컨테이너 수만큼 veth 인터페이 생성된다.
docker 컨테이너가 2개 띄울 때 아래처럼 veth가 2개 생성된 것을 볼 수 있다.
![](https://velog.velcdn.com/images/suk13574/post/58211c0a-d3cb-4b89-91a2-398996d25299/image.png)
🔷 Docker Network 종류
![](https://velog.velcdn.com/images/suk13574/post/db511919-7c7d-4f47-9f45-ee1022ad7c8a/image.png)
docker network는 다음과 같이 single과 multi로 나눌 수 있다.
- Single Host (한 대의 서버 안에서)
- Bridge Network (default)
- Host Network
- None Network
- Multi Host (여러대의 서버)
Bridge Network
- Docker의 기본 네트워크이며, docker0가 기본적으로 생성되어 있다.
- docker0에 있는 docker container끼리 서로 통신할 수 있다.
- 사용자가 추가 브릿지 생성 가능하다.
예를들어 docker1을 생성했다면 docker0끼리 통신 가능, docker1끼리 통신 가능하다.
- 컨테이너는 연결된 브릿지를 통해 외부와 통신한다.
참고 - docker compose network 설정
아래의 설정에서 webapp
서비스는 mynetwork
에 속하게 되고, mynetwork
에 속한 컨테이너끼리 통신이 가능하다.
version: '3'
services:
webapp:
image: nginx:latest
networks:
- mynetwork
networks:
mynetwork:
driver: bridge
참고 - docker network 상세 조회
아래 명령어를 입력하면 기본으로 설정된 bridge network의 상세 설정을 볼 수 있다.
docker network inspect bridge
![](https://velog.velcdn.com/images/suk13574/post/180defec-0e49-40c1-adfb-5878395083ca/image.png)
Host Network
- Docker Network를 호스트 네트워크 환경을 그대로 사용한다.
- 따라서 veth를 사용하지 않는다.
- 별도로 생성할 필요 없이 기존의 Host라는 이름의 네트워크를 사용한다.
None Network
- 아무 네트워크를 사용하지 않는다.
- 같은 호스트(=서버) 내의 컨테이너와 외부 모두 통신이 불가능하다.
Overlay Network
- 여러 호스트에서 컨테이너를 연결하기 위해 사용되는 네트워크이다.
(여러 서버에서 사용한다고 이해하면 된다.)
- Kubernetes와 같은 오케스트레이션 도구를 사용할 때, 여러 호스트에 있는 컨테이너를 연결하기 위해 overlay network 드라이버가 활용된다.
참고 - docker network 종류 확인
아래 명령어는 docker network 종류를 확인할 수 있다.
docker network ls
![](https://velog.velcdn.com/images/suk13574/post/3b60b5f2-890c-4581-ad5c-7b590d2c8dcb/image.png)
🔷 Docker Container가 외부와 통신할 때 흐름
Docker container -> docker0 네트워크 인터페이스 -> Host NIC -> 외부
1. Docker container -> docker0 인터페이스
컨테이너 내부에서 외부로 요청보낼 때, 먼저 컨테이너 내의 프로세스는 docker0 통해 나가려는 목적지로 패킷을 전송한다.
2. docker0 인터페이스
docker0 인터페이스는 NAT(Network Addree Translation)을 수행하여 컨테이너 내부 IP 주소와 호스트와 매핑된다.
3. Host NIC
Host NIC에서 매핑된 docker의 패킷이 전송된다.
참고
https://captcha.tistory.com/70
https://velog.io/@choidongkuen/%EC%84%9C%EB%B2%84-Docker-Network-%EC%97%90-%EB%8C%80%ED%95%B4
https://velog.io/@dojun527/%EB%8F%84%EC%BB%A4-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%AA%A8%EB%93%9C