Automating Docker Deployments on Azure with Cloud-Init
These articles are AI-generated summaries. Please check the original sources for full details.
How I Deployed a Live Website Using Docker on Azure (And Let Cloud-Init Do the Heavy Lifting)
Vivian Chiamaka Okose deployed a Dockerized static website to an Azure Ubuntu 24.04 LTS instance using automated provisioning. The setup utilizes a cloud-init script to install Docker and configure user permissions before the first SSH connection is even established.
Why This Matters
In modern infrastructure, manual configuration is a liability that scales poorly and introduces human error. Leveraging cloud-init shifts the burden from manual shell commands to declarative automation, ensuring that every VM instance is identical and production-ready from the moment of boot, which significantly reduces the time-to-market for containerized applications.
Key Insights
- Cloud-init automation allows for zero-touch Docker installation on Ubuntu 24.04 LTS by executing system commands during the initial boot sequence.
- The nginx:alpine base image provides a high-performance, lightweight web server footprint, resulting in a final container image size of just 92.9 MB.
- Infrastructure resilience is improved using the —restart unless-stopped flag, ensuring containers automatically recover following VM reboots or service crashes.
- The usermod -aG docker command in startup scripts allows for seamless execution of Docker commands without requiring sudo on subsequent SSH access.
Working Examples
Cloud-init script for automated Docker installation on Azure VM boot.
#cloud-config
package_update: true
package_upgrade: true
packages:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
runcmd:
- apt-get update -y
- apt-get install -y docker.io
- systemctl enable docker
- systemctl start docker
- usermod -aG docker azureuser
Dockerfile for a lightweight Nginx container serving a static website.
FROM nginx:alpine
RUN rm -rf /usr/share/nginx/html/*
COPY . /usr/share/nginx/html
EXPOSE 80
Practical Applications
- Use case: Automated environment setup for CI/CD runners using cloud-init to ensure consistent build environments. Pitfall: Hardcoding sensitive credentials in Custom Data scripts which can be exposed in VM metadata.
- Use case: Serving static assets via Nginx containers for fast, scalable content delivery in microservices. Pitfall: Forgetting to clean default Nginx directories, leading to conflicting index files or default splash pages.
References:
Continue reading
Next article
Automating Development Workflows with GitHub Actions and Claude Code
Related Content
Automating AWS CloudFront Deployments with Agentic Infrastructure and Claude Code
Vivian Chiamaka Okose demonstrates a 5-step agentic pipeline using Claude Code to provision 4 AWS resources and deploy a live CloudFront site in the af-south-1 region.
Deploying CyberChef on Ubuntu 24.04 with Docker and Traefik
Deploy GCHQ's CyberChef on Ubuntu 24.04 using Docker Compose and Traefik for automated HTTPS data transformation pipelines.
Deploying Jina Serve: Neural Search and AI Serving on Ubuntu 24.04
Deploy a cloud-native Jina Serve framework using Docker Compose and Traefik to enable secure, automated HTTPS for multimodal AI applications.