[Docker] 도커 네트워크 정리

호성·2022년 6월 19일
0
post-thumbnail

도커 네트워크

  • 도커는 컨테이너가 생성될 때, 내부 IP를 순차적으로 할당하는데, 아래와 같은 특성을 가진다.
  1. 이 IP는 컨테이너를 재시작할 때 마다 변경될 수 있으며
  2. 도커가 설치된 내부망에서만 사용할 수 있다.
  3. 그러므로 도커 컨테이너가 외부와의 통신을 하기위해서 컨테이너 마다 가상 네트워크 인터페이스를 생성한다. (이름이 veth로 시작)

도커가 돌아가고 있는 리눅스 터미널 명령어로 ifconfig를 확인해보면, 아래와 같은 결과를 보인다.

ubuntu@X:~$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:12ff:fe80:952f  prefixlen 64  scopeid 0x20<link>
        ether 02:42:12:80:95:2f  txqueuelen 0  (Ethernet)
        RX packets 178965  bytes 1039597560 (1.0 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 265691  bytes 480687039 (480.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9001
        inet 172.31.36.6  netmask 255.255.240.0  broadcast 172.31.47.255
        inet6 fe80::8ff:4cff:fe24:fdc2  prefixlen 64  scopeid 0x20<link>
        ether 0a:ff:4c:24:fd:c2  txqueuelen 1000  (Ethernet)
        RX packets 1647171  bytes 1660298965 (1.6 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 668761  bytes 1732170870 (1.7 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

여기서 eth0는 호스트의 네트워크 인터페이스라고 볼 수 있고, docker0는 앞서 말했던 veth 가상 인터페이스와 호스트의 인터페이스를 연결해줘서 도커 컨테이너가 외부와의 통신을 할 수 있도록 이어주는 역할을 한다고 할 수 있다. docker0를 브릿지라고 표현한다.

여기서 브릿지는 도커 네트워크 드라이버의 한 종류라고 볼 수 있는데, 따라서 기본적으로 생성되는 도커 네트워크 드라이버는 브릿지지만 원한다면 다른 종류의 네트워크 드라이버를 가지는 도커 네트워크를 새로 생성할 수 있다.

대표적인 네트워크 드라이버 종류는 브릿지, 호스트, 논 컨테이너, 오버레이 등이 있다.

브릿지 네트워크

앞서 기본으로 생성된 docker0와 동일한 형태이다. 도커 네트워크는 얼마든지 추가로 생성할 수 있는데, 아래와 같이 하면 된다.

docker network create --driver bridge mynetwork

이제 생성한 네트워크를 컨테이너 생성 시 옵션으로 넣어주면 되는데, 아래와 같다.

docker run -it --name mycontainer --net mynetwork ${image}

브릿지 네트워크는 network disconnect, connect 명령어를 통해 컨테이너에 연결된 네트워크를 붙였다 뗐다 할 수 있다.

브릿지 네트워크와 --net-alias

브릿지 타입 네트워크와 run 명령어의 --net-alias 옵션을 같이 쓰면, 특정 호스트 이름으로 여러 컨테이너에 접근할 수 있다.

docker run -itd --name container1 ---net bridgenet --net-alias hostname1 ${image}
docker run -itd --name container2 ---net bridgenet --net-alias hostname1 ${image}
docker run -itd --name container3 ---net bridgenet --net-alias hostname1 ${image}

이후,

ping -c 1 hostname1

Ping을 날려보면, 전달되는 컨테이너가 라운드로빈 방식에 의해 전달된다. 도커 엔진에 내장된 DNS에서 호스트네임과 매칭된 여러 컨테이너를 관리하고 있기 때문이다. 호스트네임을 바탕으로 DNS에 질의하면, DNS는 호스트네임에 연결된 IP리스트를 반환한다. 이 때, Ping명령어는 IP리스트의 첫번째 IP에 요청을 전달하는 개념이다.

호스트 네트워크

호스트 네트워크는 호스트의 네트워크 환경을 그대로 사용하는 것을 말한다.
따라서 컨테이너 내부 애플리케이션을 별도로 포트포워딩하지 않아도 외부에서 접근이 가능하다. --net host

논 네트워크

논 네트워크는 아무런 네트워크를 사용하지 않는 것을 말한다. 컨테이너 생성 시 --net 옵션에 none으로 지정하면 된다.

컨테이너 네트워크

컨테이너 네트워크는 컨테이너 생성 시 옵션을 통해 다른 컨테이너에서 사용하는 네트워크를 공유하는 것이다.

docker run -it --name mycontainer --net container:${another_container_id}

따라서 기존 생성된 컨테이너의 veth 가상 인터페이스를 공유하여 사용하므로, 해당 옵션과 함께 컨테이너 생성 시 새로운 veth가 생성되지 않는다.

참고

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=alice_k106&logNo=220984112963

profile
스프링 깎는 노인

0개의 댓글