Conecta Docker a Snowflake con tu VPN corporativa: guía práctica en WSL2

  1. El problema en breve
  2. ¿Por qué no pasa por la VPN aun en host mode en docker windows?
  3. La solución práctica
  4. Qué esperar
  5. Lecciones aprendidas
  6. Referencias

Cómo lograr que una app en Docker use la VPN corporativa (Zscaler) para conectar a Snowflake en Windows. Por qué host mode no funciona en Docker Desktop y la solución con WSL2, paso a paso.

¿El tráfico de red de tu contenedor Docker no logra salir por la VPN corporativa en Windows? Es un problema común cuando usamos Docker Desktop con WSL2/Hyper‑V: aunque el tráfico de tu host machine(windows) sí va por la VPN, la app dentro del contenedor no. Aquí te cuento por qué ocurre y cómo resolverlo para conectarte a Snowflake sin depender de allowlists de IP.

El problema en breve

La app de Python corre dentro de un contenedor Docker y necesita conectarse a Snowflake. Snowflake suele exigir IPs en allowlist, pero con IP dinámica esto se complica. La alternativa es salir por la VPN corporativa (Zscaler). El detalle: el tráfico del contenedor no pasa por esa VPN cuando usamos Docker Desktop con network mode bridge. La solución es configurar docker desktop en windows para usar network mode=host en lugar de bridge, pero luego de cambiarlo en docker desktop sigue sin funcionar.

¿Por qué no pasa por la VPN aun en host mode en docker windows?

En Windows, los contenedores Linux de Docker Desktop viven en una pequeña máquina virtual (WSL2/Hyper‑V) y se conectan a Internet por una red privada con NAT. Eso significa:

  • “Host networking” no es realmente el host de Windows para contenedores Linux.
  • El contenedor no comparte el mismo localhost ni las mismas interfaces de red del host.
  • La VPN y los agentes corporativos del host no se aplican automáticamente dentro del contenedor.

Resultado: la app intenta llegar a Snowflake, pero sus paquetes no salen por la VPN.

La solución práctica

Ejecutar el contenedor desde la distro Linux de WSL2 y usar network_mode: «host». Así el tráfico del contenedor sí pasa por la pila de red que está siendo enrutada por la VPN.

Docker file de ejemplo:

version: '3.8'
services:
  python-app:
    build: .
    container_name: python-app
    network_mode: "host"  # Funciona en WSL2
    env_file:
      - devcontainer.env
    environment:
      - PYTHONPATH=/workspaces/us-ops-recipe-clustering/src
      - PYTHONUNBUFFERED=1
    volumes:
      - ../src:/workspaces/us-ops-recipe-clustering/src
      - ../data:/workspaces/us-ops-recipe-clustering/data
    working_dir: /workspaces/us-ops-recipe-clustering
    command: ["python", "-m", "streamlit", "run", "src/dashboard.py", "--server.port=8502", "--server.address=0.0.0.0"]
    restart: unless-stopped
    stdin_open: true
    tty: true

Pasos rápidos en WSL2

Ejecuta los siguientes comandos desde powershell en windows.

# Instalar Ubuntu en WSL (si no lo tienes)
wsl --install -d Ubuntu

# Entrar al entorno Linux wsl2
wsl -d Ubuntu

# Instalar Docker en la distro
sudo apt update && sudo apt upgrade -y
curl -fsSL <https://get.docker.com> -o [get-docker.sh](<http://get-docker.sh>)
sudo sh [get-docker.sh](<http://get-docker.sh>)
sudo usermod -aG docker $USER
sudo service docker start
docker --version

# Ir a tu proyecto y levantar
docker-compose up --build

Luego corre el contenedor directamente desde wsl2, usando docker-compose up --build

Qué esperar

Una vez que el contenedor corre desde WSL2 con network_mode: host, su tráfico sale por la VPN corporativa (Zscaler). Con eso, la conexión a Snowflake se establece sin tener que usar allowlists.

Lecciones aprendidas

  • En Docker Desktop (Windows), “host mode” para contenedores Linux no es el host real de Windows.
  • Si necesitas que el contenedor use la VPN del host, muévete a WSL2 y usa network_mode: «host».

Referencias

https://forums.docker.com/t/host-networking-not-working-on-docker-desktop-in-wsl2-with-mirrored-mode/147994

Deja un comentario