본문 바로가기
728x90
반응형

* 저는 수시로 docker rm 명령어로 컨테이너를 내리며 학습합니다.

 

1. 네트워크

 

ifconfig 명령어를 치면 네트워크 정보들이 나온다.

root@k8s-node1:~# ifconfig
...
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:5bff:fef8:c87e  prefixlen 64  scopeid 0x20<link>
        ether 02:42:5b:f8:c8:7e  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 352  bytes 37245 (37.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...

docker를 설치하여 docker0 으로 172.17.0.1 IP가 할당된 것을 확인할 수 있다.

 

root@k8s-node1:~# docker run -i -t --name docker_ip ubuntu:14.04
root@ddee20ee76df:/# 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
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17 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:2241 (2.2 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)

새로운 컨테이너를 하나 생성하고 들어가서 ifconfig 를 쳐보면 

172.17.0.2 (docker0 에 이어서 순차적으로 생성)으로 IP를 할당받은 것을 확인할 수 있다.

 

또한 컨테이너를 띄워 둔 채 (-d 옵션으로 백그라운드에서 돌아가게 함) ifconfig 를 쳐보면, 컨테이너 수 만큼 새로운 네트워크 인터페이스가 생성 됨을 알 수 있다.

 

root@k8s-node1:~# docker run -i -t -d ubuntu:14.04
091f9373724908bfa63358dfd7a227dbb3d7a4859cd7232e11e128d4eb1e465c
root@k8s-node1:~# docker run -i -t -d ubuntu:14.04
00162b93b02dddae1ef51ae17d4e4bd14bbe81c9e51af030465b1ce3bde06866
root@k8s-node1:~# 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:5bff:fef8:c87e  prefixlen 64  scopeid 0x20<link>
        ether 02:42:5b:f8:c8:7e  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 356  bytes 37765 (37.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...
veth2bfbfea: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::9008:d5ff:fe34:6e8a  prefixlen 64  scopeid 0x20<link>
        ether 92:08:d5:34:6e:8a  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 25  bytes 3082 (3.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth55c5848: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::bc48:a5ff:fe5a:e25d  prefixlen 64  scopeid 0x20<link>
        ether be:48:a5:5a:e2:5d  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 516 (516.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth = virtual eth 

 

docker0은 네트워크 브릿지며 이 docker0 브릿지가 각각의 veth 인터페이스와 바인딩되어 호스트의 eth 인터페이스와 이어주는 역할을 한다. (외부 통신이 가능하게..)

 

root@k8s-node1:~# brctl show docker0
bridge name	bridge id		STP enabled	interfaces
docker0		8000.02425bf8c87e	no		veth2bfbfea
							veth55c5848

brctl 명령어를 이용해 docker0이 어떤 인터페이스와 바인딩되었는지 확인할 수 있다.

brctl 이 없다면 yum install 또는 apt-get install 로 설치

 

(도커 네트워크 정보는 docker inspect network 명령어로 자세히 볼 수 있다)

 

2. 호스트 네트워크

root@k8s-node1:~# docker run -i -t --name docker_hostnetwork --net host ubuntu:14.04
root@k8s-node1:/# docker
bash: docker: command not found

root@k8s-node1:/# exit
exit
root@k8s-node1:~#

--net 을 host 로 입력시 기존처럼 브릿지등으로 바인딩 후 외부와 연결되는 것이 아닌 호스트 자체 네트워크에 붙게된다.

실제 호스트에서 애플리케이션을 돌리는 효과를 기대할 수 있다.

 

3. 논 네트워크

--net none 옵션을 사용시 네트워크를 사용하지 않는다.

 

4. 컨테이너 네트워크

--net conatiner:[다른컨테이너ID] 옵션으로 다른 컨테이너의 네트워크 네임스페이스 환경을 이용한다.

 

5. 브리지 네트워크

아무 옵션을 설정하지 않으면 docker0 브리지를 이용하는데, docker 에서 추가로 브리지 네트워크를 생성하여 해당 브리지를 이용하여 컨테이너를 생성할 수 있다.

root@k8s-node1:~# docker network create --driver bridge mybridge
6dd8105463a67e0ff2adb61ce0c65efc741670c607eeac022ae76381c8428400
root@k8s-node1:~# docker run -i -t --name mybridgeContainer --net mybridge ubuntu:14.04
root@8261472902e7:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:13:00:02  
          inet addr:172.19.0.2  Bcast:172.19.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:79 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:9455 (9.4 KB)  TX bytes:0 (0.0 B)

docker network create 로 새로운 브리지를 만들어 해당 브리지로 연결하니

기존 172.17.0.1대역이 아닌(docker0) 새로운 브리지로 172.19.0.1대역(mybridge)로 연결되었다.

 

root@k8s-node1:~# docker run -i -t -d --name networkAliasContainer --net mybridge --net-alias netAlias ubuntu:14.04
aea4217744dbb11c7d0e219dfef3769bd30a90e0a2ba98a52209e079d0151e59
root@k8s-node1:~# docker run -i -t -d --name networkAliasContainer1 --net mybridge --net-alias netAlias ubuntu:14.04
a23ac5cff99db2430d204aefe7be5b260332dcf69a84daafdb9a92dbe0cc0949
root@k8s-node1:~# docker run -i -t -d --name networkAliasContainer2 --net mybridge --net-alias netAlias ubuntu:14.04
1f6231476c9820df458486f7f592ccc8f11af3e2874e236c7509366cb907f47f
root@k8s-node1:~# docker inspect networkAliasContainer | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.2",
root@k8s-node1:~# docker inspect networkAliasContainer1 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.3",
root@k8s-node1:~# docker inspect networkAliasContainer2 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.4",
                    
root@k8s-node1:~# docker run -i -t --name networkAliasTest --net mybridge ubuntu:14.04
root@7f034c81658e:/# ping -c 1 netAlias
PING netAlias (172.19.0.4) 56(84) bytes of data.
64 bytes from networkAliasContainer2.mybridge (172.19.0.4): icmp_seq=1 ttl=64 time=0.151 ms
--- netAlias ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.151/0.151/0.151/0.000 ms

root@7f034c81658e:/# ping -c 1 netAlias
PING netAlias (172.19.0.3) 56(84) bytes of data.
64 bytes from networkAliasContainer1.mybridge (172.19.0.3): icmp_seq=1 ttl=64 time=0.132 ms
--- netAlias ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.132/0.132/0.132/0.000 ms

root@7f034c81658e:/# ping -c 1 netAlias
PING netAlias (172.19.0.2) 56(84) bytes of data.
64 bytes from networkAliasContainer1.mybridge (172.19.0.2): icmp_seq=1 ttl=64 time=0.142 ms
--- netAlias ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.132/0.132/0.132/0.000 ms

 

브리지 네트워크와 --net-alias 옵션을 같이 쓰면 특정 호스트이름으로 여러 컨테이너(같은 브리지를 쓰는)에 동시에 접근할 수 있다.

위의경우 동일한 mybridge 네트워크를 사용하는 netAlias 그룹?에 ping 을 보내 분산으로 핑이 가는것을 확인 할 수 있다..

도커 내장 DNS 가 netAlias 라는 호스트이름을 (ping -c 1 netAlias 에서 netAlias) --net-alias 옵션으로 netAlias을 설정한 컨테이너로 바꿔주기 때문이다.

 

네트워크는 docker network disconnect (또는 connect) [브리지이름] [컨테이너이름]

으로 연결을 끊거나 붙일 수 있다.

728x90
반응형

한걸음 한걸음

개인적인 기록