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)