Docker - Networks + Load balancing

Naważniejsze komendy

Wyświetl sieci / VPC:

docker network ls

Szczegóły konfiguracji:

docker network inspect

Utwórz nową sieć:

docker network create <>

Podłączenie / rozłączenie sieci z kontenerem:

docker network connect

docker network disconnect

Zaczynamy podstawy

Pamiętaj aby kontenery były w tej same sieci VPC aby mogły komunikować się z sobą. Dla przykładu front-end i back-end.

$ docker network create my_vpc
a120f56169066097f7a6725fa36e9c7de17a9d1cb6cb4b83669e534f7b84471c
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f96820e040e7        bridge              bridge              local
21fb2d66d4bf        host                host                local
a120f5616906        my_vpc              bridge              local
1df57004929e        none                null                local
$ docker container run -d --name httpd_vpc --network my_vpc httpd:2.4
45adf5a2d755b62434964bb858d8b0aed68d336e9abd03a05f23cda03de258e8
$ docker network inspect my_vpc
[
    {
        "Name": "my_vpc",
        "Id": "a120f56169066097f7a6725fa36e9c7de17a9d1cb6cb4b83669e534f7b84471c",
        "Created": "2018-10-31T22:01:03.1142723Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "45adf5a2d755b62434964bb858d8b0aed68d336e9abd03a05f23cda03de258e8": {
                "Name": "httpd_vpc",
                "EndpointID": "fe4bb87723da64a066a2c0be1408e8f450c0bc37fe617e49d3d86f38ae9a9bfc",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
$ docker network connect my_vpc ubuntu
$ docker network inspect my_vpc
[
    {
        "Name": "my_vpc",
        "Id": "a120f56169066097f7a6725fa36e9c7de17a9d1cb6cb4b83669e534f7b84471c",
        "Created": "2018-10-31T22:01:03.1142723Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "45adf5a2d755b62434964bb858d8b0aed68d336e9abd03a05f23cda03de258e8": {
                "Name": "httpd_vpc",
                "EndpointID": "fe4bb87723da64a066a2c0be1408e8f450c0bc37fe617e49d3d86f38ae9a9bfc",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "cdd389ac1f6f8f83b257104eae229401c537c0d4a08abf9b2795a009ac9a32dd": {
                "Name": "ubuntu",
                "EndpointID": "b129dd3a637e870931d91dea69d9b6221608796e5ce52ba1402969af3b740f3e",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]


DNS

Najwygodniejszy sposób użycia domen DNS jest użyciem nazw kontenerów. Przykład

$ docker container exec -it ubuntu curl httpd_vpc

It works!

DNS Round Robin - almost Load Balancing

Jeżeli potrzebujesz użyć bliskiego load balancingu czyli rozdzielać ruch między dwoma i więcej kontenerami. Przygotowuje 3 kontenery httpd z zmienionym "It works".

$ docker network create my_vpc_lb
$ docker container run -it -d --net my_vpc_lb --net-alias my_lb httpd:2.4
$ docker container run -it -d --net my_vpc_lb --net-alias my_lb httpd:2.4
$ docker container run -it -d --net my_vpc_lb --net-alias my_lb httpd:2.4

$ docker container ls
$ docker container exec -it <<ID>> bash
root@dee376719358:/usr/local/apache2# echo inst1 >> htdocs/index.html
root@dee376719358:/usr/local/apache2# exit
exit

Teraz uruchomimy nowy kontener jako clienta w VPC utworzonym np. ubuntu i zainstalujemy CURL

$ docker container run -it --net my_vpc_lb ubuntu
#apt-get update && apt-get install -y curl

Przechodzimy do testu wewnątrz ubuntu i odwołanie do DNS RR: my_lb

root@5a9c42637ef6:/# curl my_lb
inst3
root@5a9c42637ef6:/# curl my_lb
ins1
root@5a9c42637ef6:/# curl my_lb
ins2
root@5a9c42637ef6:/# curl my_lb
ins1
root@5a9c42637ef6:/# curl my_lb
inst2