# Infrestructura de Servicios con Docker y Nginx Proxy Manager

Este libro es para explicar toda la infrestrucura de redes necesaria para exponer multiples aplicaciones en la red

# Intruduccion

## <span style="color:rgb(241,196,15);">Atención</span>

Esto no es un curso de Docker, si no le sabes chinga tu madre con todo el afán de ofender y revisa la siguiente documentación pa que aprendas.

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/0uWimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/0uWimage.png)

### Documentación:

- Curso de Docker que quizás deberías ver: [Aprende Docker Ahora](https://www.youtube.com/watch?v=4Dko5W96WHg "Curso Docker")
- Comandos de uso común en Docker: [Comandos comunes en Docker](https://wiki.tinyfox.ddns.me/books/servicios-con-docker-compose/page/introduccion)

# Abriendo tu servidor a la red

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/1Ooimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/1Ooimage.png)

## Problemática

### Acceder a tus servicios fuera de tu área local

Actualmente puedes acceder a los servicios que montes sobre los puertos de tu servidor en área local, pero si tú quieres poder acceder a tus servicios apagando el wifi de tu celular y encendiendo los datos (desde afuera de tu red local) te encontraras con que no puedes ingresar. Esto sucede porque ip-local no es la misma que la ip publicano entregada por tu proveedor de internet.

### Solución. Apertura de puertos

La forma de solucionar esto es abrir puertos en tu modem, los puertos son las salidas hacia internet, cada dispositivo tiene su propia red y sus puertos, lo que tenemos que hacer es redirigir el puerto de nuestro servidor al puerto del modem y posteriormente del modem hacia internet, este recurso puede ser alcanzado mediante la ip pública.

Cabe resaltar que no todas las compañías te dejan la posibilidad de abrir puertos de manera gratuita, te agregan este servicio mediante pagos extra, pero TELMEX actualmente proporciona este servicio incluido con el servicio de internet residencial.  
Como mencionamos tendrás que conseguir tu ip publica la cual tiene el inconveniente en muchos casos de ser dinámica, esto implica que cambiara con el tiempo, pero nos da suficiente tiempo para trabajar con ella. Podrás acceder a tus recursos locales poniendo la ***ip\_publica:puerto***. siempre y cuando redirijas los puertos como mencione anteriormente.

## Configurando el modem

### Conociendo la IP de tu Router (Servidor DHCP)

Puedes conocer la ip de tu router mediante el comando

```bash
ip route
```

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/fL1image.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/fL1image.png)

### Abriendo los puertos del modem

Veras una salida como la anterior donde se señala que la ip de mi modem Telmex es 192.168.1.254, ingresaremos esa ip en el navegador e ingresaremos al Router de tu proveedor de internet, veras una pagina donde te pedirá iniciar sesión, la contraseña está en tu modem

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/qSximage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/qSximage.png)

En mi caso, dentro del modem me dirigiré a la pestaña *<span style="text-decoration:underline;">**Reglas de desvío**</span>* y posteriormente a Port Forwarding, le daré en agregar, le pondré un nombre representativo, pondré la IP de mi servidor donde indica <span style="text-decoration:underline;">***Host Interno***</span> y abriré los puertos para exponer páginas web que son 80 y 443, en protocolo es suficiente con poner TCP y es más recomendable, pero puedes indicar ambos por si quisieras hacer otras cosas con esos puertos. Guardas los cambios y es toda la configuración del modem

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/hPEimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/hPEimage.png)

# Servicio DDNS

## Introducción

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/cA6image.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/cA6image.png)

### Problemática. Una ip cambiante

Como mencionamos, los distribuidores de internet pueden darte una ip publica dinámica. Imaginemos que montas un servicio en tu servidor y tienes una app que la consume, tuviste que meter tu ip publica y esta queda guardada en la app. Posteriormente tu ip cambia, tendrás que cambiar tu ip en la app. Imaginemos ahora que tienes 100 dispositivos que apuntan a la ip, se vuelve un trabajo enorme tener que estar cambiando la ip en todos los dispositivos

### Solución. Servicios DDNS

Para solucionar este problema usaremos un servicio DDNS, este servicio nos otorgara un nombre en la[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/K1pimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/K1pimage.png) web, como ejemplo.com. Tu proveedor DDNS le asignara a este nombre una ip, cuando la ip cambie bastara con cambiar tu ip publica en el servidor DDNS para que continue redirigiendo hacia tu modem.

En esta documentación usaremos DuckDns para el servicio DDNS. Cabe resaltar que existen otros servicios DDNS como los proporcionados por cloudFlare o noip pero de momento nos enfocaremos en explicar el proceso de usar DuckDNS para fines educativos y te invito a usar otros servicios DDNS después.

## Creación de un dominio con DuckDNS

Ingresaremos a [DuckDNS](https://www.duckdns.org/ "DuckDns") y luego crearemos un dominio, automáticamente se pondré tu ip publica actual, en caso de que no lo haga busca tu ip publica e ingrésala. Cuando termines veras algo así:

**http://tuDominio.duckdns.org**

Recuerda almacenar el valor token porque lo necesitaremos mas adelante.

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/nTKimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/nTKimage.png)

# Instalando docker

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/WuIimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/WuIimage.png)

### Agregando las key GPG oficiales de Docker 

Para instalar Docker por primera vez vamos a agregar el repo de Docker

Ubuntu

```bash
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
```

### Debian

\# Add Docker's

```bash
official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
```

### Instalación

Ejecuta el siguiente comando

```bash
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

##### Comprobación del estado del core de Docker

Para verificar que Docker esté funcionando podemos ejecutar los siguientes comandos

```bash
sudo docker run hello-world
sudo docker ps
```

### Desinstalación

```bash
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc podman-docker containerd runc | cut -f1)
```

# Actualizacio automatica de la IP publica

Como mencionamos la IP publica cambia cada cierto tiempo, y es necesario cambiar este valor con tu proveedor de servicio DDNS, así que para eso usaremos el siguiente [Docker-compose](https://wiki.tinyfox.ddns.me/books/servicios-con-docker-compose/page/duckdns). Lo ejecutas con los valores de tu cuenta y ya es todo.

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/00Mimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/00Mimage.png)

# Usando Nginx Proxy Manager

### Problemática. Múltiples servicios sobre un mismo puerto

Imaginemos que tú tienes un servicio o página web la cual quieres exponer a internet, los navegadores al intentar acceder a una página por el puerto 80 (puerto inseguro) o 443 (puerto para páginas con certificado SSL) y esta es la razón de porque no vemos url con el siguiente formato **https://www.google.com:*443,*** entonces montaremos nuestra página sobre el puerto 80 o 443

Imaginemos que tienes 2 aplicaciones y ambas tiene certificado SSL, no podrás montar ambas paginas en el puerto 443 por lo que tendrás que abrir otro puerto del modem y solo podrás llamarlo con una url como la siguiente **https://www.google.com:*444*** ya que el modem solo puede asignar un puerto de un dispositivo a un puerto del modem.

#### Solución 3. Proxy Inverso

Para montar múltiples aplicaciones sobre un puerto podemos usar un servicio de proxy inverso como el de Nginx Proxy Manager, este servicio se basa en tener un dominio con sub dominós, por ejemplo tu dominio puede ser **duckdns.org** y para agregar un subdominio agregarías un nombre seguido de un punto y tu dominio, **myserver.duckdns.org.**

Todos los subdominio apuntan realmente a la misma ip publica pero Ng Proxy Manager puede redirigir a diferentes aplicaciones mediante los diferentes nombres de subdomino. esto te pemite tener montado multiples servicios sobre un mimsmo puerto.

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/QeIimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/QeIimage.png)

### Instalación

Para el proceso de instalación de Nginx Proxy Manager te recomiendo que uses el siguiente Docker compose [docker compose](https://wiki.tinyfox.ddns.me/books/servicios-de-docker-compose/page/nginx-proxy-manager) y si no tienes idea de como ejecutar el stack puedes usar la [Introducción](https://wiki.tinyfox.ddns.me/books/servicios-de-docker-compose/page/introduccion) a los comandos de uso común y consideraciones.

Antes de continuar necesitaremos un servicio el cual expondremos a internet, en este caso usaremos [FileBrowser](https://wiki.tinyfox.ddns.me/books/servicios-de-docker-compose/page/filebrowser) como ejemplo, te invito a que generes una instancia de este servicio o cualquier otro listado en [Servicios Con Docker Compose](https://wiki.tinyfox.ddns.me/books/servicios-con-docker-compose).

Además tendrás que ingresar al panel de control de Nginx Proxy Manager, para esto, estando en la misma red que el servidor ingresaremos a **ip-del-servidor:81**

Posteriormente para el primer ingreso usaremos las siguientes credenciales

Usuario: **admin@example.com** Password: **changeme**

Al ingresar te pedirá cambiar la contraseña y el correo, lo haces (no tienen porque ser reales pero si debe seguir formato de correo electrónico) y luego desde la pestaña de **Dashboard** haces click sobre el botón de **Proxy Host** y posteriormente en **Add Proxy Host**

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/6biimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/6biimage.png)

### Ejemplos de uso del Proxy Inverso 

Aquí vemos como exponer una instancia del servicio filebrowser, su puerto interno lo encontraras en la [documentacion oficial](https://filebrowser.org/installation) aunque en muchas ocasiones podrás encontrar un ejemplo en los repositorios de [Docker Hub Container Image Library](https://hub.docker.com/), Ahí buscaras los Docker compose y la sección de puertos.

Veamos el siguiente fragmente de un docker-compose

services:   
 filebrowser:  
 image: filebrowser/filebrowser:latest  
 container\_name: filebrowser  
 **<span style="text-decoration:underline;">ports</span>:**  
 **- 8009:80**

En nuestro caso no necesitamos exponer este puerto y comentaremos las líneas de port y la redirección del puerto. Nos quedaremos con el dato de que el puerto interno (señalado siempre en el lado derecho) es el puerto 80 y tomaremos el nombre del contenedor y los ingresaremos de la siguiente manera.

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/ftWimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/ftWimage.png)

En la sección de Domain Names usaras el dominio generado por tu proveedor DDNS visto anteriormente y un subdominio a elegir pero que no se repita, en mi caso fue cloud y el dominio es tinyfox.ddns.me.

Posteriormente en la pestaña SSL generamos un certificado y habilitamos las siguientes casillas para forzar la redirección a el puerto 443

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/F1Nimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/F1Nimage.png)

Por ultimo, al ser una aplicación que usa WevDav para transmisión de archivos seleccionamos el engranaje para ir a la pestaña de Custom Nginx Configuration y agregamos el contenido mencionado previamente en la documentación de [Nginx Proxy Manager](https://wiki.tinyfox.ddns.me/books/servicios-con-docker-compose/page/nginx-proxy-manager)

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/Htximage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/Htximage.png)

### Pruebas

Para probar que todo quedo bien ingresa a la página que escribiste en la sección de Domain Names y veras el servicio que creaste o no.

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/mCyimage.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/mCyimage.png)

### Extras

Recuerda que Nginx Proxy Manager es para servicios HTTP, si quieres exponer un servicio que no sea de este estilo tendrás que abrir otros puertos del modem que apunten al puerto del servidor o puedes usar Nginx Proxy Manager para redirigir este flujo a otros puertos y abrir estos de igual forma en tu modem; Esto solo por si quisieras cambiar el puerto por defecto de una aplicación y esta no te lo permitiera.

Si decides redirigir puertos con Nginx Proxy Manager tendrás que alterar el Docker compose de Nginx Proxy Manager y agregar los puertos internos y externos correspondientes en su docker compose, además de que si el servicio usa UDP tendrás que señalarlo en el docker compose de forma explícita ya que docker compose por defecto infiere que todos los puertos son TCP.  
  
A continuación, veremos un ejemplo para redireccionar el puerto de wireguard mediante Ngix Proxy Manager, Si bien puedes redirigir puerto de la misma red que el servidor, ya que es otro servicio de docker recomiendo no exponer el puerto de wireguard a la red del servidor, es mejor usar la red creada en docker para montar servicios en Ngix Proxy Manager, en mi ejemplo de repositorio de docker se llamada sky\_net.

Como puedes ver en este ejemplo estoy redirigiendo el puerto por defecto de wireguard (51820) al puerto 2000 y abro este puerto en Nginx Proxy Manager a con el mismo puerto interno y externo del contenedor para evitar confusiones al abrir el puerto del modem.

services:  
 nginx-proxy:  
 image: 'jc21/nginx-proxy-manager:latest'  
 container\_name: nginx-proxy-manager  
 ports:  
\- '80:80' # Public HTTP Port  
\- '443:443' # Public HTTPS Port  
\- '81:81' # Admin Web  
\- '2000:2000/UDP' # Admin Web

[![image.png](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/scaled-1680-/w89image.png)](https://wiki.tinyfox.ddns.me/uploads/images/gallery/2025-11/w89image.png)