273 votes

Transférer le port de l'hôte au conteneur docker

Est-il possible de faire en sorte qu'un conteneur Docker accède aux ports ouverts par l'hôte ? Concrètement, MongoDB et RabbitMQ fonctionnent sur l'hôte et j'aimerais exécuter un processus dans un conteneur Docker pour écouter la file d'attente et (éventuellement) écrire dans la base de données.

Je sais que je peux transférer un port du conteneur vers l'hôte (via l'option -p) et établir une connexion avec le monde extérieur (c'est-à-dire Internet) à partir du conteneur Docker, mais j'aimerais ne pas exposer les ports RabbitMQ et MongoDB de l'hôte au monde extérieur.

EDIT : quelques précisions :

Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-22 22:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
PORT     STATE SERVICE
6311/tcp open  unknown

joelkuiper@vps20528 ~ % docker run -i -t base /bin/bash
root@f043b4b235a7:/# apt-get install nmap
root@f043b4b235a7:/# nmap 172.16.42.1 -p 6311 # IP found via docker inspect -> gateway

Starting Nmap 6.00 ( http://nmap.org ) at 2013-07-22 20:43 UTC
Nmap scan report for 172.16.42.1
Host is up (0.000060s latency).
PORT     STATE    SERVICE
6311/tcp filtered unknown
MAC Address: E2:69:9C:11:42:65 (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 13.31 seconds

J'ai dû faire cette astuce pour obtenir une connexion internet à l'intérieur du conteneur : Mon pare-feu bloque les connexions réseau du conteneur Docker vers l'extérieur.

EDIT : Finalement, j'ai opté pour la création d'un pont personnalisé à l'aide de tuyauterie et que les services écoutent sur les IP du pont. J'ai choisi cette approche plutôt que de faire écouter MongoDB et RabbitMQ sur le pont docker, car elle offre plus de flexibilité.

9voto

Arigion Points 1332

J'ai eu un problème similaire pour accéder à un serveur LDAP à partir d'un conteneur docker. J'ai défini une IP fixe pour le conteneur et ajouté une règle de pare-feu.

docker-compose.yml:

version: '2'
services:
  containerName:
    image: dockerImageName:latest
    extra_hosts:
      - "dockerhost:192.168.50.1"
    networks:
      my_net:
        ipv4_address: 192.168.50.2
networks:
  my_net:
    ipam:
      config:
      - subnet: 192.168.50.0/24

règle iptables :

iptables -A INPUT -j ACCEPT -p tcp -s 192.168.50.2 -d $192.168.50.1 --dport portnumberOnHost

Accès à l'intérieur du conteneur dockerhost:portnumberOnHost

3voto

amcastror Points 463

Pour les versions plus récentes de Docker, cela a fonctionné pour moi. Créez le tunnel comme ceci (remarquez le 0.0.0.0 au début) :

-L 0.0.0.0:8080:localhost:8081

Cela permettra à toute personne ayant accès à votre ordinateur de se connecter au port 8080 et d'accéder ainsi au port 8081 du serveur connecté.

Ensuite, à l'intérieur du conteneur, utilisez simplement "host.docker.internal", par exemple :

curl host.docker.internal:8081

2voto

creack Points 11635

Si MongoDB et RabbitMQ sont exécutés sur l'hôte, le port devrait déjà être exposé, car il ne se trouve pas dans Docker.

Vous n'avez pas besoin de la -p afin d'exposer les ports du conteneur à l'hôte. Par défaut, tous les ports sont exposés. L'option -p vous permet d'exposer un port du conteneur à l'extérieur de l'hôte.

Donc, à mon avis, vous n'avez pas besoin de -p et tout devrait bien fonctionner :)

0voto

alexus Points 499

Pourquoi ne pas utiliser une solution un peu différente, comme celle-ci ?

services:
  kubefwd:
    image: txn2/kubefwd
    command: ...
  app:
    image: bash
    command:
     - sleep
     - inf
    init: true
    network_mode: service:kubefwd

REF : txn2/kubefwd : Transfert de port en masse des services Kubernetes pour le développement local.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X