도커

[클라우드] 4. Docker Network

트리스탄1234 2022. 8. 5. 07:45
728x90
반응형

이번 글에서는 Docker에서 제공하는 Network 종류와 구조 그리고 사용방법에 대해서 알아 보겠 습니다.

Docker는 기본적으로 6가지 모드의 네트워크 형태를 제공 합니다. 그럼 하나 하나씩 어떤 기능과 구조를 가지고 있는지 확인해 봅시다.

Docker Network Type

1. Bridge Network은 컨테이너 생성시 어떤 드라이버를 사용할지 정의 하지 않으면, 설정되는 기본 네트워크 형태 입니다. Bridge Network은 어플리케이션이 독립 실행되는 컨테이너에서 실행될때,

사용을 합니다. 그 구조를 보면 아래와 같습니다.

Bridge Network는 Host 컴퓨터의 Ethernet Card를 가상의 Docker0와 연결을 시키고, 이 Docker 0는 컨테이너의 NIC인 veth에 연결을해 외부와 통신이 가능하게 해 줍니다.

Bridge Network 구조는 같은 Bridge에 연결된

컨테이너들 끼리만 통신을 할때 유용한 구조 합니다.

즉 다른 Bridge에 연결된 컨테이너와는 연결을 하지 않을때 사용을 합니다.

2.host Network 형태는 독립 실행형 컨테이너의 경우, 컨테이너와 Docker 호스트 간의 NameSpce를 분리 시키지 않고 바로 Host의 Ethenrnet에 바로 연결하여 사용하는 경우 입니다.

호스트 네트워크 모드를 사용하는 경우 해당 컨테이너의 네트워크는 Host의 Namespace를 공유하고, 컨테이너에 자체 IP 주소가 할당되지 않습니다. 예를 들어 포트 80에 바인딩된 컨테이너를 실행하고 호스트 네트워킹을 사용하는 경우 컨테이너의 애플리케이션은 호스트 IP 주소의 포트 80에서 사용할 수 있습니다.

호스트 모드는 Docker-0(NAT)가 필요하지 않기 때문에 컨테이너가 광범위한 포트를 처리해야 하는 상황과 성능을 최적화하는 데 유용 합니다.

3. overlay Network은 여러개의 Docker Daemon을 연결할때 즉 물리적으로 다른 컴퓨터에 있는 Docker끼리 연결을 하고 서로 통신하기 위한 사용을 할때 유용 합니다. 그 구조는 아래와 같습니다.

Overlay Network는 호스트의 네트워크 위에 (오버레이) 위치하므로 암호화가 활성화되어 있을 때 연결된 컨테이너 사이에서 안전하게 통신할 수 있게 해줍니다. .

4.ipvlan Network는 L2나 L3단에서 네트워크를 이용해 로컬 컨테이너들을 다른 네트웍에 있는

컨테이너들을 VLAN으로 분리 및 Grouping하는 기능을 제공 합니다. 또한 IPVLAN 모드에서는 컨테이너들은 Docker 0를 통해 Host의 Ethernet으로 연결이 되지 않고, 직접적으로 Host의 Ethernet으로 연결이 됩니다. 따라서 컨테이너들은 Host 모드와의 차이점은 Host 모드의 컨테이너들은 IP를 가지지 않고 Port기반으로 동작을 하지만, IPVLAN 모드에서의 컨테이너들은 모두 IP를 가지게 됩니다.

5.macvlan network은 일부 애플리케이션, 특히 레거시 애플리케이션 또는 네트워크 트래픽을 모니터링하는 애플리케이션은 물리적 네트워크에 직접 연결을 요구 합니다.

이러한 유형의 상황에서 macvlan 네트워크 드라이버를 사용하여 각 컨테이너의 가상 네트워크 인터페이스에 MAC 주소를 할당하여 물리적 네트워크에 직접 연결된 물리적 네트워크 인터페이스처럼 보이게 할 수 있습니다. IPVLAN Network은 IP기반의 VLAN이지만, macvlan은 Mac 주소 기반의 VLAN기능을 제공한다고 생각을 하면 됩니다. 이

6. Network Plugins Network은 각 벤더에서 제작한 Network driver를 이용하여 사용하는 모드 입니다.

Docker Network Command

그럼 이제 Docker network명령을 이용해 설정 및 확인 하는 방법을 살펴 봅시다.

Docker를 설치 하고 나면 아래 그림과 같이 bridge, host, none 3개의 네트웍이 생성이 됩니다.

  • 명령어

- docker network ls

컨테이너 실행시 별도의 옵션을 주지 않으면 bridge network에 연결이 됩니다.

그럼 이제 bridge network의 설정 정보를 살펴 봅시다

  • 명령어

- docker network inspect bridge(네트워크 이름)

root@test-VirtualBox:~# docker network inspect bridge
[
{
"Name": "bridge", ==> network 이름
"Id": "03e5bdb50cb6796b96bd824605c2141574a5d380cd977652f607d1a9a8ba54d7",
"Created": "2022-07-07T13:57:51.186733306+09:00",
"Scope": "local",
"Driver": "bridge", ==> bridge mode 사용
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16", ==> bridge mode의 IP 범위
"Gateway": "172.17.0.1" ==> docker-0의 IP 주소
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
},
"Labels": {}
}
]
root@test-VirtualBox:~#

위의 그림과 같이 inspect 명령으로 자세한 정보를 볼수가 있습니다.

그럼 이번에는 test용 네트워크를 생성해 봅시다

  • 명령어

- docker network cre3ate --driver <<네트워크 티입>> <<네트워크 이름>>

root@test-VirtualBox:~# docker network create --driver bridge test
674bfaad67f5df5c4efcc4a6d0d4c04482dccc0595c266e825197890e25c974c
root@test-VirtualBox:~#
root@test-VirtualBox:~#
root@test-VirtualBox:~#
root@test-VirtualBox:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
03e5bdb50cb6 bridge bridge local
b31d94bf54a8 host host local
dc0909f33f46 none null local
674bfaad67f5 test bridge local
root@test-VirtualBox:~#

네트워크 ID가 674bfaad67f5이고, 이름은test이며 타입은 bridge인 네트웍이 하나 생성이 되었습니다.

그럼 이제 docker를 하나 실행 시키고, 그 컨테이너를 test network에서 실행 되도록 해봅시다.

  • 명령어

- docker run -itd --name my-engine --net test nginx

-itd 옵션은 인터엑티브 모드로 백그라운드에서 컨테이너를 시킨다는 옵션값 입니다.

- --name my-engine 은 실행하는 컨테이너 이름이 my-engine으로 실행 시킨다는 의미 입니다.

- --net test는 my-engine 컨테이너를 test network에 실행시킨다는 의미 입니다.

- nginx는 실행시킬 컨테이너의 이미지를 정의 합니다.

root@test-VirtualBox:~# docker run -itd --name my-engine --net test nginx
3973286939aa060312678ebce43a451f9f9a034ce12bd3fdff39868571f05be8
root@test-VirtualBox:~#
root@test-VirtualBox:~#
root@test-VirtualBox:~#
root@test-VirtualBox:~#
root@test-VirtualBox:~#
root@test-VirtualBox:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3973286939aa nginx "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 80/tcp my-engin

"NetworkSettings": {
"Bridge": "",
"SandboxID": "189618be16ff310bfe5a88589291fdfa16cb0aa0ffa6e1726d037bd04c9da62a",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": null
},
"SandboxKey": "/var/run/docker/netns/189618be16ff",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"test": { ==> test 네트웍으로 연결
"IPAMConfig": null,
"Links": null,
"Aliases": [
"3973286939aa"
],
"NetworkID": "674bfaad67f5df5c4efcc4a6d0d4c04482dccc0595c266e825197890e25c974c",
"EndpointID": "fa19ad676ec0331faef7b2a3931ff3f27789e983b0779a4dd882e72e33ebf123",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2", ==> my-engine의 IP 주소
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02",
"DriverOpts": null
}
}
}
}
]

위에서 network부분을 보면 test라는 부분에 컨테이너가 연결이 되어 있음을 알수 있습니다.

그럼 my-engine 컨테이너를 test network에서 제거해 봅시다.

  • 명령어

- docker network disconnect test my-engine ==> my-engine 컨테이너를 bridge network에 연결

root@test-VirtualBox:~# docker network disconnect test my-engine ==> 컨테이너 제거
root@test-VirtualBox:~# docker inspect my-engine ==> 컨테이너 정보 확인
"NetworkSettings": {
"Bridge": "",
"SandboxID": "189618be16ff310bfe5a88589291fdfa16cb0aa0ffa6e1726d037bd04c9da62a",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/189618be16ff",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {}
}
}
]

위의 그림에서와 같이 network부분을 보면 my-engine컨테이너의 네트워크 정보가 없는것을 확인할 수 있습니다.

그럼 이제 다시 my-engine 컨테이너를 bridge network에 연결을해 봅시다.

  • 명령어

- docker network connect <<네트워크 이름>> << 컨테이너 이름>>

root@test-VirtualBox:~# docker network connect bridge my-engine ==> bridge에 연결
root@test-VirtualBox:~# docker inspect my-engine ==> 컨테이너 정보 확인
"Networks": {
"bridge": { ===> Netwok 이름
"IPAMConfig": {},
"Links": null,
"Aliases": [],
"NetworkID": "03e5bdb50cb6796b96bd824605c2141574a5d380cd977652f607d1a9a8ba54d7",
"EndpointID": "2653b6943d732d946ebf9cb2c59088b5ea61d9d0a545ecc8a8e5e0b1f859964b",
"Gateway": "172.17.0.1", ==> Docker-0 IP
"IPAddress": "172.17.0.2", ==> 컨테이너 IP
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": {}
}
}
}
}
]

위와 같이 컨테이너가 bridge Network에 연결이 된것을 알수 있습니다.

그럼 이제 마지막으로 앞에 생성한 Test라는 Network을 삭제해 봅시다.

  • 명령어

- docker network rm <<네트워크 이름>>

root@test-VirtualBox:~# docker network ls ==> 생성된 네트워크 확인
NETWORK ID NAME DRIVER SCOPE
03e5bdb50cb6 bridge bridge local
b31d94bf54a8 host host local
dc0909f33f46 none null local
f4c6ae8f744e test bridge local
root@test-VirtualBox:~#
root@test-VirtualBox:~#
root@test-VirtualBox:~# docker network rm test ==> test 네트워크 삭제
test
root@test-VirtualBox:~#
root@test-VirtualBox:~# docker network ls ==> 생성된 네트워크 확인
NETWORK ID NAME DRIVER SCOPE
03e5bdb50cb6 bridge bridge local
b31d94bf54a8 host host local
dc0909f33f46 none null local

위와 같이 해당 명령어로 test network이 삭제 될것을 확인할 수 있습니다.

그럼 오늘 포스팅은 여기까지 하겠 습니다.

#docker network

#network type

#bridge network

#overlay network

#host network

#macvlan network

#ipvlan network

#docker network ls

#docker nerwork create

#docker networm rm

#docker network connect

#docker nerwork disconnect

728x90
반응형