web-dev-qa-db-fra.com

Comment puis-je transférer un port d'un conteneur Docker à un autre?

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?

11
Marinos An

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é.

15
Tarun Lalwani

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.

6
yamenk

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.

1
Leigh McCulloch

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

0
Jorge Chavez