- Principes Fondamentaux du Mappage de Ports des Conteneurs
- Défis de l'Ajout Dynamique de Mappages de Ports
- 2.1 Création d'un Conteneur Proxy à l'Aide de docker network
- 2.2 Ajout Manuel de Règles de Redirection de Ports à l'Aide d'iptables
- 2.3 Utilisation de socat pour Créer une Redirection de Ports
- 2.4 Mise à Jour Dynamique des Services à l'Aide de Docker Compose
- 2.5 Modification Forcée du Fichier de Configuration du Conteneur
Le mappage de ports est un aspect crucial du développement et du déploiement d’applications conteneurisées. En général, nous établissons une connexion entre un port interne d’un conteneur et un port de la machine hôte lors de la création du conteneur. Cependant, il existe des situations où nous pourrions avoir besoin d’ajouter dynamiquement de nouveaux mappages de ports à un conteneur déjà en cours d’exécution. Cela peut être particulièrement utile lors du développement, du débogage ou de l’exposition temporaire de nouveaux points de terminaison de service. Cet article fournira une explication détaillée de la manière d’ajouter dynamiquement des mappages de ports à un conteneur sans avoir à l’arrêter.
1.Connaissances de Base
Principes Fondamentaux du Mappage de Ports des Conteneurs
Dans Docker, la connexion entre un port interne d’un conteneur et le port de la machine hôte est facilitée par le mappage de ports. En général, nous spécifions les mappages de ports à l’aide des paramètres -p ou --publish lors du démarrage d’un conteneur, comme illustré ci-dessous :
docker run -d -p 8080:80 nginx
La commande ci-dessus mappe le port 8080 de la machine hôte au port 80 à l’intérieur du conteneur. En conséquence, les utilisateurs externes peuvent accéder au service Web exécuté dans le conteneur via le port 8080 de l’hôte.
Défis de l’Ajout Dynamique de Mappages de Ports
Une fois qu’un conteneur a démarré, Docker ne prend généralement pas en charge l’ajout dynamique de nouveaux mappages de ports. En d’autres termes, les mappages de ports initiaux restent fixes tout au long du cycle de vie du conteneur. Si vous devez ajouter d’autres mappages de ports, l’approche traditionnelle consiste à arrêter et redémarrer le conteneur, ce qui peut perturber les services et est inacceptable dans les environnements de production.
2.Solutions de Mise en Œuvre
Pour ajouter dynamiquement des mappages de ports à un conteneur en cours d’exécution, plusieurs méthodes peuvent être employées :
2.1 Création d’un Conteneur Proxy à l’Aide de docker network
Un nouveau conteneur proxy peut être créé sur le même réseau que le conteneur d’origine, et les nouveaux mappages de ports peuvent être ajoutés au conteneur proxy. Les étapes spécifiques sont les suivantes : Tout d’abord, créez un conteneur proxy sur le même réseau que le conteneur d’origine :
docker run -d --name proxy-container --net container:your-container nginx
Ensuite, ajoutez le mappage de port souhaité au conteneur proxy :
docker run -d -p 8081:81 --net container:your-container nginx
Utilisez avec prudence. Bien que cette méthode permette d’ajouter de nouveaux mappages de ports sans modifier le conteneur d’origine, elle introduit une instance de conteneur supplémentaire et peut ne pas convenir à tous les scénarios.
2.2 Ajout Manuel de Règles de Redirection de Ports à l’Aide d’iptables
En modifiant iptables, vous pouvez rediriger les requêtes d’un port spécifique de la machine hôte vers le port interne du conteneur Docker en cours d’exécution. Par exemple, pour mapper le port 8081 de l’hôte au port 81 du conteneur, utilisez la commande suivante :
iptables -t nat -A DOCKER -p tcp --dport 8081 -j DNAT --to-destination <container_ip>:81
Où <container_ip> est l’adresse IP interne du conteneur, qui peut être obtenue à l’aide de la commande docker inspect. Cette méthode offre une flexibilité totale pour ajouter des mappages de ports, mais nécessite une bonne compréhension d’iptables et n’est pas recommandée pour une utilisation fréquente en production en raison de sa complexité.
2.3 Utilisation de socat pour Créer une Redirection de Ports
socat est un outil réseau polyvalent qui peut établir une redirection de ports entre la machine hôte et un conteneur. Vous pouvez exécuter la commande suivante pour rediriger un port spécifique de la machine hôte vers un port désigné dans le conteneur :
socat TCP-LISTEN:8081,fork TCP:<container_ip>:81
Utilisez avec prudence. L’avantage de cette méthode est qu’elle ne nécessite pas d’arrêter le conteneur. Cependant, comme socat est un processus supplémentaire, vous devez être conscient de ses performances et de sa stabilité. D’autres outils de redirection de ports peuvent obtenir des résultats similaires.
2.4 Mise à Jour Dynamique des Services à l’Aide de Docker Compose
Si votre application utilise Docker Compose pour gérer les conteneurs, vous pouvez ajouter de nouveaux mappages de ports en mettant à jour le fichier docker-compose.yml, puis en exécutant docker-compose up. Cette méthode est pratique et offre une gestion unifiée, mais chaque mise à jour nécessite de réappliquer le fichier Compose, ce qui peut entraîner des interruptions temporaires de service.
2.5 Modification Forcée du Fichier de Configuration du Conteneur
Tout d’abord, modifiez directement le fichier /var/lib/docker/containers/<container_id>/config.v2.json en ajoutant le mappage pour le port hôte 8081 vers le port 81 du conteneur. Notez que vous devez modifier deux sections. Dans une section, vous devez simplement ajouter HostPort 8081 :
"ExposedPorts": {
"8080/tcp": {}
"8081/tcp": {}
},
Dans l’autre section, vous devez ajouter la relation de mappage complète :
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
},
],
"81/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8081"
},
]
},
De plus, vous devez également modifier /var/lib/docker/containers/<container_id>/hostconfig.json et ajouter le nouveau mappage :
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "8080"
},
"81/tcp": [
{
"HostIp": "",
"HostPort": "8081"
}
]
},
Enfin, vous devez redémarrer dockerd :
sudo systemctl restart docker
Cette méthode peut ajouter définitivement des mappages de ports au conteneur, mais elle a également l’effet secondaire d’arrêter tous les conteneurs de la machine hôte en raison du redémarrage de dockerd. Si les conteneurs ne sont pas configurés pour un démarrage automatique, ils ne redémarreront pas automatiquement même après le redémarrage de dockerd. Bien que cette méthode soit efficace, elle peut avoir un impact significatif sur les conteneurs en cours d’exécution et n’est pas recommandée dans les environnements de production.
3.Conclusion
Bien que l’ajout dynamique de mappages de ports aux conteneurs ne soit pas une fonctionnalité native de Docker, les méthodes décrites ci-dessus peuvent aider à y parvenir dans une certaine mesure. Chaque méthode a ses avantages et ses inconvénients, et les développeurs peuvent choisir la plus adaptée en fonction de leurs besoins spécifiques. Dans les environnements de production, l’utilisation de conteneurs proxy ou de Docker Compose est recommandée car ils sont relativement simples et moins risqués. Pour les applications qui nécessitent des modifications fréquentes des mappages de ports, il est conseillé d’envisager une architecture réseau flexible lors de la phase de conception afin d’éviter des modifications fréquentes des mappages de ports pendant l’exécution du conteneur, minimisant ainsi les interruptions de service.
Vous pouvez visiter Novita AI pour plus de détails !
