Exposing standard development tools like Jenkins, RabbitMQ, and Redis to the public cloud can be challenging. Developers often lose data when containers restart or find themselves blocked by layers of cloud and OS-level network security.
This comprehensive guide details how to provision a production-ready, persistent workspace on an Azure Windows Virtual Machine using Docker. You will learn how to configure isolated, stateful containers, bypass both Windows Server and Azure firewalls, and securely connect to your utilities from anywhere in the world.
Architecture Overview
To achieve an isolated development workflow, the environment uses a layered access topology:
[ Local Browser ]
│ (Public Traffic via Port 8085, 15672, 5540)
▼
┌────────────────────────────────────────────────────────┐
│ Azure Cloud Infrastructure │
│ └─ Network Security Group (NSG) Inbound Rules │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────┐ │
│ │ Azure Windows Virtual Machine │ │
│ │ └─ Windows Advanced Guest Firewall Rules │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌────────────────────────────────────────┐ │ │
│ │ │ Docker Engine Desktop Daemon │ │ │
│ │ │ ├─ Jenkins Container (:8085) │ │ │
│ │ │ ├─ RabbitMQ Container (:15672) │ │ │
│ │ │ └─ Redis Insight Container (:5540) │ │ │
│ │ │ │ │ │ │
│ │ │ ▼ │ │ │
│ │ │ [ Persistent Named Volumes ] │ │ │
│ │ └────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────┘
Phase 1: Establish Remote Connection & Prepare Host Runtime
Launch your local Remote Desktop Connection (RDP) client.
Input the target Azure public IP address and connect using your provisioned administrative credentials.
Once the desktop session initializes, navigate to the official Docker portal to download the Docker Desktop for Windows executable installer.
Run the installer. Ensure that the WSL 2 Configuration or the underlying Hyper-V Windows Feature engine checkbox is ticked depending on your Windows Server kernel capabilities.
Complete installation and execute a system restart if prompted by the installer. Following initialization, launch Docker Desktop and confirm the engine state reads Running in the application tray interface.
Phase 2: Deploying the Stateful Docker Core Service Mesh
By default, standard containerized file systems are ephemeral; destroying a container drops its internal state. To retain pipelines, user groups, and messages across lifecycle failures, we declare managed state volumes (-v) directly bound to the guest host application space.
Open Windows PowerShell inside your RDP window with elevated Run as Administrator permissions, and run the following deployment script block:
PowerShell
# Deploy Persistent Jenkins LTS Engine
docker run -d `
--name jenkins-lts `
-p 8085:8080 `
-p 50000:50000 `
-v jenkins_home_data:/var/jenkins_home `
jenkins/jenkins:lts-jdk21
# Deploy Persistent RabbitMQ with Management Dashboard Plugin
docker run -d `
--name rabbitmq-dashboard `
-p 5672:5672 `
-p 15672:15672 `
-v rabbitmq_data:/var/lib/rabbitmq `
rabbitmq:4-management
# Deploy Persistent Redis Insight Unified Web Dashboard UI
docker run -d `
--name redis-insight `
-p 5540:8001 `
-v redis_insight_data:/db `
redis/redisinsight:latest
Parameter Breakdown
-d: Runs the running instance detached in background mode.-p [HostPort]:[ContainerPort]: Binds the container runtime application interfaces safely to target Windows network sockets. Note that Jenkins maps to an external port8085to sidestep native corporate8080port collisions, and Redis Insight routes host5540directly to internal upstream web entrypoint8001.-v [VolumeName]:[InternalPath]: Creates a physical abstraction layer on the Windows storage subsystem to preserve container configurations permanently.
Phase 3: Modifying the Guest OS Windows Firewall Topology
Windows Server blocks arbitrary ingress endpoints by default. Run the following command set in your administrative PowerShell window to clear incoming traffic lanes for your newly exposed Docker network endpoints:
PowerShell
# Create Inbound Exception Rules for Docker InfrastructureNew-NetFirewallRule -DisplayName "Docker-Jenkins Inbound" -Direction Inbound -LocalPort 8085 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "Docker-RabbitMQ Inbound" -Direction Inbound -LocalPort 15672 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "Docker-RedisInsight Inbound" -Direction Inbound -LocalPort 5540 -Protocol TCP -Action Allow

Join the conversation! Your thoughts help the community grow.