# 이전에 컨테이너 내부에서 ifconfig을 입력해서 네트워크 인터페이스에 eth()과 lo네트워크 인테페이스 확인
# 도커는 컨테이너에 내부 IP를 순차적으로 할당. <컨테이너 재시작시 IP변경될 수 있음>
# 내부 망에서만 쓸 수 있는 IP이므로 외부와 연결 필요
# 외부와 연결되는 과정은 컨테이너를 시작할 때마다 호스트에 veth...라는 네트워크 인테페이스 생성 - veth(virtual eth)
# 각 컨테이너에 외부와의 네트워크를 제공하기 위해 컨테이너마다 가상 네트워크 인터페이스를 호스트에 생성
# veth 인터페이스는 사용자가 직접 생성할 필요가 없음.
# 컨테이너가 생성될 때 도커 엔진이 자동적으로 생성
root@fb69f29cc62d:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
#inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
# 출력 결과에서 eth()은 공인 IP 또는 내부 IP가 할당되어 실제로 외부와 통신할 수 있음
# veth로 시작하는 인터페이스는 컨테이너를 시작할 때 생성
# veth 인터페이스뿐 아니라 docker()이라는 브리지도 존재함
# docker() 브리지는 각 veth 인테페이스와 바인딩돼 호스트의 eth() 인터페이스와 이어주는 역할
PS C:\Users\Playdata> ipconfig
Windows IP 구성
이더넷 어댑터 이더넷:
미디어 상태 . . . . . . . . : 미디어 연결 끊김
연결별 DNS 접미사. . . . : skbroadband
이더넷 어댑터 vEthernet (Default Switch):
연결별 DNS 접미사. . . . :
링크-로컬 IPv6 주소 . . . . : fe80::90d9:1319:fe04:230c%46
...
무선 LAN 어댑터 Wi-Fi:
연결별 DNS 접미사. . . . :
링크-로컬 IPv6 주소 . . . . : fe80::6954:225c:b760:acb2%7
IPv4 주소 . . . . . . . . . : 172.30.1.53
서브넷 마스크 . . . . . . . : 255.255.255.0
기본 게이트웨이 . . . . . . : 172.30.1.254
# 도커에서 기본적으로 쓸 수 있는 네트워크
# 도커의 네트워크를 다루는 명령어 = docker network로 시작
# 이미 브리지, 호스트, 논 네트워크가 있음
PS C:\Users\Playdata> docker network ls
NETWORK ID NAME DRIVER SCOPE
58168758ef4c bridge bridge local
d1bdbbbd8c75 host host local
9835d3434648 none null local
# docker network inspect 명령어를 이용하면 네트워크의 자세한 정보를 살펴볼 수 있음
# docker inspect --type network를 사용해도 동일한 출력 가능
PS C:\Users\Playdata> docker network inspect bridge
[
{
"Name": "bridge",
"Id": "58168758ef4caa81770bbb1529c7bdb2922bd70f2b7a4719940ce7e462fe8951",
...
# 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조
# 기본적으로 존재하는 docker()을 사용하는 브리지 네트워크가 아닌 새로운 브리지 타입의 네트워크 생성
# 브리지 타입의 mybridge 네트워크 생성
PS C:\Users\Playdata> docker network create --driver bridge mybridge
c67469460b1e925ae418e4c86b9ccb3ef26015f3bb022b1464fb6ea3951a7718
# docker run 또는 create 명령어에 --net 옵션의 값을 설정
# 컨테이너가 이 네트워크를 사용하도록 설정
# ifconfig을 입력하면 새로운 IP 대역이 할당된 것을 확인
PS C:\Users\Playdata> docker run -i -t --name mynetwork_container --net mybridge ubuntu:14.04
root@dc7ab97316b8:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:12:00:02
inet addr:172.18.0.2 Bcast:172.18.255.255 Mask:255.255.0.0
..
# docker network disconnet, connect를 통해 컨테이너에 유동적으로 붙이고 뗄 수 있음
PS C:\Users\Playdata> docker network disconnect mybridge mynetwork_container
PS C:\Users\Playdata> docker network connect mybridge mynetwork_container
# 네트워크의 서브넷, 게이트웨이, IP할당범위 등을 임의로 설정하려면 네트워크를 생성할 때 아래와 같이 임의로 설정
# --subnet, --ip-range, --gateway 옵션을 추가
# 단 --subnet과 --ip-range는 같은 대역
PS C:\Users\Playdata> 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
4d037714f210f3931bd683119379d1e980bbda969fe074a5bcf5fa87d5ed7475
PS C:\Users\Playdata> docker run -i -t --name network_host --net host ubuntu:14.04
root@docker-desktop:/# echo "inner containenr"
inner containenr
root@docker-desktop:/# ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:6a:3f:50:6e
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:6aff:fe3f:506e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:526 (526.0 B)
eth0 Link encap:Ethernet HWaddr 02:50:00:00:00:01
inet addr:192.168.65.3 Bcast:192.168.65.255 Mask:255.255.255.0
inet6 addr: fe80::50:ff:fe00:1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:1286 (1.2 KB)
....
# 컨테이너의 네트워크를 호스트 모드로 설정
# 컨테이너 내부의 애플리케이션을 별도의 포트 포워딩 없이 이용가능
# none은 말 그대로 아무런 네트워크를 쓰지 않는 것
# 다음과 같이 컨테이너 생성 시 외부와 연결이 단절
# --net 옵션으로 none을 설정한 컨테이너 내부에서 네트워크 인터페이스를 확인하면
# 로컬호스트를 나타내는 lo 외에는 존재하지 않는 것을 알 수 있음
PS C:\Users\Playdata> docker run -i -t --name network_none --net none ubuntu:14.04
root@845e4de19963:/# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
PS C:\Users\Playdata> docker run -i -t -d --name network_container_2 --net container:network_container_1 ubuntu:14.04
90aeb47f66f5845c528e2c27c2dcfd56eda4debc00b1d782d5afc470901ed7b3
--net 옵션으로 container를 입력하면 다른 컨테이너의 네트워크 환경을 공유
공유되는 속성은 내부 IP, 네트워크 인터페이스의 맥(MAC) 주소 등
--net 옵션의 값으로 container:[다른 컨테이너 ID]와 같이 입력
-i, -t, -d 옵션을 함께 사용하면 컨테이너 내부에서 셸을 실행하지만 내부로 들어가지 않으며 컨테이너도 종료되지 않는다. 위와 같이 테스트용으로 컨테이너를 생성할 때 유용하게 씀
위와 같이 다른 컨테이너의 네트워크 환경을 공유하면 내부 IP를 새로 할당받지 않음
호스트에 veth로 시작하는 가상 네트워크 인터페이스로 생성되지 않음
network_container_2 컨테이너의 네트워크와 관련된 사항은 전부 network_container_1과 같게 설정
# 두 컨테이너의 eth() 정보 동일.
PS C:\Users\Playdata> docker exec network_container_1 ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:03
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1076 (1.0 KB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
PS C:\Users\Playdata> docker exec network_container_2 ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:03
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1076 (1.0 KB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)