컨테이너의 네트워크에 대해서 알아보고, 실습해보도록 하겠습니다.
Docker Network 는 브리지(Bridge),호스트(host), 컨테이너(container), 논(none) 이렇게 4가지로 구분됩니다.
아래 3가지 방식만 보이는데, 컨테이너 방식은 별도로 드라이버를 사용하지 않기때문에 나오지 않습니다.
[root@docker /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
103b63dc3b48 bridge bridge local
db3d9f5b68d6 host host local
3a8a3fc8dbd7 none null local
각 실습을 통해 어떻게 다른지 알아보도록 하겠습니다.
1. Docker Network - Bridge
docker의 기본 네트워크 옵션은 Bridge입니다.
컨테이너가 생성되면 각 컨테이너마다 고유한 Network Namespace 영역이 생성되며,
docker0 bridge에 컨테이너의 인터페이스가 하나씩 바인딩 되는 구조입니다.
1-1) 브릿지 네트워크 생성
이번 단계에서는 브릿지 네트워크를 생성해보겠습니다. :)
브릿지 네트워크 생성할때 넣어주는 옵션입니다.
--driver: 네트워크 관리 드라이버
--subnet: 네트워크 범위 CIDR
--ip-range: 컨테이너에 할당될 실제 IP주소 범위
--gateway: 서브넷 게이트웨이 지정 (별도로 지정하지 않을시 임의로 지정)
[root@docker /]# docker network create --driver bridge --subnet=10.0.0.0/16 --ip-range=10.0.1.0/24 --gateway=10.0.1.1 vswitch01
5b89ca2c84aca4adaac7d687735ac835829f30117290e813e714d9e22f18e3a9
Docker Network 명령어로 네트워크 구성 정보를 확인합니다. 방금 생성한 vswitch01 네트워크가 보이네요.
[root@docker /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
103b63dc3b48 bridge bridge local
db3d9f5b68d6 host host local
3a8a3fc8dbd7 none null local
5b89ca2c84ac vswitch01 bridge local
2-2) 브릿지 네트워크 실습
먼저 실습용도의 도커 컨테이너 Centos1, Centos2를 생성하겠습니다.
[root@docker /]# docker run --name centos1 --hostname centos1 --network vswitch01 -itd centos
a373e969465d70a86d6ff0fc71f59b95a211db2c38e7c14ff43cf70594085d0b
[root@docker /]# docker run --name centos2 --hostname centos2 --network vswitch01 -itd centos
23c5e5260ea08a12377fd8cfee14deaacc9be47ba42073510c3328a5bb873cfd
Centos1 컨테이너에 접속해서 통신 테스트를 진행해봅시다.
먼저, centos1 컨테이너에 접속합니다.
[root@docker /]# docker exec -it centos1 /bin/bash
이제 ip a 명령어로 네트워크 정보를 확인합니다. 10.0.1.0 IP가 할당되었네요.
[root@centos1 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:0a:00:01:00 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.1.0/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever
ping 으로 centos2 컨테이너와 통신이 되는지 확인합니다.
잘되네요 :)
[root@centos1 /]# ping -c3 centos2
PING centos2 (10.0.1.2) 56(84) bytes of data.
64 bytes from centos2.vswitch01 (10.0.1.2): icmp_seq=1 ttl=64 time=0.084 ms
64 bytes from centos2.vswitch01 (10.0.1.2): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from centos2.vswitch01 (10.0.1.2): icmp_seq=3 ttl=64 time=0.053 ms
--- centos2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.053/0.066/0.084/0.013 ms
[root@centos1 /]# exit
이번에는 centos2 컨테이너에 접속합니다.
[root@docker /]# docker exec -it centos2 /bin/bash
마찬가지로, Centos2 컨테이너에 설정된 네트워크를 확인합니다. 10.0.1.2 IP가 할당되었습니다 :)
[root@centos2 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:0a:00:01:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.1.2/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever
이제 centos1 컨테이너와 통신이 잘 되는지 확인해봅니다.
마찬가지로 아주 잘 되네요 :)
[root@centos2 /]# ping -c3 centos1
PING centos1 (10.0.1.0) 56(84) bytes of data.
64 bytes from centos1.vswitch01 (10.0.1.0): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from centos1.vswitch01 (10.0.1.0): icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from centos1.vswitch01 (10.0.1.0): icmp_seq=3 ttl=64 time=0.045 ms
--- centos1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.045/0.048/0.051/0.006 ms
[root@centos2 /]# exit
2. Docker Network - Host
Host방식은 컨테이너를 실생할때 Host의 네트워크를 같이 사용하도록 하는 옵션입니다.
이렇게 설정하면 컨테이너는 독립적인 네트워크영역을 갖지 않고 호스트의 네트워크를 공유하여 사용합니다.
바로 테스트 해보겠습니다.
먼저, network host 방식으로 컨테이너를 실행합니다.
[root@docker /]# docker run --name centos3 --hostname cent3 --network host -itd centos
11993b72216806d73a0333c0d241070f26c7a1b0a91ceacdc880686cfce7c5ce
컨테이너 목록을 확인하여 잘 생성되었는지 확인합니다.
[root@docker /]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11993b722168 centos "/bin/bash" 10 seconds ago Up 10 seconds centos3
23c5e5260ea0 centos "/bin/bash" 8 minutes ago Up 8 minutes centos2
a373e969465d centos "/bin/bash" 8 minutes ago Up 8 minutes centos1
컨테이너에 ip a 명령어를 실행시켜 출력 내용을 살펴봅니다. 호스트컴퓨터와 설정 내용이 같습니다 :)
[root@docker /]# docker exec -it centos3 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:c2:72:d9:ee:7c brd ff:ff:ff:ff:ff:ff
inet 172.31.3.201/20 brd 172.31.15.255 scope global dynamic ens5
valid_lft 2840sec preferred_lft 2840sec
inet6 fe80::c2:72ff:fed9:ee7c/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:6e:fa:50:8e brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:6eff:fefa:508e/64 scope link
valid_lft forever preferred_lft forever
22: br-5b89ca2c84ac: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:93:30:94:f3 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.1/16 brd 10.0.255.255 scope global br-5b89ca2c84ac
valid_lft forever preferred_lft forever
inet6 fe80::42:93ff:fe30:94f3/64 scope link
valid_lft forever preferred_lft forever
26: vethd7504ec@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-5b89ca2c84ac state UP group default
link/ether 72:39:41:ba:d2:38 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::7039:41ff:feba:d238/64 scope link
valid_lft forever preferred_lft forever
28: veth8f37b6f@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-5b89ca2c84ac state UP group default
link/ether 72:2d:e5:33:45:9f brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::702d:e5ff:fe33:459f/64 scope link
valid_lft forever preferred_lft forever
외부 네트워크 연결도 잘 되는지 확인해봅니다.
[root@docker /]# docker exec -it centos3 ping -c3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=106 time=30.1 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=106 time=30.1 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=106 time=30.1 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 30.127/30.132/30.138/0.141 ms
docker inspect 명령어를 이용하여 host 네트워크를 확인해보겠습니다.
명령어 출력결과에 "Containers" Centos3을 확인할 수 있습니다 :)
[root@docker /]# docker network inspect host
[
{
"Name": "host",
"Id": "db3d9f5b68d68428cc20015039a324e3929aa928dc3ddf50488b02e827d91efc",
"Created": "2020-09-28T02:21:10.637717387Z",
"Scope": "local",
"Driver": "host",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": []
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"11993b72216806d73a0333c0d241070f26c7a1b0a91ceacdc880686cfce7c5ce": {
"Name": "centos3",
"EndpointID": "468e3ffa63589a1dfa5a3f98cbc2f55797cdc6f97ee9045bc4ab882127032e9f",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
3. Docker Network - Container
기존 존재하는 컨테이너의 네트워크 환경을 공유하는 옵션입니다.
바로 실습 진행해보겠습니다.
일단, 컨테이너의 목록을 확인해봅니다.
[root@docker /]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11993b722168 centos "/bin/bash" 5 minutes ago Up 5 minutes centos3
23c5e5260ea0 centos "/bin/bash" 14 minutes ago Up 14 minutes centos2
a373e969465d centos "/bin/bash" 14 minutes ago Up 14 minutes centos1
컨테이너 네트워크 옵션( --net=container:<컨테이너ID>)을 주고, 컨테이너를 실행합니다.
여기에서는 centos4 컨테이너를 실행시키면서, centos1 컨테이너의 네트워크를 쓰겠다고 옵션을 넣어줬습니다.
[root@docker /]# docker run --name centos4 --net=container:a373e969465d -dit centos
20ff7f9ff27049e4596bf4bfb2242935386f28f3f8380f031b44fb38688a43c3
새로 생성한 컨테이너 centos4 의 네트워크 설정을 확인합니다. Centos4에 설정된 IP가 Centos1의 IP와 같습니다.
[root@docker /]# docker exec -it centos4 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:0a:00:01:00 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.1.0/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever
inspect 명령어를 통해 확인해보면, centos4컨테이너는 다른 컨테이너의 네트워크를 공유하므로 네트워크 설정이 없습니다.
[root@docker /]# docker container inspect centos4
.. 생략..
"NetworkSettings": {
"Bridge": "",
"SandboxID": "",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {}
}
.. 생략..
4. Docker Network - None
None Network 옵션으로 컨테이너를 생성하면, 격리된 컨테이너가 생성됩니다.
lookback인터페이스만 가지며, 통신을 위한 인터페이스를 가지지 않으며, 외부 통신이 불가능한 상태입니다.
none 네트워크로 컨테이너를 실행합니다.
[root@docker /]# docker run --name centos5 --net=none -dit centos
cb3738c93d86a6d24ed014ee85181a7917cc59102d27075714364ac0e6054b57
컨테이너의 네트워크 설정정보 확인 시 loopback 네트워크 외 다른 네트워크는 설정되어있지 않습니다.
[root@docker /]# docker exec -it centos5 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
[root@docker /]#
고생하셨습니다 :)