¿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

loyeth0.Una forma simple pero relativamente insegura sería utilizar la
--net=hostopció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_imagesu imagen, su imagen incluye latelnetutilidad 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=hostno 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.internalde host especial de MacOS en lugar delocalhost. No se necesitan parámetros adicionalesdocker runpara que esto funcione. Puede pasar esto como una variable ambiental-esi desea mantener su plataforma de contenedores independiente. De esa manera, puede conectarse al host nombrado en la variable env y pasardocker.for.mac.host.internalen MacOS ylocalhostLinux.host.docker.internal, ver docdocker run --rm -it --net=host postgres bashentoncespsql -h host.docker.internal -U postgresTambién podría crear un túnel ssh.
docker-compose.yml:docker/Dockerfile.tunnel:config/ssh/config:De esta manera,
elasticsearchtiene 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 portnumberOnHostDentro del acceso al contenedor
dockerhost:portnumberOnHostfuente
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
-popción para exponer puertos del contenedor al host. Por defecto, todos los puertos están expuestos. La-popción le permite exponer un puerto desde el contenedor al exterior del host.Entonces, supongo que no necesitas
-pnada y debería funcionar bien :)fuente