コンテナネットワーク


コンテナネットワーク


--netオプションでcontainerを入力すると、他のコンテナのネットワークネーミングスペース環境を共有できます.
共有される属性には,内部IP,ネットワークインタフェースのMAXアドレスなどが含まれる.
container:[다른 컨테이너의ID]
2つの共有ネットワークネーミングスペース環境のコンテナを作成する
root@red-virtual-machine:~# docker run -i -t -d --name network_container_1 ubuntu:14.04
591833e10a821927d576d4644a803e48391dcaaf2939e912cf1339874a135ed1
root@red-virtual-machine:~# docker run -i -t -d --name network_container_2 \
--net container:network_container_1 ubuntu:14.04
7df1114bf4ad0b7a537d4ebab2e79bba7fe9e05bb062b26d29a6e888c0d1738f

network_container_1을 먼저 만들고 network_container_2가 공유하도록 만들었다.
コンテナが作成されたネットワーク構成の確認
root@red-virtual-machine:~# docker exec network_container_1 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:25 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:3142 (3.1 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)

root@red-virtual-machine:~# docker exec network_container_2 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:25 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:3142 (3.1 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)
          
네트워크 구성이 서로 같다.          
ホストのネットワーク構成を確認すると、ネットワーク構成が生成されます.
root@red-virtual-machine:~# 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:6bff:fefe:f54e  prefixlen 64  scopeid 0x20<link>
        ether 02:42:6b:fe:f5:4e  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 39  bytes 5336 (5.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.159.128  netmask 255.255.255.0  broadcast 192.168.159.255
        inet6 fe80::91dd:c79d:4366:c741  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:67:2d  txqueuelen 1000  (Ethernet)
        RX packets 39427  bytes 53319756 (53.3 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6834  bytes 566743 (566.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 587  bytes 52957 (52.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 587  bytes 52957 (52.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethe9a33e9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::44bc:71ff:feb3:d609  prefixlen 64  scopeid 0x20<link>
        ether 46:bc:71:b3:d6:09  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 31  bytes 3673 (3.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
-dオプションは、コンテナが接続されていないため、テストコンテナを作成します.

ブリッジネットワークと--net-alias


ブリッジタイプのネットワークはrunコマンドのnet-aliasオプションとともに使用され、特定のホスト名で複数のコンテナにアクセスできます.
ブリッジを作成し、ブリッジに接続された3つのコンテナを作成します.
コンテナのネットエイリアスを設定します.
root@red-virtual-machine:~# docker network create --driver bridge mybridge
b5c444e1e0ccbd75ca208438ad8d80a3603b3229fa7b180ceb54be64a8adb962

root@red-virtual-machine:~# docker run -i -t -d --name network_alias_cont1 --net mybridge \
--net-alias alick106 ubuntu:14.04

root@red-virtual-machine:~# docker run -i -t -d --name network_alias_cont2 --net mybridge \
--net-alias alick106 ubuntu:14.04

root@red-virtual-machine:~# docker run -i -t -d --name network_alias_cont3 --net mybridge \
--net-alias alick106 ubuntu:14.04
各コンテナのipspec
root@red-virtual-machine:~# docker inspect network_alias_cont1  | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.2",
root@red-virtual-machine:~# docker inspect network_alias_cont2  | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.3",
root@red-virtual-machine:~# docker inspect network_alias_cont3  | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.4",

ip 주소가 같은 네트워크 대역으로 설정되며 순차적으로 ip를 할당 받았다.
ping呼び出しネットワークエイリアス
root@red-virtual-machine:~# docker run -i -t --name network_alias_ping --net mybridge ubuntu:14.04
ping을 날리기 위한 컨테이너 생성 

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

root@c57fad6c09f8:/# ping -c 1 alick106
PING alick106 (172.19.0.4) 56(84) bytes of data.
64 bytes from network_alias_cont3.mybridge (172.19.0.4): icmp_seq=1 ttl=64 time=0.120 ms
--- alick106 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.120/0.120/0.120/0.000 ms

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

응답 오는 IP가 매번 다르다.
3つのコンテナのIPでそれぞれpingが送信されたことを確認できます.
ロビンをループする方式で、IPのたびに変化します.
これは、ドッキングエンジンに内蔵されているDNS名がalick 106であるためです.
--net-aliasオプションは、alick 106を設定されたコンテナ(解析)に変換する.

ドッキングステーションのDNSは、主にフローティングホスト名コンテナを探すために使用されます.
コンテナが開き、新しいIPが割り当てられていても、特定のコンテナを指定できます.
最も代表的な例は、DNSによって自動的に管理されるlinkオプションです.コンテナのIPが変更されても、別名を使用してコンテナを蹴ることができます.しかし、李京宇の違いは、分散型ブリッジネットワークのコンテナDNSであることだ.
--net-aliasオプションも--linkオプションと同様の原理で動作します.
ドッキングステーションには、デフォルトのブリッジネットワークではなく、ユーザー定義のブリッジネットワーク用の内蔵DNSサーバがあります.(DNSのIPは127.0.0.11)
mybridgeという3つのネットワークコンテナがrunを生成すると、--net-aliasオプションにalick 106という名前の値が入力され、このコンテナのIPはDNSサーバ上でalick 106として登録されたホスト名である.
mybridgeネットワーク内のコンテナで、alick 106というホスト名でアクセスすると、DNSサーバはポーリング方式でコンテナのIPリストを返します.
pingコマンドは、IPリストで最初のIPを使用するため、毎回他のIPにpingを送信する.
> dig alick106
alick106 600 IN A 172.18.0.5
alick106 600 IN A 172.18.0.3
alick106 600 IN A 172.18.0.4

MacVANNネットワーク


MacVLANはホストのNICを仮想化し、コンテナに同じ物理ネットワーク環境を提供します.
MacVLANは、コンテナが物理ネットワーク上に仮想MACアドレスを有し、そのネットワークに接続された他のデバイスと通信することを可能にする.
MacVLANに接続されているコンテナは172.17で、デフォルトで割り当てられているIP帯域幅です.これは、X.xの代わりにネットワークデバイスのIPを割り当てるからです.
MacVLANネットワークを使用しているコンテナは基本的にホストと通信できません.
コンテナAは、サーバ2と通信することができるが、サーバ1と通信することはできない.
MacVLANを使用するには、少なくとも1つのネットワークデバイスとサーバが必要です.
공유기의 네트워크 정보 : 192.168.0.0/24
서버 1 (node01) : 192.168.0.50
서버 2 (node02) : 192.168.0.51
MacVLANの作成
root@node01:~ # docker network create -d macvlan --subnet --subnet=192.168.0./24\
--ip-range=192.168.0.64/28 --gateway=192.168.0.1\
-o macvlan_mode=bridge -o parent=eht0 my_macvlan

root@node02:~ # docker network create -d macvlan --subnet --subnet=192.168.0./24\
--ip-range=192.168.0.128/28 --gateway=192.168.0.1\
-o macvlan_mode=bridge -o parent=eht0 my_macvlan


-d(--dirver) : 네트워크 드라이버로 macvlan을 사용, 
--subnet : 컨테이너가 사용할 네트워크 정보를 입력, 여기서는 네트워크 장비의 IP 대역 기본 설정을 그대로 따른다.

--ip-range : MacVLAN을 생성하는 호스트에서 사용할 컨테이너의 IP 범위를 입력, 
node01과 node02의 IP 범위가 겹쳐 동일한 IP의 컨테이너가 각각 생성된다면 
컨테이너 네트워크가 정상적으로 동작하지 않을 수 있으므로 반드시 겹치지 않게 설정해야 한다.

--gateway : 네트워크에 설정된 게이트웨이를 입력. 여기서는 네트워크 장비의 기본 설정을 그대로 따른다.

-o : 네트워크의 추가적인 옵션을 설정. 
위 예시에서는 macvaln_mode=bridge 값을 통해 MAcVLAN을 bridge 모드로, 
parent=eth0 값을 통해 MacVLAN으로 생성될 컨테이너 네트워크 인터페이이스의 
부모(parent) 인터페이스를 eth0으로 지정한다.
eth0은 공유기에 랜선으로 연결되어 192.168.0/24 대역의 IP를 할당받은 네트워크 인터페이스다.
MacVLANネットワークを使用したコンテナの作成
root@node01:~ # docker run -it --name c1 --hostname c1 --network my_macvlan ubuntu:14.04
root@node02:~ # docker run -it --name c2 --hostname c2 --network my_macvlan ubuntu:14.04

생성된 2 컨테이너끼리 통신(ping)이 가능하다