¿Es posible tener un puerto de acceso de contenedor Docker abierto por el host? Concretamente, tengo MongoDB y RabbitMQ ejecutándose en el host y me gustaría ejecutar un proceso en un contenedor Docker para escuchar la cola y (opcionalmente) escribir en la base de datos.
Sé que puedo reenviar un puerto desde el contenedor al host (a través de la opción -p) y tener una conexión con el mundo exterior (es decir, Internet) desde el contenedor Docker, pero me gustaría no exponer los puertos RabbitMQ y MongoDB del anfitrión al mundo exterior.
EDITAR: algunas aclaraciones:
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
Tuve que hacer este truco para obtener cualquier conexión a Internet dentro del contenedor: mi firewall está bloqueando las conexiones de red desde el contenedor acoplable hacia afuera
EDITAR : Finalmente, creé un puente personalizado utilizando tuberías y haciendo que los servicios escucharan en las IP del puente. Seguí este enfoque en lugar de que MongoDB y RabbitMQ escucharan en el puente acoplable porque brinda más flexibilidad.
fuente
lo
yeth0
.Una forma simple pero relativamente insegura sería utilizar la
--net=host
opción paradocker run
.Esta opción hace que el contenedor use la pila de red del host. Luego puede conectarse a los servicios que se ejecutan en el host simplemente usando "localhost" como nombre de host.
Esto es más fácil de configurar porque no tendrá que configurar el servicio para aceptar conexiones desde la dirección IP de su contenedor Docker, y no tendrá que decirle al contenedor Docker una dirección IP específica o un nombre de host para conectarse, solo un puerto
Por ejemplo, puede probarlo ejecutando el siguiente comando, que supone que se llama a
my_image
su imagen, su imagen incluye latelnet
utilidad y el servicio al que desea conectarse está en el puerto 25:Si considera hacerlo de esta manera, vea la advertencia sobre seguridad en esta página:
https://docs.docker.com/articles/networking/
Dice:
fuente
--net=host
no funciona para permitir que su proceso de contenedor se conecte a su máquina host usandolocalhost
. En su lugar, haga que su contenedor se conecte al nombredocker.for.mac.host.internal
de host especial de MacOS en lugar delocalhost
. No se necesitan parámetros adicionalesdocker run
para que esto funcione. Puede pasar esto como una variable ambiental-e
si desea mantener su plataforma de contenedores independiente. De esa manera, puede conectarse al host nombrado en la variable env y pasardocker.for.mac.host.internal
en MacOS ylocalhost
Linux.host.docker.internal
, ver docdocker run --rm -it --net=host postgres bash
entoncespsql -h host.docker.internal -U postgres
También podría crear un túnel ssh.
docker-compose.yml
:docker/Dockerfile.tunnel
:config/ssh/config
:De esta manera,
elasticsearch
tiene un túnel hacia el servidor con el servicio en ejecución (Elasticsearch, MongoDB, PostgreSQL) y expone el puerto 9200 con ese servicio.fuente
Tuve un problema similar al acceder a un servidor LDAP desde un contenedor acoplable. Configuré una IP fija para el contenedor y agregué una regla de firewall.
docker-compose.yml:
regla de iptables:
iptables -A INPUT -j ACCEPT -p tcp -s 192.168.50.2 -d $192.168.50.1 --dport portnumberOnHost
Dentro del acceso al contenedor
dockerhost:portnumberOnHost
fuente
Si MongoDB y RabbitMQ se están ejecutando en el Host, entonces el puerto ya debería estar expuesto, ya que no está dentro de Docker.
No necesita la
-p
opción para exponer puertos del contenedor al host. Por defecto, todos los puertos están expuestos. La-p
opción le permite exponer un puerto desde el contenedor al exterior del host.Entonces, supongo que no necesitas
-p
nada y debería funcionar bien :)fuente