Se você usa Terraform e está preocupado com a mudança de licença da HashiCorp, o OpenTofu é a solução. Neste guia, você aprenderá a migrar para o OpenTofu e criar infraestrutura com Docker em menos de 10 minutos.
O que aconteceu com o Terraform?
Em agosto de 2023, a HashiCorp mudou a licença do Terraform de Mozilla Public License (open source) para Business Source License (proprietária). Isso causou preocupação em empresas e desenvolvedores que dependiam da natureza aberta da ferramenta.

Timeline da mudança de licença do Terraform
Como resposta, a Linux Foundation e várias empresas criaram o OpenTofu, um fork 100% compatível com o Terraform que mantém a licença open source original.
O que você precisa saber sobre o OpenTofu:
- É um drop-in replacement (substituto direto) do Terraform
- Mantém a mesma sintaxe e comandos (apenas troque
terraform
portofu
) - Funciona com seu estado e módulos Terraform existentes
- Continua sendo open source sob a licença MPL 2.0
Instalação rápida em qualquer sistema
Escolha seu sistema operacional:
Linux (Ubuntu/Debian)
# Adicione a chave GPG e repositório
sudo wget -O- https://apt.releases.opentofu.org/opentofu.gpg | sudo gpg --dearmor -o /usr/share/keyrings/opentofu-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/opentofu-archive-keyring.gpg] https://apt.releases.opentofu.org $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/opentofu.list > /dev/null
# Instale
sudo apt-get update && sudo apt-get install opentofu
macOS
brew install opentofu
Windows
choco install opentofu
Verifique a instalação com tofu version
. Viu como é fácil?
Tutorial prático: Crie uma stack Docker completa em 5 minutos
Vamos criar três containers interconectados usando OpenTofu: uma API Node.js, um banco de dados MySQL e um Redis para cache. Este exemplo demonstra como o OpenTofu gerencia facilmente infraestrutura local ou em nuvem.

Arquitetura da stack Docker que vamos criar
1. Crie a estrutura do projeto
mkdir opentofu-docker-demo
cd opentofu-docker-demo
touch main.tf variables.tf outputs.tf
2. Configure o provedor Docker
Cole no arquivo main.tf
:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0.0"
}
}
}
provider "docker" {}
# Rede para comunicação entre containers
resource "docker_network" "app_network" {
name = "app_network"
}
3. Defina as variáveis
Cole no arquivo variables.tf
:
variable "mysql_root_password" {
description = "Senha root do MySQL"
type = string
default = "rootpassword"
sensitive = true
}
variable "mysql_database" {
description = "Nome do banco de dados"
type = string
default = "appdb"
}
variable "mysql_user" {
description = "Usuário do banco de dados"
type = string
default = "appuser"
}
variable "mysql_password" {
description = "Senha do usuário do banco de dados"
type = string
default = "apppassword"
sensitive = true
}
variable "app_port" {
description = "Porta para a aplicação"
type = number
default = 8080
}
4. Crie os containers
Adicione ao arquivo main.tf
:
# Container MySQL
resource "docker_container" "mysql" {
name = "mysql"
image = "mysql:8.0"
networks_advanced {
name = docker_network.app_network.name
}
env = [
"MYSQL_ROOT_PASSWORD=${var.mysql_root_password}",
"MYSQL_DATABASE=${var.mysql_database}",
"MYSQL_USER=${var.mysql_user}",
"MYSQL_PASSWORD=${var.mysql_password}"
]
ports {
internal = 3306
external = 3306
}
volumes {
host_path = "${path.cwd}/mysql-data"
container_path = "/var/lib/mysql"
}
}
# Container Redis
resource "docker_container" "redis" {
name = "redis"
image = "redis:alpine"
networks_advanced {
name = docker_network.app_network.name
}
ports {
internal = 6379
external = 6379
}
command = ["redis-server", "--appendonly", "yes"]
volumes {
host_path = "${path.cwd}/redis-data"
container_path = "/data"
}
}
# Container da Aplicação
resource "docker_container" "app" {
name = "app"
image = "node:14-alpine"
networks_advanced {
name = docker_network.app_network.name
}
ports {
internal = 3000
external = var.app_port
}
env = [
"MYSQL_HOST=mysql",
"MYSQL_USER=${var.mysql_user}",
"MYSQL_PASSWORD=${var.mysql_password}",
"MYSQL_DATABASE=${var.mysql_database}",
"REDIS_HOST=redis"
]
# Mantém o container rodando
command = ["sh", "-c", "echo 'App is running on port ${var.app_port}...' && tail -f /dev/null"]
depends_on = [
docker_container.mysql,
docker_container.redis
]
}
5. Configure os outputs
Cole no arquivo outputs.tf
:
output "app_container_ip" {
value = docker_container.app.network_data[0].ip_address
}
output "mysql_container_ip" {
value = docker_container.mysql.network_data[0].ip_address
}
output "redis_container_ip" {
value = docker_container.redis.network_data[0].ip_address
}
output "app_access_url" {
value = "http://localhost:${var.app_port}"
}
6. Execute o OpenTofu
Agora, execute:
# Inicializar
tofu init
# Verificar mudanças
tofu plan
# Criar a infraestrutura
tofu apply -auto-approve

Saída do comando tofu apply mostrando a criação bem-sucedida dos containers
Verificando a infraestrutura
docker ps
Pronto! Você acabou de criar uma stack Docker completa com OpenTofu. Para destruir, execute
tofu destroy -auto-approve
Próximos passos
Este tutorial cobriu apenas o básico do OpenTofu. A ferramenta suporta todos os recursos do Terraform que você já conhece:
- Gerenciamento de múltiplas clouds (AWS, GCP, Azure)
- Módulos reutilizáveis e composições
- Workspaces para ambientes isolados
- Backends remotos para colaboração em equipe
- Importação de recursos existentes
Dúvidas frequentes
P: Preciso migrar meus arquivos de estado?
R: Não! O OpenTofu usa o mesmo formato de arquivo de estado do Terraform.
P: Os módulos do Terraform Registry funcionam?
R: Sim, todos os módulos e provedores do ecossistema Terraform são compatíveis.
P: O OpenTofu tem suporte comercial?
R: Sim, várias empresas como Spacelift e Gruntwork oferecem suporte para OpenTofu.
P: É seguro usar em produção?
R: Absolutamente! Grandes empresas já migraram suas cargas de trabalho para o OpenTofu.