인프라

4. 도커 네트워킹

오늘의 나1 2021. 3. 2. 21:42

도커 네트워크 구조

  • 도커는 호스트의 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