Saltar al contenido principal

Puertos y el botón Abrir

Cómo se publica un puerto

Un puerto dentro de su contenedor no es accesible desde internet hasta que el host lo publica. En el lanzamiento, cada puerto de contenedor declarado se asigna a un puerto libre de la máquina host, tomado del rango que ese host tiene disponible. El puerto del host es al que usted se conecta, y casi nunca coincide con el número del puerto del contenedor, por la misma razón por la que su puerto SSH no es el 22.

Al contenedor se le informa en qué puerto del host quedó cada uno de sus puertos, mediante una variable de entorno por cada puerto TCP publicado:

# inside the instance
env | grep SUPERHEAT_TCP_PORT_
# SUPERHEAT_TCP_PORT_22=40123
# SUPERHEAT_TCP_PORT_8080=41007

SUPERHEAT_TCP_PORT_<n> contiene el puerto del host publicado para el puerto de contenedor <n>. Esto es informativo: está ahí para que un proceso en la instancia pueda anunciar correctamente su propia dirección pública. Los puertos UDP no reciben una variable así.

Qué publica cada modo de lanzamiento

Los puertos vienen de la plantilla, más lo que exija el modo de lanzamiento:

Modo de lanzamientoSe publica automáticamenteAdemás
sshpuerto de contenedor 22más todos los puertos declarados en la plantilla
jupyterpuertos de contenedor 22 y 8080más todos los puertos declarados en la plantilla
argsnada automáticosolo los puertos declarados en la plantilla
vmpuerto de contenedor 22más todos los puertos declarados en la plantilla

Un puerto declarado puede llevar una etiqueta. Una etiqueta open, open_button u open-button marca ese puerto como destino del botón Abrir. Cualquier otra etiqueta es solo descriptiva, y el puerto se trata como un puerto de aplicación común.

El botón Abrir

Cuando una plantilla declara un puerto de botón Abrir, la pestaña Conectar de la instancia muestra un botón Abrir encima del comando SSH, apuntando a ese puerto en el host. Es un atajo para una interfaz web que sirve su imagen — un front end de inferencia, un panel, un visor — para que no tenga que buscar el puerto publicado.

El número de puerto también se le entrega al contenedor como OPEN_BUTTON_PORT, por si el proceso necesita saber cuál de sus puertos está anunciando la consola.

Cualquier modo de lanzamiento puede tener uno, args incluido. Una plantilla en modo args ejecuta el entrypoint propio de la imagen, pero aun así recibe OPEN_BUTTON_PORT y aun así obtiene un botón Abrir — sin eso, una imagen que sirve una interfaz web nunca podría abrirse desde la consola, que es para lo que más se usa el modo args.

Una instancia en modo jupyter obtiene además su propio botón Abrir JupyterLab. Consulte Abrir JupyterLab.

Llegar a un servicio que usted mismo inició

Los puertos se publican cuando la instancia se lanza. Iniciar un servidor dentro de una instancia en ejecución no publica nada, así que un python -m http.server 8000 recién iniciado no es accesible desde fuera, haga lo que haga el firewall de su equipo.

Tiene dos opciones.

Declarar el puerto en una plantilla y desplegar de nuevo. Esta es la respuesta duradera para cualquier cosa que vaya a ejecutar más de una vez. Agregue el puerto en los puertos de la plantilla, asígnele una etiqueta y vuelva a desplegar. Consulte Puertos.

Reenviarlo por SSH. Esto no requiere volver a desplegar y funciona de inmediato para un puerto que no había previsto:

ssh -N -L 8000:localhost:8000 -p 40123 root@sh-us-tx-01.ssh.superheat.dev

Deje eso en ejecución y abra http://localhost:8000 en su navegador. El tráfico pasa por la conexión SSH que ya tiene, así que no se expone nada nuevo a internet.

Sea cual sea la vía que elija, enlace su servicio a 0.0.0.0 en lugar de a 127.0.0.1 si quiere que el puerto publicado funcione. Un proceso que escucha solo en loopback es accesible mediante reenvío SSH, pero no a través de un puerto publicado del host.

Protocolos

Un puerto declarado indica un protocolo: tcp, udp, http o https. Los dos primeros son lo que realmente se reserva en el host. Los dos últimos son una pista sobre lo que sirve el puerto, y viajan sobre TCP.

Relacionado