Terraform quick start: Docker & Azure
Published: 2024-02-01 20:15:59



### Terraform with Docker

Create main.tf Terraform config file

```Terraform
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
  }
}

```

```shell
# 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
```

### Terraform with Azure
[Get Started - Azure](https://developer.hashicorp.com/terraform/tutorials/azure-get-started)

```shell
# 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
```

```terraform
# 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"
}
```

#### Explanation

Terraform Block

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

Providers Block

> The `provider `block 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

```shell
# 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"
> }

```

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

```shell
$ terraform state list

$ terraform state

$ terraform destroy

```