tutorial library hub dockers container linux networking port docker

linux - library - dockers container download



Reenviar el puerto de host al contenedor Docker (5)

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 opción ''-p'' para exponer puertos de contenedor a host. Por defecto, todos los puertos están expuestos. La opción ''-p'' le permite exponer un puerto desde el contenedor al exterior del host.

Entonces, supongo que no necesitas ''-p'' para nada y debería estar funcionando bien :)

¿Es posible tener un puerto de acceso Docker contenedor 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 desde el contenedor al host (a través de la opción -p) y tengo 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: alguna aclaración:

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 una conexión a Internet con el contenedor: Mi firewall está bloqueando las conexiones de red desde el contenedor acoplable al exterior

EDITAR : Finalmente fui con la creación de un puente personalizado utilizando pipework y haciendo que los servicios escuchen en las IP del puente. Fui con este enfoque en lugar de escuchar a MongoDB y RabbitMQ en el puente de docker, porque brinda más flexibilidad.


Su host de docker expone un adaptador a todos los contenedores. Asumiendo que estás en ubuntu reciente, puedes ejecutar

ip addr

Esto le dará una lista de adaptadores de red, uno de los cuales se verá algo así como

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 22:23:6b:28:6b:e0 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 inet6 fe80::a402:65ff:fe86:bba6/64 scope link valid_lft forever preferred_lft forever

Tendrá que decirle a rabbit / mongo que se vincule a esa IP (172.17.42.1). Después de eso, debería poder abrir conexiones a 172.17.42.1 desde sus contenedores.


También puedes crear un túnel ssh.

docker-compose.yml :

--- version: ''2'' services: kibana: image: "kibana:4.5.1" links: - elasticsearch volumes: - ./config/kibana:/opt/kibana/config:ro elasticsearch: build: context: . dockerfile: ./docker/Dockerfile.tunnel entrypoint: ssh command: "-N elasticsearch -L 0.0.0.0:9200:localhost:9200"

docker/Dockerfile.tunnel :

FROM buildpack-deps:jessie RUN apt-get update && / DEBIAN_FRONTEND=noninteractive / apt-get -y install ssh && / apt-get clean && / rm -rf /var/lib/apt/lists/* COPY ./config/ssh/id_rsa /root/.ssh/id_rsa COPY ./config/ssh/config /root/.ssh/config COPY ./config/ssh/known_hosts /root/.ssh/known_hosts RUN chmod 600 /root/.ssh/id_rsa && / chmod 600 /root/.ssh/config && / chown $USER:$USER -R /root/.ssh

config/ssh/config :

# Elasticsearch Server Host elasticsearch HostName jump.host.czerasz.com User czerasz ForwardAgent yes IdentityFile ~/.ssh/id_rsa

De esta forma, elasticsearch tiene un túnel para el servidor con el servicio en ejecución (Elasticsearch, MongoDB, PostgreSQL) y expone el puerto 9200 con ese servicio.


Tuve un problema similar al acceder a un servidor LDAP desde un contenedor acoplable. Establecí una IP fija para el contenedor y agregué una regla de firewall.

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

regla de iptables:

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

Dentro del contenedor acceso dockerhost:portnumberOnHost


Una forma simple pero relativamente insegura sería usar la opción --net=host para docker run el --net=host .

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 acoplable, y no tendrá que decirle al contenedor acoplable 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 asume que su imagen se llama my_image , su imagen incluye la utilidad telnet y el servicio al que desea conectarse está en el puerto 25:

docker run --rm -i -t --net=host my_image telnet localhost 25

Si considera hacerlo de esta manera, consulte la advertencia sobre seguridad en esta página:

https://docs.docker.com/articles/networking/

Dice:

--net = host - Le dice a Docker que saltee colocar el contenedor dentro de una pila de red separada. ¡En esencia, esta elección le dice a Docker que no contene la red del contenedor! Mientras que los procesos de contenedor aún estarán confinados a su propio sistema de archivos y lista de procesos y límites de recursos, un comando quick ip addr le mostrará que, en red, viven "fuera" en el host Docker principal y tienen acceso completo a sus interfaces de red . Tenga en cuenta que esto no permite que el contenedor reconfigure la pila de la red del host, lo que requeriría --privileged = true - pero sí permite que los procesos del contenedor abran puertos de bajo número como cualquier otro proceso raíz. También permite que el contenedor acceda a servicios de red local como D-bus. Esto puede llevar a que los procesos en el contenedor puedan hacer cosas inesperadas, como reiniciar su computadora. Debe usar esta opción con precaución.