¿Qué es terraform? ¿Por qué los DevOps lo aman? Imagina levantar servidores, bases de datos, redes, contenedores… todo con solo algunas líneas de código. ¿Suena interesante verdad?
Todo esto lo hace posible Terraform, Infraestructura como Código (IAC). Desarrollado por HashiCorp, permite definir nuestra infraestructura en archivos de configuración!
Ventajas de usar Terraform
- Poner en línea servidores
- Crear redes virtuales y balanceadores de carga
- Automatizar y versionar entornos
- Reproducir entornos completos (desarrollo/staging/producción)
¿Qué lenguaje usa Terraform?
Usa su propio lenguaje HCL (HashiCorp Configuration Language)
resource "leocorp_nginx" "nginx" {
name = "nginx_leocorp"
image = "nginx:latest"
}
No es un lenguaje de programación tradicional, es más un lenguaje declarativo (tú describes el estado, terraform se encarga)
Manos a la obra
Levantaremos un servidor nginx usando Terraform, todo desde 0 y paso a paso.
Para esto ya debes tener instalado en tu equipo Docker y Terraform
Orden Orden Orden
Crearemos una carpeta dedicada para este proyecto
mkdir leocorp-terraform && cd leocorp-terraform
¿Qué archivos tendremos en esta carpeta?
Solemos utilizar los siguientes archivos:
- main.tf: El principal archivo, es el que tendrá nuestra arquitectura
- variables.tf: Hoja de configuración, al tener esto podemos trabajar con múltiples entornos
- outputs.tf: Útil para describir lo que estamos creando
Arquitectura Principal
En esta oportunidad nos enfocaremos en main.tf debemos primero elegir nuestro proveedor, el plugin de proveedor nos permite añadir funcionalidades e interactuar con los componentes que necesitamos. En este caso utilizaremos kreuzwerker/docker en su versión más reciente 3.0.2.
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "3.0.2"
}
}
}
Una vez instalado el plugin debemos configurar nuestro proveedor, como realizaremos esta prueba de manera local podemos colocar lo siguiente:
provider "docker" {}
Finalmente los recursos que queremos configurar, en este caso levantaremos un contenedor de nginx y configuramos el puerto 8080 en nuestro ordenador apuntando al puerto 80 en el contenedor.
resource "docker_container" "nginx" {
name = "nginx"
image = "nginx:latest"
ports {
internal = 80
external = 8080
}
}
¿Ya estamos listos? Ya casi, debemos inicializar y aplicar la configuración
terraform init
Al inicializar se descargarán los plugins necesarios para poder desplegar nuestra arquitectura

Una vez inicializado podemos levantar nuestra arquitectura
terraform apply
Si todo va bien nos mostrará una lista de recursos que serán modificados/creados/eliminados

La aprobación es manual, descuida solo por ahora 😉

Una vez aprobado el plan de ejecución nuestro contenedor ya debería estar desplegado, podemos verificar con los logs
docker logs nginx

O accediendo al puerto 8080 desde nuestro navegador, donde veremos lo siguiente

Consideraciones
Ten en cuenta que estamos conectándonos a nuestro daemon de docker local, si no está ejecutándose el servicio puedes tener un error como este:

Si tienes problemas con los puertos prueba cambiando el puerto de tu host. En vez de 8080 podrías probar otros como 3000 o 4200.
Conclusiones
Hemos manipulado contenedores en nuestro daemon de docker de manera local y todo con archivos de configuración y la herramienta terraform!
Aún nos falta optimizar esto y realizar configuraciones que consideren diferentes valores según el entorno que deseamos desplegar, no te preocupes eso vendrá en la siguiente entrada 😀