컨테이너의 네트워크 인터페이스에는 eth0
과 lo
네트워크 인터페이스가 있다.
도커는 컨테이너에 내부 IP를 순차적으로 할당하며, 이 IP는 컨테이너를 재시작할 때마다 변경될 수 있다.
이 내부 IP는 도커가 설치된 호스트, 즉 내부 망에서만 쓸 수 있는 IP이므로 외부와 연결될 필요가 있다.
이 과정은 컨테이너를 시작할 때마다 호스트에 veth~
라는 네트워크 인터페이스를 생성함으로써 이뤄진다.
veth; virtual eth
도커는 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너마다 가상 네트워크 인터페이스를 호스트에 생성하며 이 인터페이스의 이름은 veth
로 시작한다.
veth
인터페이스는 사용자가 직접 생성할 필요 없이 컨테이너가 생성될 때 도커 엔진이 자동으로 생성한다.
실행 중인 컨테이너 수만큼 veth로 시작하는 인터페이스가 생성된다.
공인 IP 또는 내부 IP가 할당되어 실제로 외부와 통신할 수 있는 호스트의 네트워크 인터페이스
veth로 시작하는 인터페이스는 컨테이너를 시작할 때 생성되며, 각 컨테이너의 eth0
과 연결된다.
docker0 브리지는 각 veth 인터페이스와 바인딩돼 호스트의 eth0 인터페이스와 이어주는 역할을 한다.
// 네트워크 목록 확인하기
docker network ls
컨테이너를 생성하면 기본적으로 docker0
브리지를 통해 외부와 통신할 수 있는 환경을 사용할 수 있지만,
사용자의 선택에 따라 여러 네트워크 드라이버를 쓸 수도 있다.
도커가 자체적으로 제공하는 대표적인 네트워크 드라이버로는 bridge, host, none, container, overlay
가 있다.
아무런 설정을 하지 않고 컨테이너를 생성하면 자동으로 docker0 브리지를 사용한다.
// 새로운 브리지 네트워크 생성
docker network create --driver bridge mybridge
// mybridge 네트워크를 사용하는 컨테이너 생성
docker run -i -t
--net mybridge
// 브리지 네트워크 끊기
docker network disconnect mybridge 컨테이너명
// 다시 연결
docker network connect mybridge 컨테이너명
docker0
이 아닌 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조이다.
컨테이너는 연결된 브리지를 통해 외부와 통신할 수 있다.
사용자 정의 네트워크는 유동적으로 붙이고 뗄 수 있다.
docker run -i -t
--net host
네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 쓸 수 있다.
별도로 생성할 필요 없이 기존의 host라는 이름의 네트워크를 사용한다.
컨테이너 내부의 애플리케이션을 별도의 포트 포워딩 없이 바로 서비스할 수 있다.
docker run -i -t
--net none
아무런 네트워크를 쓰지 않는다.
외부와 연결이 단절된다.
docker run -i -t
--net container:[다른 컨테이너의 ID]
다른 컨테이너의 네트워크 네임스페이스 환경을 공유한다.
(공유되는 속성: 내부 IP, 네트워크 인터페이스의 맥(MAC) 주소 등)
내부 IP를 새로 할당받지 않으며 호스트에 veth
로 시작하는 가상 네트워크 인터페이스도 생성되지 않는다.
docker run -i -t --name container1
--net mybridge
--net-alias alicek106
ubuntu:14.04
docker run -i -t --name container2
--net mybridge
--net-alias alicek106
ubuntu:14.04
docker run -i -t --name container3
--net mybridge
--net-alias alicek106
ubuntu:14.04
--net-alias
옵션을 함께 쓰면 특정 호스트 이름으로 컨테이너 여러 개에 접근할 수 있다.docker network create
-d macvlan // 네트워크 드라이버로 macvlan을 사용한다는 것을 명시 (`--driver`)
--subnet=192.168.0.0/24 // 컨테이너가 사용할 네트워크 정보 입력
--ip-range=192.168.0.64/28 // 호스트에서 사용할 컨테이너의 IP 범위 입력
--gateway=192.168.0.1 // 네트워크에 설정된 게이트웨이 입력
-o macvlan_mode=bridge -o parent=eth0 my_macvlan // 추가적인 옵션 설정
MacVLAN은 호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 동일하게 제공한다.
MacVLAN을 사용하면 컨테이너는 물리 네트워크상에서 가상의 맥(MAC) 주소를 가지며, 해당 네트워크에 연결된 다른 장치와의 통신이 가능해진다.
MacVLAN을 사용하는 컨테이너들과 동일한 IP 대역을 사용하는 서버 및 컨테이너들은 서로 통신이 가능하다.
docker network 관해서 더 자세하게 알고가네요