Je vois souvent des solutions qui exposent le port d'un conteneur Docker à l'hôte.
Dans mon cas, je veux transférer un port local d'un conteneur à un autre. Disons que j'exécute un service sur conteneur A qui a une configuration codée en dur pour accéder à db sur localhost 3306. Mais je veux exécuter le serveur db sur conteneur B.
Quelle est la meilleure façon de rediriger le port de A-localhost: 3306 à B-IP: 3306?
Installez socat
dans votre conteneur et au démarrage
socat TCP-LISTEN:3306,fork TCP:B-IP:3306 &
Cela écoutera localement sur votre 3306 et transmettra tout trafic bidirectionnel à B-IP:3306
. socat est disponible dans un package nommé socat. Vous exécuterez donc l'une des commandes ci-dessous pour l'installer
$ yum install -y socat
$ apt install -y socat
$ apk add socat
Édition-1
Vous pouvez même le faire en ne touchant pas votre conteneur d'origine
Dockerfile
FROM Alpine
RUN apk update && apk add socat
Construisez le fichier comme ci-dessous
docker build -t socat .
Maintenant, exécutez un conteneur de même
docker run --name mysql-bridge-a-to-b --net=container:<containerAid> socat socat TCP-LISTEN:3306,fork TCP:BIP:3306
Cela exécutera ce conteneur sur le réseau de A. Ainsi, quand il écoute sur le réseau de A, le localhost:3306
deviendra disponible dans A même si le conteneur A n'a pas été touché.
Vous pouvez simplement exécuter le conteneur avec un mode réseau égal à Host.
docker run --network=Host ...
Dans ce cas, du point de vue du conteneur, localhost ou 127.0.0.1 fera référence à la machine hôte. Ainsi, si votre base de données s'exécute dans un autre conteneur B qui écoute sur 3306, une adresse de localhost: 3306 dans le conteneur A frappera la base de données dans le conteneur B.
Si vous souhaitez que le port du conteneur B soit exposé en tant que port d'hôte local sur le conteneur A, vous pouvez démarrer le conteneur B avec l'option network
définie sur le mode container
pour démarrer le conteneur B sur l'espace de noms réseau du conteneur A.
Exemple:
docker run --net=container:A postgres
Où:
A
est le nom ou l'identifiant du conteneur dans lequel vous souhaitez mapper.Cela démarrera postgres dans un conteneur sur le même espace de noms réseau que A
, donc tout port ouvert dans le conteneur postgres sera ouvert sur la même interface que A
et devrait être disponible sur localhost
à l'intérieur du conteneur A.
Vous pouvez le faire avec Docker-Compose .
exemple avec docker-compose.yml:
version: '3'
services:
web:
build: .web
ports:
- "5000:5000"
mysql:
build: .mysql
ports:
- "3306:3306"
Ici, vous avez 2 instances de docker: web et mysql, de sorte que chaque instance de docker peut se voir en utilisant les noms que vous avez définis comme services.
J'espère que cela t'aides