네트워크 유형
- 도커에는 다양한 네트워크 드라이버가 있음
- 용도에 맞게 드라이버를 선택해서 사용
- 기본 네트워크 드라이버는 bridge, host, null 이 있음
- docker network ls 명령으로 목록 확인 가능
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5b8289ce8aa7 bridge bridge local
b8cce713f8c0 host host local
ba6cb7a8aee9 none null local
bridge
- bridge는 컨테이너가 사용하는 프라이빗 네트워크
- 같은 bridge 에 연결되어 있으면 컨테이너의 IP 주소로 통신할 수 있음
- 외부로 통신할 때에는 NAT 통신을 사용하며, 외부에서 bridge 로 통신하려면 포트포워딩을 사용해야함.
- 도커를 설치하면 이름이 docker0인 리눅스 브릿지가 생성되는데, 이는 docker network ls 명령의 출력에서 이름이 bridge 인 네트워크와 동일
[root@docker ~]# docker inspect bridge
...
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
- 마지막 Options 섹션에 bridge 네트워크의 옵션들이 나열되어 있는데 그 중 연결되어 있는 브릿지는 docker0 라고 나와있음.
- inspect로 확인할 수 있는 정보로는 해당 네트워크의 대역과 연결되어 있는 컨테이너의 목록 및 IP 주소 등을 알 수 있음.
- bridge 드라이버를 사용하는 네트워크는 여러 개 생성할 수 있으며 docker network create 명령을 사용함.
[root@docker ~]# docker network create --help
Usage: docker network create [OPTIONS] NETWORK
bridge 드라이버를 사용하는 net1 네트워크를 생성
[root@docker ~]# docker network create --subnet 192.168.90.0/24 --gateway 192.168.90.254 net1
dfa411a2c40b61a687fa75cd3598b254ea9345b90bde13763d6226c5ded9ba91
[root@docker ~]# docker network ls | grep net1
NETWORK ID NAME DRIVER SCOPE
dfa411a2c40b net1 bridge local
다음은 net1을 사용하는 os5 컨테이너 생성 및 확인
[root@docker ~]# docker run --name os5 --network net1 -itd centos
7f34873a260fe18a629f145b239841f2661f48590a087a1e0c6f1ae3664fa62c
[root@docker ~]# docker exec os5 ip a s
...
83: eth0@if84: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:5a:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.90.1/24 brd 192.168.90.255 scope global eth0
valid_lft forever preferred_lft forever
[root@docker ~]# docker inspect os5 | grep -i IP
...
"IPAMConfig": null,
"IPAddress": "192.168.90.1",
"IPPrefixLen": 24,
...
host
- 호스트에서 컨테이너의 네트워크 격리를 해제하여 호스트의 네트워크 정보를 공유해서 사용하는 방법
- 컨테이너는 호스트 입장에서 하나의 프로세스이기 때문에 가상머신과 다르게 네트워크 정보를 공유할 수 있음.
- 컨테이너가 이 네트워크를 사용할 때 컨테이너의 포트가 호스트에서 사용하는 포트와 충돌해서는 안됨.
host 드라이버를 사용하는 web4 컨테이너를 생성 및 확인
[root@docker ~]# docker run -d --name web4 --network host httpd
33ba113143f3e9801e2aa593b0d41c54db5cb65f344d56c09e44cd837c9cf4cf
[root@docker ~]# curl localhost
<html><body><h1>It works!</h1></body></html>
- bridge 드라이버를 사용하는 컨테이너는 curl 명령으로 웹 서버에 접근하려면 IP 주소를 알아야했음.
- web4 컨테이너는 localhost 로 조회 할 수 있음
- 호스트와 네트워크 정보를 같이 공유하기 때문
null(none)
- null 드라이버는 컨테이너의 네트워크 기능을 사용하지 않음
- 사용자 정의 네트워크 드라이버와 함께 사용
null 드라이버를 사용하는 os6 컨테이너를 실행하면서 ip a s 명령을 실행하고 종료
[root@docker ~]# docker run -it --name os6 --rm --network none centos ip a s
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 ~]# docker ps -a | grep os6
overlay
- overlay 드라이버는 서로 다른 도커 호스트의 컨테이너가 서로 통신할 수 한다.
- 단일 호스트인 경우에 사용하지 않으며 도커 스웜(Docker Swarm)과 같은 클러스터 서비스에 사용
macvlan
- macvlan 드라이버는 MAC 주소를 컨테이너에 할당하여 도커 데몬이 트래픽을 컨테이너의 MAC 주소로 라우팅할 수 있게 한다.
- 호스트의 네트워크를 통해 라우팅 하는 것이 아니라 컨테이너가 실제 네트워크에 직접 연결해야 할 때 사용
macvlan 아이피 확인
- macvlan 드라이버를 사용하려면 호스트의 인터페이스 중 하나의 네트워크 주소를 알아야 함.
- 컨테이너는 이 인터페이스와 같은 네트워크 대역을 IP를 할당받기 때문
[root@docker ~]# ip a show enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:a8:29:a3 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.4/24 brd 10.0.2.255 scope global noprefixroute dynamic enp0s3
valid_lft 520sec preferred_lft 520sec
inet6 fe80::b20:a37b:ec1b:15a5/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@docker ~]# ip link set enp0s3 promisc on
[root@docker ~]# ip a s enp0s3
2: enp0s3: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:a8:29:a3 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.4/24 brd 10.0.2.255 scope global noprefixroute dynamic enp0s3
valid_lft 441sec preferred_lft 441sec
inet6 fe80::b20:a37b:ec1b:15a5/64 scope link noprefixroute
valid_lft forever preferred_lft forever
macvlan 네트워크 생성
- 부모 인터페이스 카드를 지정하여 새로운 macvlan 네트워크를 생성
[root@docker ~]# docker network create -d macvlan --subnet=10.0.2.0/24 --gateway=10.0.2.1 --ip-range=10.0.2.64/26 -o parent=enp0s3 macvlan1
79d0ccc647c17fc58f6b5db0cfee90b2d743de14e06269ae4d2e386afb21d3ae
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
...
79d0ccc647c1 macvlan1 macvlan local
macvlan 드라이버를 사용하는 컨테이너 생성 후 IP 주소 확인 + 기능 확인
[root@docker ~]# docker run -itd --name os5 --network macvlan1 centos
f7efc97a35a8896e031f7d06f4603e892ae9e626e9ca8f19be3d33257e238d7e
[root@docker ~]# docker inspect os5 | grep -i IPA
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAMConfig": null,
"IPAddress": "10.0.2.64",
[root@docker ~]# docker run -itd --name os6 --network macvlan1 centos
e8d3df4fa54cd738d02dfd90450b342d80e64307503fd0e22c4b9a8407302a3c
[root@docker ~]# docker inspect os6 | grep -i ipaddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "10.0.2.65",
[root@docker ~]# docker exec -it os5 ping -c3 10.0.2.65
PING 10.0.2.65 (10.0.2.65) 56(84) bytes of data.
64 bytes from 10.0.2.65: icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from 10.0.2.65: icmp_seq=2 ttl=64 time=0.132 ms
64 bytes from 10.0.2.65: icmp_seq=3 ttl=64 time=0.131 ms
--- 10.0.2.65 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.081/0.114/0.132/0.026 ms
'도커 > 개념 및 실습' 카테고리의 다른 글
06장-1, 이미지 제작 및 업로드 (0) | 2021.06.03 |
---|---|
05장-2, 컨테이너의 통신 (0) | 2021.06.02 |
04장, 도커 볼륨 (0) | 2021.06.02 |
1, 2, 3장 연습문제 (0) | 2021.06.02 |
03장-3, 컨테이너 관리 (0) | 2021.06.02 |