Est-il possible d'ouvrir des ports d'accès au conteneur Docker par l'hôte? Concrètement, j'ai MongoDB et RabbitMQ en cours d'exécution 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 avoir une connexion au 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 éclaircissements:
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 avec le conteneur: mon pare-feu bloque les connexions réseau du conteneur docker vers l'extérieur
EDIT : Finalement, j'ai créé un pont personnalisé en utilisant la tuyauterie et en faisant écouter les services sur les IP du pont. J'ai choisi cette approche au lieu de laisser MongoDB et RabbitMQ écouter sur le pont docker car cela donne plus de flexibilité.
la source
lo
eteth0
.Un moyen simple mais relativement peu sûr serait d'utiliser l'
--net=host
option dedocker run
.Cette option permet au conteneur d'utiliser la pile réseau de l'hôte. Ensuite, vous pouvez vous connecter aux services exécutés sur l'hôte en utilisant simplement "localhost" comme nom d'hôte.
Ceci est plus facile à configurer car vous n'aurez pas à configurer le service pour accepter les connexions à partir de l'adresse IP de votre conteneur docker, et vous n'aurez pas à indiquer au conteneur docker une adresse IP ou un nom d'hôte spécifique auquel vous connecter, il suffit de un port.
Par exemple, vous pouvez le tester en exécutant la commande suivante, qui suppose que votre image est appelée
my_image
, que votre image inclut l'telnet
utilitaire et que le service auquel vous souhaitez vous connecter est sur le port 25:Si vous envisagez de le faire de cette façon, veuillez consulter la mise en garde concernant la sécurité sur cette page:
https://docs.docker.com/articles/networking/
Ça dit:
la source
--net=host
ne fonctionne pas pour permettre à votre processus de conteneur de se connecter à votre machine hôte à l'aide delocalhost
. Au lieu de cela, demandez à votre conteneur de se connecter au nom d'hôte spécial MacOS uniquementdocker.for.mac.host.internal
au lieu delocalhost
. Aucun paramètre supplémentaire n'est nécessaire pourdocker run
que cela fonctionne. Vous pouvez le transmettre en tant que var d'environnement-e
si vous souhaitez que votre plate-forme de conteneur reste indépendante. De cette façon, vous pouvez vous connecter à l'hôte nommé dans la variable d'environnement et passerdocker.for.mac.host.internal
sous MacOS etlocalhost
Linux.host.docker.internal
, voir docdocker run --rm -it --net=host postgres bash
alorspsql -h host.docker.internal -U postgres
Vous pouvez également créer un tunnel ssh.
docker-compose.yml
:docker/Dockerfile.tunnel
:config/ssh/config
:De cette façon, le
elasticsearch
a un tunnel vers le serveur avec le service en cours d'exécution (Elasticsearch, MongoDB, PostgreSQL) et expose le port 9200 avec ce service.la source
J'ai eu un problème similaire pour accéder à un serveur LDAP à partir d'un conteneur docker. J'ai défini une adresse IP fixe pour le conteneur et ajouté une règle de pare-feu.
docker-compose.yml:
Règle iptables:
iptables -A INPUT -j ACCEPT -p tcp -s 192.168.50.2 -d $192.168.50.1 --dport portnumberOnHost
À l'intérieur de l'accès au conteneur
dockerhost:portnumberOnHost
la source
Si MongoDB et RabbitMQ sont en cours d'exécution 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 l'
-p
option pour exposer les ports d'un conteneur à un hôte. Par défaut, tous les ports sont exposés. L'-p
option vous permet d'exposer un port du conteneur à l'extérieur de l'hôte.Donc, je suppose que vous n'en avez pas du tout besoin
-p
et que cela devrait fonctionner correctement :)la source