Réseau Docker (mémorandum personnel)

Qu'est-ce qu'un pilote de pont?

Il s'agit d'un réseau configuré dans un hôte docker unique et utilisé lors de la création d'une configuration réseau relativement petite.

Démarrez un hôte docker sur Docker Machine et vérifiez le fonctionnement du réseau.

-#Créer un hôte Docker
% docker-machine create nw-vm1
-#Connectez-vous à la machine virtuelle avec ssh
% docker-machine ssh nw-vm
-#Vérifiez les réseaux existants
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
94ade5c5f1ae        bridge              bridge              local
3723c4561df4        host                host                local
105e9024e5d5        none                null                local

Le fonctionnement du réseau diffère selon le type de "DRIVER". Trois sont créés par défaut. Le conteneur appartient par défaut au réseau "pont".

Vérification détaillée du réseau

-#le réseau docker inspecte le nom du DRIVER
$ docker network inspect bridge

[
    {
        "Name": "bridge",
        "Id": "94ade5c5f1aed16a3637a2c40bed82ac50d51b8814737c5e9942d0f8e0a1fd4c",
        "Created": "2020-09-04T11:31:43.470419246Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

Vous pouvez vérifier le sous-réseau du réseau et l'ID de passerelle par défaut en consultant la colonne Config. Les conteneurs connectés au réseau de pont reçoivent des ips dans ce réseau. L'ip de la passerelle sera l'ip assigné à l'interface "docker0".

Vérification des informations d'interface

##Connexion SSH à l'hôte docker
$ ip addr show
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:78:70:eb brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe78:70eb/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:ae:f1:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.99.101/24 brd 192.168.99.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feae:f112/64 scope link 
       valid_lft forever preferred_lft forever
4: [email protected]: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:77:b5:fe:32 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

Vous pouvez vérifier l'ip de l'interface de Docker0.

Démarrer le conteneur alpin

$ docker run -itd —name alpine1 alpine /bin/sh
$ docker inspect bridge

Vous pouvez voir que le conteneur de alpine1 existe dans la colonne "Conteneurs" et que l'ip est attribué. Dans le réseau de pont par défaut, il est possible de communiquer avec des conteneurs existant dans le même réseau en spécifiant l'adresse IP.

Lancez un autre conteneur.

-#Lancer un conteneur pour "alpine 2" basé sur alpin
$ docker run -itd —name alpine2 alpine /bin/sh
-#Attachez-le au conteneur et vérifiez l'adresse IP.
$ docker attach alpine2
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
2: [email protected]: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
9: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

ip est attribué à alpine2 à 172.17.0.3.

Ignorez le ping et vérifiez que les conteneurs sont connectés.

# ping -w 3 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.389 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.140 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.116 ms

--- 172.17.0.2 ping statistics ---
4 packets transmitted, 3 packets received, 25% packet loss
round-trip min/avg/max = 0.116/0.215/0.389 ms

Il peut être confirmé que la communication avec alpine1 est possible.

La communication par nom de conteneur est également possible

Dans le réseau par défaut, le démon docker ne peut pas fournir de DNS, il n'est donc pas possible de communiquer en utilisant le nom du conteneur. Cela peut être résolu en utilisant un réseau de pont défini par l'utilisateur.

Création d'un réseau de pont défini par l'utilisateur

-#réseau docker créer un nom de réseau
$ docker network create my_nw 

Vous pouvez maintenant créer un réseau de pont appelé "my_nw".

Connexion entre conteneurs

-#docker network connect nom de réseau nom du conteneur
$ docker network connect my_nw alpine1
$ docker network connect my_nw alpine2

Dans ce qui précède, les conteneurs de "alpine1" et "alpine2" sont connectés au réseau "my_nw".

Connectez-vous à un réseau défini par l'utilisateur lors de la création d'un conteneur.

-# docker run -itd --nom Nouveau nom de conteneur--nom du réseau réseau Conteneur d'origine
$ docker run -itd --name alpine3 --network my_nw alpine

En spécifiant le réseau auquel vous souhaitez vous connecter dans l'argument de --network, il commencera dans l'état d'être connecté par ce réseau depuis le début. À propos, si vous spécifiez un réseau et le démarrez, il démarrera sans être connecté au réseau de pont par défaut.

Attachez-vous à alpine2 et ping alpine1 et alpine3.

-#Joindre avec alpine2
$ docker attach alpine2
-#Résultats omis
# Ping -w 3 alpine1
# Ping -w 3 alpine3

Il peut être confirmé que la communication est possible avec le nom du conteneur. Dans un réseau de pont défini par l'utilisateur, le DNS intégré du démon docker démarre et résout le nom avec le nom du conteneur. Le conteneur peut être connecté à une pluralité de réseaux.

Déconnectez le conteneur du réseau

-#docker net disconnect nom du réseau nom du conteneur
$ docker network disconnect bridge alpine2
-#Détails et confirmation alpine2
$ docker inspect alpine2

Le réseau "bridge" est déconnecté et seul le réseau "my_nw" est connecté. Le réseau pont peut sortir vers Internet, mais par défaut, il s'agit d'un réseau qui n'est pas ouvert sur le monde extérieur. En libérant le port spécifié par -p, le port spécifié du conteneur est accessible de l'extérieur.

Qu'est-ce que le non-réseau?

Un réseau dans lequel Driver est "nul". Le conteneur connecté au pilote "nul" n'a pas d'interface réseau autre que l'interface de bouclage. Les conteneurs qui se connectent à des non-réseaux doivent avoir d'autres réseaux déconnectés.

Qu'est-ce qu'un réseau hôte?

Réseau utilisant le pilote "hôte". Les conteneurs connectés au réseau hôte ont le même réseau que l'hôte docker. Si vous démarrez le serveur Web dans un conteneur sur le réseau hôte, il se comportera de la même manière que l'écoute sur l'ip 80 de la machine hôte. Vous pouvez vous connecter au port 80 du conteneur en accédant à l'ip 80 de l'hôte docker simplement en démarrant le conteneur sans utiliser -p.

Démarrer nginx

-#Vérifiez l'adresse IP de l'hôte docker
% docker-machine ip nw-vm1
-#connexion ssh
% docker-machine ssh nw-vm1
-#Lancez nginx en utilisant le réseau «hôte»
$ docker run -d —name web —network host nginx

Vous pouvez y accéder avec l'adresse IP et confirmer que nginx est en cours d'exécution.

Recommended Posts

Réseau Docker (mémorandum personnel)
Docker Machine (Mémorandum personnel)
Mémorandum Docker
Mémorandum technique (Docker)
Commande de mémorandum docker
Mémorandum de commande Docker
Lancer un conteneur docker sur EC2 (mémorandum personnel)
Construire un pipeline CICD à l'aide de Docker (mémorandum personnel)
Gestion des données à l'aide du volume dans Docker (mémorandum personnel)
résumé personnel de la commande docker
Qu'est-ce que Docker-compose (mémorandum personnel)
Création d'un hôte Docker sur AWS à l'aide de Docker Machine (mémorandum personnel)
Comment utiliser le tableau (mémorandum personnel)
mémorandum
mémorandum
docker
Construction d'environnement de rails avec Docker (apocalypse personnelle)
[Personnel] Mémorandum JUnit5 (travail en cours)