도커가 돌아가고 있는 리눅스 터미널 명령어로 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 명령어를 통해 컨테이너에 연결된 네트워크를 붙였다 뗐다 할 수 있다.
브릿지 타입 네트워크와 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