Overlay Network
오버레이 네트워크는 물리적 네트워크 위에 존재하는 가상의 네트워크로, 다른 네트워크들을 연결하는 논리적 네트워크입니다. 도커에서는 여러 도커 데몬간의 오버레이 네트워크를 구축하여 도커 스웜과 같은 컨테이너 오케스트레이션 툴을 이용하기도 합니다.

Docker Daemon
도커는 기본적으로 Server - Client 구조입니다. 서버 역할을 하는 도커 데몬에 사용자가 도커 cli로 데몬에 요청을 보냅니다. 그러면 도커 호스트에서 해당 동작을 수행하게 되는 것입니다. 그래서 docker 명령어에 -H ${host address}와 같은 옵션으로 호스트를 지정해주면 원격으로 도커 명령어를 수행할 수 있게 됩니다.

데모
처음부터 진행하기에는 꽤나 길어질 내용이라 구성된 인프라로 테스트 해보겠습니다.

인프라에는 user-defined overlay network인 custum-net에 swarm node 세 대가 붙어있습니다.
docker network inspect custum-net
[
{
"Name": "custum-net",
"Id": "5257liid3l6qrp7i31waxdamz",
"Created": "2022-12-14T04:04:33.013226544Z",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "10.0.2.0/24",
"Gateway": "10.0.2.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"d239c9635095666813d3f65f992c3fd7575544a4dd900e9bd458ec9296b5c54a": {
"Name": "my-nginx.4.nty6aqln9ppqs83mxld22md02",
"EndpointID": "6ae4f98193a31ce79964b9305be2305b81d53baabf804589414adeec94c8e03d",
"MacAddress": "02:42:0a:00:02:03",
"IPv4Address": "10.0.2.3/24",
"IPv6Address": ""
},
"f59afea9cadd3d19f6f2ed987f84b16303d14c0ac50c7151db1e11f085c4cb68": {
"Name": "my-nginx.3.npjjfmm4w73k9ogtgd92zlsi4",
"EndpointID": "6b515f9404d4bc9ba4108d5662b93f7589dc5bf520d0710370f9b69f62d6e2ce",
"MacAddress": "02:42:0a:00:02:05",
"IPv4Address": "10.0.2.5/24",
"IPv6Address": ""
},
"fd9a40bfed2695fca1af629c3a76fa05d13201d344c06677610aef195a3ba588": {
"Name": "my-nginx.1.ldmnj1skpcmk3rx475mvyvme9",
"EndpointID": "06e1cd7354a46ca5f06e0ee8b3f3481ac4b13cd6bcf6eb7961133ad8f4705143",
"MacAddress": "02:42:0a:00:02:08",
"IPv4Address": "10.0.2.8/24",
"IPv6Address": ""
},
"lb-custum-net": {
"Name": "custum-net-endpoint",
"EndpointID": "daa6a432e24f614f9fb09706bced2e802fa916ab4397c69ce26ea263837f0898",
"MacAddress": "02:42:0a:00:02:04",
"IPv4Address": "10.0.2.4/24",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "4098"
},
"Labels": {},
"Peers": [
{
"Name": "e8d71adfb940",
"IP": "172.31.42.70"
},
{
"Name": "fcd5ce6ddddb",
"IP": "172.31.32.53"
}
]
}
]
그 중 두 대에 컨테이너에 nginx컨테이너가 띄워져있는 상태입니다. 다른 도커 호스트에 떠 있는 상태니 원래라면 서로 통신이 되지 않아야 정상입니다. 하지만 두 컨테이너 모두 user-defined overlay network에 붙어있기 때문에 alias/ip로 통신할 수 있는 모습을 볼 수 있습니다
curl my-nginx.5.5dpttzr6vx5khmi6m734rkwd7
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
custum bridge network에 있는 DNS Resolve기능또한 지원하기 때문에 가능한 모습입니다. 이러한 docker swarm 구성은 custum-net으로만 이루어진 구성은 아니고, docker_gwbridge와 ingress의 도움을 받습니다. 간단히 설명하면 아래와 같습니다.
- docker_gwbridge : Overlay Network를 각각의 도커 데몬에 연결해주는 네트워크
- ingress : service의 노드들 사이에서 로드밸런싱을 수행합니다. 이 또한 overlay network이기 때문에 docker_gwbridge를 통해 연결됩니다.
ETC
오늘은 왠지 그림을 그리고 싶더라고요. 요새 날씨가 추운데 따듯하게 입고 다니시길.

Overlay Network
오버레이 네트워크는 물리적 네트워크 위에 존재하는 가상의 네트워크로, 다른 네트워크들을 연결하는 논리적 네트워크입니다. 도커에서는 여러 도커 데몬간의 오버레이 네트워크를 구축하여 도커 스웜과 같은 컨테이너 오케스트레이션 툴을 이용하기도 합니다.

Docker Daemon
도커는 기본적으로 Server - Client 구조입니다. 서버 역할을 하는 도커 데몬에 사용자가 도커 cli로 데몬에 요청을 보냅니다. 그러면 도커 호스트에서 해당 동작을 수행하게 되는 것입니다. 그래서 docker 명령어에 -H ${host address}와 같은 옵션으로 호스트를 지정해주면 원격으로 도커 명령어를 수행할 수 있게 됩니다.

데모
처음부터 진행하기에는 꽤나 길어질 내용이라 구성된 인프라로 테스트 해보겠습니다.

인프라에는 user-defined overlay network인 custum-net에 swarm node 세 대가 붙어있습니다.
docker network inspect custum-net
[
{
"Name": "custum-net",
"Id": "5257liid3l6qrp7i31waxdamz",
"Created": "2022-12-14T04:04:33.013226544Z",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "10.0.2.0/24",
"Gateway": "10.0.2.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"d239c9635095666813d3f65f992c3fd7575544a4dd900e9bd458ec9296b5c54a": {
"Name": "my-nginx.4.nty6aqln9ppqs83mxld22md02",
"EndpointID": "6ae4f98193a31ce79964b9305be2305b81d53baabf804589414adeec94c8e03d",
"MacAddress": "02:42:0a:00:02:03",
"IPv4Address": "10.0.2.3/24",
"IPv6Address": ""
},
"f59afea9cadd3d19f6f2ed987f84b16303d14c0ac50c7151db1e11f085c4cb68": {
"Name": "my-nginx.3.npjjfmm4w73k9ogtgd92zlsi4",
"EndpointID": "6b515f9404d4bc9ba4108d5662b93f7589dc5bf520d0710370f9b69f62d6e2ce",
"MacAddress": "02:42:0a:00:02:05",
"IPv4Address": "10.0.2.5/24",
"IPv6Address": ""
},
"fd9a40bfed2695fca1af629c3a76fa05d13201d344c06677610aef195a3ba588": {
"Name": "my-nginx.1.ldmnj1skpcmk3rx475mvyvme9",
"EndpointID": "06e1cd7354a46ca5f06e0ee8b3f3481ac4b13cd6bcf6eb7961133ad8f4705143",
"MacAddress": "02:42:0a:00:02:08",
"IPv4Address": "10.0.2.8/24",
"IPv6Address": ""
},
"lb-custum-net": {
"Name": "custum-net-endpoint",
"EndpointID": "daa6a432e24f614f9fb09706bced2e802fa916ab4397c69ce26ea263837f0898",
"MacAddress": "02:42:0a:00:02:04",
"IPv4Address": "10.0.2.4/24",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "4098"
},
"Labels": {},
"Peers": [
{
"Name": "e8d71adfb940",
"IP": "172.31.42.70"
},
{
"Name": "fcd5ce6ddddb",
"IP": "172.31.32.53"
}
]
}
]
그 중 두 대에 컨테이너에 nginx컨테이너가 띄워져있는 상태입니다. 다른 도커 호스트에 떠 있는 상태니 원래라면 서로 통신이 되지 않아야 정상입니다. 하지만 두 컨테이너 모두 user-defined overlay network에 붙어있기 때문에 alias/ip로 통신할 수 있는 모습을 볼 수 있습니다
curl my-nginx.5.5dpttzr6vx5khmi6m734rkwd7
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
custum bridge network에 있는 DNS Resolve기능또한 지원하기 때문에 가능한 모습입니다. 이러한 docker swarm 구성은 custum-net으로만 이루어진 구성은 아니고, docker_gwbridge와 ingress의 도움을 받습니다. 간단히 설명하면 아래와 같습니다.
- docker_gwbridge : Overlay Network를 각각의 도커 데몬에 연결해주는 네트워크
- ingress : service의 노드들 사이에서 로드밸런싱을 수행합니다. 이 또한 overlay network이기 때문에 docker_gwbridge를 통해 연결됩니다.
ETC
오늘은 왠지 그림을 그리고 싶더라고요. 요새 날씨가 추운데 따듯하게 입고 다니시길.
