linux - network - ¿Cómo puedo reenviar el puerto localhost en mi contenedor a localhost en mi host?
docker network inspect (3)
Tengo un demonio en mi host ejecutándose en algún puerto (es decir, 8008) y mi código normalmente interactúa con el demonio contactando a localhost: 8008 por ejemplo.
Ahora he contenido mi código, pero todavía no el demonio. ¿Cómo puedo reenviar el localhost: 8008 en mi contenedor al localhost: 8008 en el host que ejecuta el contenedor (y, por lo tanto, también el demonio)?
El siguiente es netstat -tlnp
en mi host . Me gustaría que el contenedor reenvíe localhost: 2009 a localhost: 2009 en el host
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2009 0.0.0.0:* LISTEN 22547/ssh
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 ::1:2009 :::* LISTEN 22547/ssh
Entonces, la forma en que debe pensar esto es que los contenedores Docker tienen su propia pila de red (a menos que usted le indique explícitamente que comparta la pila del host con --net=host
). Esto significa que los puertos deben estar expuestos tanto dentro del contenedor de la ventana acoplable como también en el exterior ( documentation ), cuando se vinculan con los puertos del host. Los puertos expuestos en el contenedor deben estar vinculados a los puertos del host explícitamente (con -p xxxx:yyyy
en su comando de docker run
la ventana docker run
) o implícitamente (usando EXPOSE
en su Dockerfile y usando -P
en la línea de comandos), como se dice here . Si su Dockerfile no contiene EXPOSE 8008
, o si no especifica --expose 8008
en su comando de docker run
--expose 8008
docker run
, su contenedor no puede comunicarse con el mundo exterior, incluso si luego usa -p 8008:8008
en su comando de docker run
!
Entonces, para obtener tcp / 8008 en el host vinculado con tcp / 8008 en el contenedor, necesita EXPOSE 8008
dentro de su Dockerfile (y luego el docker build
su contenedor) O --expose 8008
en el docker run command
su docker run command
. Además, debe usar -P
para implícitamente o -p 8008:8008
para vincular explícitamente ese puerto de contenedor expuesto al puerto de host. Un ejemplo de comando de docker run
para hacer esto podría verse como:
docker run -it --expose 8008 -p 8008:8008 myContainer
Es útil recordar que en la opción de línea de comando -p 8008:8008
, el orden para esta operación es -p HOST_PORT:CONTAINER_PORT
. Además, no olvide que no podrá SSH en su contenedor desde otra máquina en Internet a menos que también tenga este puerto desbloqueado en iptables en el host . Siempre termino olvidándome de eso y desperdiciando media hora antes de recordar. Olvidé las iptables -A INPUT ...
para ese puerto TCP específico en la máquina host. Pero debería poder hacer SSH desde su host al contenedor sin la regla de iptables, ya que usa el bucle de retorno para las conexiones locales. ¡Buena suerte!
No estoy seguro si puedes hacer eso solo con la configuración del docker. Si mi entendimiento es correcto, exponer el puerto no es lo que está buscando. En su lugar, establecer el reenvío de puerto ssh del contenedor al host podría ser la respuesta.
docker run -d --name <NAME OF YOUR CONTAINER> -p 8008:8008 <YOUR IMAGE>
Eso publicará el puerto 8008
en su contenedor a 8008
en su host.