DEV Community

Le Vuong
Le Vuong

Posted on • Edited on

Terraform Tutorial: Docker & Azure

Terraform with Docker

Create main.tf Terraform config file

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = "tutorial"

  ports {
    internal = 80
    external = 8000
  }
}

Enter fullscreen mode Exit fullscreen mode
# Initialize the project, which downloads a plugin called a provider that lets Terraform interact with Docker.
terraform init

# Provision the NGINX server container with apply. Type 'yes' to confirm.
terraform apply

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
425d5ee58619        e791337790a6              "nginx -g 'daemon of…"   20 seconds ago      Up 19 seconds       0.0.0.0:8000->80/tcp     tutorial

# To stop the container, run terraform destroy.
terraform destroy
Enter fullscreen mode Exit fullscreen mode

Terraform with Azure

Get Started - Azure

# Login to azure
az login

# set az subscription
az account set --subscription "35akss-subscription-id"

# create service principal
az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/<SUBSCRIPTION_ID>"

# Set your environment variables

export ARM_CLIENT_ID="<APPID_VALUE>"
export ARM_CLIENT_SECRET="<PASSWORD_VALUE>"
export ARM_SUBSCRIPTION_ID="<SUBSCRIPTION_ID>"
export ARM_TENANT_ID="<TENANT_VALUE>"

# Write configuration
mkdir learn-terraform-azure; cd learn-terraform-azure
Enter fullscreen mode Exit fullscreen mode
# Configure the Azure provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0.2"
    }
  }

  required_version = ">= 1.1.0"
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "myTFResourceGroup"
  location = "westus2"
}
Enter fullscreen mode Exit fullscreen mode

Explanation

Terraform Block

The terraform {} block contains Terraform settings, including the required providers Terraform will use to provision your infrastructure.

Providers Block

The providerblock configures the specified provider, in this case azurerm. A provider is a plugin that Terraform uses to create and manage your resources.

Resource Block

Use resource blocks to define components of your infrastructure. A resource might be a physical component such as a server, or it can be a logical resource such as a Heroku application.
Resource blocks have two strings before the block: the resource type (azurerm_resource_group) and the resource name (rg). azurerm is the prefix to specify provider. azurerm_resource_group.rg is the full resource ID.

Format and validate the configuration

# Format terreform config file
terraform fmt

# validate the config
terraform validate

# apply config. Type 'yes' to confirm the changes
terraform apply

# Inspect your state
# When you apply your configuration, Terraform writes data into a file called terraform.tfstate.
# This file contains the IDs and properties of the resources Terraform created
# Your state file contains **sensitive values in plaintext**
terraform show

> resource "azurerm_resource_group" "rg" {
>     id       = "/subscriptions/c9ed8610-47a3-4107-a2b2-a322114dfb29/resourceGroups/myTFResourceGroup"
>     location = "westus2"
>     name     = "myTFResourceGroup"
> }

Enter fullscreen mode Exit fullscreen mode

To review the information in your state file, use the state command.

$ terraform state list

$ terraform state

$ terraform destroy

Enter fullscreen mode Exit fullscreen mode

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more