Cet article illustre trois méthodes pour lier des conteneurs Docker.
Exposer les ports et la liaison de port
Exposer les ports
Cette méthode est utilisée au sein du même réseau ou de l'hôte docker. Les conteneurs sur le même réseau peuvent communiquer entre eux via leurs ports exposés et vous pouvez exposer les ports par l'une des méthodes ci-dessous.
– Mettez EXPOSE 80 (ou n'importe quel port de votre choix) dans votre Dockerfile qui indiquera à Docker que le service de votre conteneur peut être connecté au port 80.
– Exposez un port en utilisant '–expose [numéro de port]' à partir du conteneur docker par 'run –expose [numéro de port]' :
# docker run --expose=[port number] test
Liaison de port
Cette méthode est utilisée pour l'extérieur du même réseau. Pour autoriser la communication via les ports définis vers des conteneurs en dehors du même réseau, vous devez publier les ports en utilisant l'indicateur -p lors de l'exécution du docker pour publier et mapper un ou plusieurs ports, ou l'indicateur -P pour publier tous les ports exposés et mapper vers des ports d'ordre supérieur. Vous pouvez effectuer le portage via l'une des méthodes ci-dessous :
-Exposer un port via Dockerfile par –exposer et publiez-le avec le -P drapeau. Il liera le port exposé à l'hôte Docker sur un port aléatoire.
-Expose un port via Dockerfile par –exposer et publiez-le avec le -p 21:21 flag, cela liera le port d'exposition à l'hôte Docker sur un certain port 21 avec l'invité 21.
– Liez le port par la commande d'exécution du conteneur docker :
# docker run -p [port number on docker host]:[port number on container]/tcp -p [port number on docker host]:[port number on container]/udp test
Exemple :
# docker run -p 80:80/tcp -p 500:500/udp test
Socket de domaine Unix au sein d'un seul hôte
Pour communiquer entre les conteneurs au sein d'un même hôte, vous pouvez utiliser des mécanismes IPC sous Linux en utilisant le même socket.Démarrez les deux dockers depuis l'hôte docker partageant un volume qui doit être créé dans la machine hôte :
# docker run -d -it --name dvc1 -v /var/tmp:/host oraclelinux:7 /bin/bash # docker run -d -it --name dvc2 -v /var/tmp:/host oraclelinux:7 /bin/bash
Après la commande ci-dessus, les conteneurs dvc1 et dvc2 peuvent utiliser des sockets comme /var/tmp/SocketX à l'interconnexion.
Utiliser le mécanisme de lien Docker pour établir un lien entre les conteneurs
Docker peut créer un tunnel entre deux conteneurs en utilisant des variables d'environnement pour transmettre des informations du conteneur parent au conteneur enfant. Pour créer un lien, vous utilisez le –link drapeau :
# docker run -itd --name=[child container] --link [parent container] [child container image] /bin/bash
Exemple :
-Vérifier le réseau du conteneur parent :
# docker ps|grep dvc 7d5ad19de678 j_web:v1 "/bin/sh -c '/usr/bi…" 2 days ago Up 5 hours dvc1
# docker exec -it dvc1 /bin/bash # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:04 inet addr:172.17.0.4 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
-Liez les deux nouveaux conteneurs au conteneur parent :
# docker run -it --name dvc1_dup1 --rm --link dvc1 j_web:v1 /bin/bash
-Inspecter le conteneur lié :
# docker inspect -f "{{ .HostConfig.Links }}" dvc1_dup1 [/dvc1:/dvc1_dup1/dvc1]
-Vérifiez le fichier hôte du nouveau conteneur, il contient les informations du conteneur parent :
# docker exec -it dvc1_dup1 /bin/bash
[root@b56d465976bc /]# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.4 dvc1 7d5ad19de678 172.17.0.5 b56d465976bc [root@b56d465976bc /]#Avertissement :L'indicateur –link est une fonctionnalité héritée de Docker. Il peut éventuellement être supprimé. À moins que vous ne deviez absolument continuer à l'utiliser, nous vous recommandons d'utiliser des réseaux définis par l'utilisateur pour faciliter la communication entre deux conteneurs au lieu d'utiliser –link. Une fonctionnalité que les réseaux définis par l'utilisateur ne prennent pas en charge et que vous pouvez faire avec –link est le partage des variables d'environnement entre les conteneurs. Cependant, vous pouvez utiliser d'autres mécanismes tels que les volumes pour partager les variables d'environnement entre les conteneurs de manière plus contrôlée.