도커 네트워크 구조
- 도커는 호스트의 docker0브리지를 통해 외부와 통신할 수 있음
- 컨테이너의 eth0 인터페이스는 호스트의 veth...라는 인터페이스와 연결됐으며 veth 인터페이스는 docker0 브리지와 바인딩됨
참고
- 도커는 컨테이너에 내부 IP를 순차적으로 할당하며, 이 IP는 컨테이너를 재시작할 때마다 변경될 수 있음
- 내부 IP는 도커가 설치된 호스트, 즉 내부 망에서만 쓸 수 있는 IP이므로 외부와 연결될 필요가 있음
도커 네트워크 드라이버
- docker0 브리지를 통해 네트워크를 구성할 수도 있지만, 도커는 네트워크를 구성하는 다양한 방법을 제공함
- 도커가 제공하는 대표적인 네트워크 드라이버는 브리지(bridge), 호스트(host), 논(none), 컨테이너(container), 오버레이(overlay) 등
- 아무런 네트워크를 추가하지 않았을 경우 도커에서 기본적으로 쓸 수 있는 네트워크는 브리지(bridge), 호스트(host), 논(none)
브리지 네트워크
-
docker0가 아닌 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조
-
브리지 타입의 네트워크를 생성하면 도커는 IP 대역을 차례대로 할당
$ docker network create --driver bridge mybridge # 사용자 정의 브리지 네트워크 생성 $ docker run -i -t --name mynetwork_container \ # 컨테이너 생성 시 네트워크 드라이버를 mybridge로 지정 --net mybridge ubuntu:14.04
-
docker network disconnect
,docker network connect
를 통해 컨테이너에 유동적으로 붙이고 뗄 수 있음.
참고. 특정 IP 대역을 갖는 네트워크 모드(브리지, 오버레이 등)에만 이 명령어를 사용 가능$ docker network disconnect mybridge mynetwork_container $ docker network connect mybridge mynetwork_container
-
네트워크 속성을 임의 설정
$ docker network create --driver=bridge \ -subnet=172.72.0.0/16 \ -ip-range=172.72.0.0/24 \ -gateway=172.72.0.1 my_custom_network
호스트 네트워크
- 호스트의 네트워크 환경을 그대로 쓰는 경우
- 네트워크 드라이버를 별도로 생성할 필요없이 기존의 host라는 이름의 네트워크를 사용 (veth가 없음)
- 컨테이너 내부의 애플리케이션을 별도의 포트포워딩 없이 바로 서비스할 수 있음
- 이는 마치 실제 호스트에서 애플리케이션을 외부에 노출하는 것과 같음
- 예: 호스트 모드를 쓰는 컨테이너에서 아파치 웹 서버를 구동한다면 호스트의 IP와 컨테이너의 아파치 웹 서버 포트인 80으로 바로 접근할 수 있음
$ docker run -i -t --name network_host \
--net host \
ubuntu:14.04
논 네트워크
- 아무런 네트워크를 쓰지 않는 것
- 외부와의 연결이 단절됨(컨테이너 내부의 네트워크 인터페이스에는 lo 밖에 없음)
$ docker run -i -t --name network_none \
--net none \
ubuntu:14.04
컨테이너 네트워크
-
다른 컨테이너의 네트워크 네임스페이스 환경(내부 IP, 네트워크 인터페이스의 MAC 주소 등)을 공유
-
내부 IP를 새로 할당받지 않으며 호스트에 veth로 시작하는 가상 네트워크 인터페이스도 생성되지 않음
$ docker run -i -t -d --name network_container_1 ubuntu:14.04 $ docker run -i -t -d --name network_container_2 --net container:network_container_1 ubuntu:14.04
브리지 네트워크와 --net-alias
- 컨테이너의 네트워크 주소에 alias를 붙일 수 있음
- 같은 호스트 이름을 가진 컨테이너가 여러 개 등록되어 있으면 라운드로빈으로 라우팅
예:
- 컨테이너 3개에 같은 호스트 이름 등록
$ docker run -i -t -d --name network_alias_container1 \
--net mybridge \
--net-alias alice106 ubuntu:14.04
$ docker run -i -t -d --name network_alias_container2 \
--net mybridge \
--net-alias alice106 ubuntu:14.04
$ docker run -i -t -d --name network_alias_container2 \
--net mybridge \
--net-alias alice106 ubuntu:14.04
- 호스트 이름에 ping
$ docker run -i -t --name network_alias_ping \
--net mybridge \
ubuntu:14.04
root@d043d9ea001:/$ ping -c 1 alicek106
PING network_alias_container2
root@d043d9ea001:/$ ping -c 1 alicek106
PING network_alias_container1
root@d043d9ea001:/$ ping -c 1 alicek106
PING network_alias_container3
MacVLAN 네트워크
- 호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 동일하게 제공
- 물리 네트워크상에서 가상의 맥(MAC) 주소를 가지며, 해당 네트워크에 연결된 다른 장치와의 통신이 가능
'인프라' 카테고리의 다른 글
9. DockerFile (0) | 2021.03.14 |
---|---|
7. 도커 이미지 (0) | 2021.03.03 |
3. 도커 볼륨 (0) | 2021.03.02 |
2. 도커 기본 명령어 (0) | 2021.03.02 |
1. 도커란 (0) | 2021.02.21 |