~/ziphub — zsh
ZipHub·~/catalog~/articles~/feed~/sellers~/hire
auth login
[article]category · new-cat

Cloudflare Tunnel con Docker Compose: acceso seguro a contenedores sin puertos abiertos

@dignezzz · author2 min read2026-03-15free

TL;DR: Cómo configurar Cloudflare Tunnel con Docker Compose y obtener acceso HTTPS seguro a sus contenedores sin reenvío de puertos.

Introducción

Cloudflare Tunnel permite publicar de forma segura sus servicios locales en Internet, sin abrir puertos y sin gestionar HTTPS manualmente. En esta guía, aprenderá a configurar un túnel en combinación con Docker Compose para proxificar automáticamente el acceso a los contenedores deseados, como si fuera un sitio web público normal.

¿Por qué es necesario?

  • No tienes una IP pública — y no la necesitas.
  • Sin reenvío de puertos en el router o firewall.
  • Cloudflare proporciona HTTPS, WAF, protección contra DDoS y bots.
  • Todo se puede ejecutar en contenedores — sin configuración adicional de nginx, certbot, etc.

Ejemplo: publicando una aplicación web a través de un túnel

Supongamos que tenemos un contenedor my-app que se ejecuta en http://my-app:3000. Queremos que sea accesible a través de https://app.example.com.

Paso 1. Preparación de Cloudflare

  1. Regístrese y agregue su dominio en Cloudflare.

  2. Instale cloudflared localmente y realice la autenticación:

bash
1cloudflared login
  1. Cree un túnel:
bash
1    cloudflared tunnel create my-tunnel
  1. Enrute el DNS:
bash
1    cloudflared tunnel route dns my-tunnel app.example.com
  1. Copie el archivo .json con las credenciales (generalmente ubicado en ~/.cloudflared/) al directorio del proyecto, por ejemplo, ./cloudflared.

Paso 2. Estructura del proyecto

yaml
1proyecto/
2├── docker-compose.yml
3├── cloudflared/
4   ├── config.yml
5   └── <aquí su tunnel-id>.json
6

Paso 3. config.yml — configuración del túnel

yaml
1tunnel: my-tunnel
2credentials-file: /etc/cloudflared/<aquí su tunnel-id>.json
3
4ingress:
5  - hostname: app.example.com
6    service: http://my-app:3000
7  - service: http_status:404

Paso 4. docker-compose.yml

yaml
1version: '3.8'
2
3services:
4  my-app:
5    image: your-image
6    container_name: my-app
7    expose:
8      - 3000
9    networks:
10      - app-network
11
12  cloudflared:
13    image: cloudflare/cloudflared:latest
14    container_name: cloudflared
15    restart: always
16    command: tunnel --config /etc/cloudflared/config.yml run
17    volumes:
18      - ./cloudflared:/etc/cloudflared
19    networks:
20      - app-network
21
22networks:
23  app-network:
24    driver: bridge

Paso 5. Lanzamiento

bash
1docker compose up -d

Ahora, al acceder a https://app.example.com, llegará a su contenedor my-app, sin abrir puertos hacia el exterior.

Conclusión

El uso de Cloudflare Tunnel en combinación con Docker Compose permite:

  • Simplificar la publicación de servicios.
  • Eliminar la necesidad de configuración manual de HTTPS.
  • Aumentar la seguridad sin complicaciones con iptables y nginx.

Todo funciona en contenedores — transparente y sin trucos. Es una excelente manera de proxificar interfaces de administración, paneles o APIs que no desea exponer directamente.

~2 min read · scroll to continue ↓

## discussion

$ topics --entity=article0
sign in to start or join a discussion
No discussions yet — start one to break the ice.
↑↓ nav open⌘K palettei install? help