Image showing Comment accéder au port hôte dans un conteneur Docker ?

Comment accéder au port hôte dans un conteneur Docker ?

affiliate best offer

La plupart du temps, lorsque vous configurez votre cluster Kubernetes, l’utilisation des paramètres du contrôleur d’entrée par défaut fonctionne. Mais lorsque vous devez faire quelque chose de personnalisé, vous pouvez rencontrer des problèmes.

Votre docker sous-jacent et votre moteur kubernetes peuvent vous donner des têtes. Nous allons voir dans cette soluce, comment les réparer et vous redonner le sourire.

TL;DR

Vous devez utiliser l’adresse IP de l’interface docker0 de votre serveur. J’utilise Linux sur mon serveur.

ip addr show docker0

Vous obtenez cette réponse :

docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 00:00:00:00:00:00 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
    inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link 
       valid_lft forever preferred_lft forever

Ma config

J’exécute docker nativement à partir d’une machine Linux. Jenkins est installé dessus. Lorsqu’une nouvelle fonctionnalité est prête, je pousse le code vers le référentiel et mon processus CI/CD se déclenche.

Il exécute Jenkins et est supposé se connecter à l’interface Web pour effectuer certaines actions.

Mon problème

Compte tenu de la configuration ci-dessus, j’ai besoin de Jenkins pour pouvoir me connecter à l’interface Web. Mais dans ce cas, jenkins ne peut pas se connecter.

Je pense que c’est parce que la configuration à l’intérieur du docker ne le permet pas.

La solution

Voici les étapes que j’ai utilisées pour résoudre mon problème.

### Étape 1 : Obtenir l’adresse IP de l’hôte

L’exécution de cette commande vous permettra de récupérer l’adresse IP de votre hôte.

ip addr show docker0

Vous obtiendrez cette réponse :

7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 00:00:00:00:00:00 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
    inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link 
       valid_lft forever preferred_lft forever

### Étape 2 : Obtenir l’adresse IP du conteneur

Connectez-vous au conteneur et exécutez cette commande :

ip route show

Vous obtenez cette réponse :

default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  src 172.17.0.4 

Étape 3 : Configurez votre pare-feu pour accepter la connexion d’autres conteneurs Docker (facultatif)

L’exécution de cette commande autorise les connexions pour mon conteneur. Votre situation pourrait être différente. Il peut y avoir d’autres règles configurées dans le pare-feu. Vérifiez le pare-feu et adaptez la commande.

iptables -A INPUT -i docker0 -j ACCEPT

Remarque

Les règles Iptables sont ordonnées, et cette règle peut ou non faire la bonne chose en fonction des autres règles qui la précèdent.

Étape 4 : Connectez Jenkins et profitez-en

Maintenant que tout est configuré, je peux configurer mon jenkins et le connecter à l’interface Web. Prendre plaisir.

Une solution alternative (non recommandée)

L’idée ici est d’utiliser l’option brutale ? --net=host.

Vous exécutez le conteneur frontal Web avec l’option --net=host. Cela rendra le localhost du conteneur identique au localhost du serveur.

Jenkins pourra alors se connecter à l’interface Web comme s’il se connectait à l’hôte local du serveur.

Pour en savoir plus sur la façon de connecter jenkins à localhost, consultez ce tutoriel.

Peu de choses que j’ai essayées et qui n’ont pas fonctionné

Connectez-vous directement à l’adresse IP de l’hôte

J’ai essayé de me connecter à l’application Web en utilisant l’adresse IP de l’hôte, mais cela a échoué.

curl http://172.17.1.78:7000/

La réponse que j’ai eue était

curl: (7) Failed to connect to 172.17.1.78 port 7000: No route to host

Utilisez l’adresse interne magique

J’ai essayé, mes excuses. Mais je vous encourage à le faire.

À partir de docker 18.03 et supérieur, il existe un enregistrement DNS qui pointe vers votre adresse IP interne “host.docker.internal”. Utilisez-le pour vous connecter à vos applications conteneurisées.

Plus d’informations ici.

Des astuces

Comment obtenir l’adresse IP de l’hôte

Si vous avez besoin d’obtenir l’adresse IP de l’hôte exécutant votre conteneur Docker, exécutez cette commande :

ip addr show docker0 | grep -Po 'inet \K[\d.]+'

Comment obtenir l’adresse IP du conteneur

Ce script bash rapide récupère l’adresse IP de votre conteneur Linux.

#!/bin/sh

hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip
Full Bright

Full Bright

A professional and sympathic business man.

Contact

Contact Us

To order one of our services, navigate to the order service page

Address

10 rue de Penthièvre,
75008 Paris

Email Us

hello at bright-softwares dot com

Open Hours

Monday - Friday
9:00AM - 05:00PM