💡 Introduction
OpenTofu is an open-source fork of Terraform.
It allows full automation of server provisioning even in your local machine—not just cloud infrastructure.
In this guide, we automate:
- Docker installation
- Docker Compose installation
- Creating volumes + networks
- Deploying a full WordPress + MySQL stack
- Starting the containers
All using OpenTofu and null_resource.
This is perfect for:
- DevOps practice
- Local development setup
- CI/CD environments
- Rapid application testing
🔧 Prerequisites
Ubuntu machine (local, VM, or cloud)
Install OpenTofu:
sudo apt update -y
sudo apt upgrade -y
sudo snap install --classic opentofu
📁 Project Setup
mkdir tofu-docker-wordpress
cd tofu-docker-wordpress
nano main.tf
🧱 OpenTofu Code (main.tf)
terraform {
required_providers {
null = {
source = "hashicorp/null"
}
}
}
###############################
# 1) INSTALL DOCKER + COMPOSE
###############################
resource "null_resource" "install_docker" {
provisioner "local-exec" {
command = <<-EOT
echo "--- Updating system ---"
# Add Docker's official GPG key:
sudo apt update -y
sudo apt install ca-certificates curl -y
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 install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo usermod -aG docker ubuntu
sudo apt update
echo "--- Installing Docker Compose ---"
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo usermod -aG docker $USER
EOT
}
}
###############################
# 2) CREATE DOCKER COMPOSE FILE
###############################
resource "local_file" "docker_compose" {
depends_on = [null_resource.install_docker]
filename = "/home/ubuntu/docker-compose.yml"
content = <<-EOF
version: '3.9'
services:
db:
image: mysql:8.0
container_name: wp-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
volumes:
- mysql_data:/var/lib/mysql
networks:
- wp-network
wordpress:
image: wordpress:latest
container_name: wordpress-app
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
networks:
- wp-network
volumes:
mysql_data:
wp_data:
networks:
wp-network:
EOF
}
###############################
# 3) RUN DOCKER COMPOSE
###############################
resource "null_resource" "run_stack" {
depends_on = [local_file.docker_compose]
provisioner "local-exec" {
command = <<-EOT
cd /home/ubuntu
sudo docker-compose down || true
sudo docker-compose up -d
EOT
}
}
🚀 Run the Automation
tofu init
tofu fmt
tofu validate
tofu plan
tofu apply -auto-approve
OpenTofu will:
✔ Install Docker
✔ Install Docker Compose
✔ Generate docker-compose.yml
✔ Start WordPress + MySQL
🌐 Access the Application
Visit:
🌟 Thanks for reading! If this post added value, a like ❤️, follow, or share would encourage me to keep creating more content.
— Latchu | Senior DevOps & Cloud Engineer
☁️ AWS | GCP | ☸️ Kubernetes | 🔐 Security | ⚡ Automation
📌 Sharing hands-on guides, best practices & real-world cloud solutions



Top comments (0)