はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Terraform】Docker Providerを利用してローカルでインフラ環境を構築してみる

はじめに

Terraformを触っていたら、Docker Providerなるものがあることを見つけました。

registry.terraform.io

github.com

面白そうだったので触ってみたメモを残しておきたいと思います。

Docker Providerとは

Docker ProviderはDockerコンテナやイメージとやり取りをするためのProviderです。

The Docker provider is used to interact with Docker containers and images. It uses the Docker API to manage the lifecycle of Docker containers. Because the Docker provider uses the Docker API, it is immediately compatible not only with single server Docker but Swarm and any additional Docker-compatible API hosts.

Use the navigation to the left to read about the available resources.

// DeepL翻訳
Dockerプロバイダは、Dockerコンテナやイメージとやり取りするために使用されます。Docker APIを使用してDockerコンテナのライフサイクルを管理します。DockerプロバイダはDocker APIを使用しているため、シングルサーバDockerだけでなく、Swarmやその他のDocker互換APIホストともすぐに互換性があります。

Terraform Registry

tfファイルの記述

# main.tf
terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {
  host    = "npipe:////.//pipe//docker_engine"
}

# Pulls the image
resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

# Create a container
resource "docker_container" "tutorial" {
  image = docker_image.nginx.image_id
  name  = "tutorial"

  # -p 8000:80
  ports {
    internal = 80
    external = 8000
  }
}

Terraformの実行

Terraformコマンドを実行する際には、カレントディレクトリ直下の.tfが実行されるので注意してください。カレントディレクトリに含まれる.tfファイル全てに対してではありません。

# .tfファイルが直下にあるフォルダへ移動
$ cd <your_project_folder>

# 初期化
$ terraform init
Initializing the backend...

Initializing provider plugins...
- Reusing previous version of kreuzwerker/docker from the dependency lock file
- Using previously-installed kreuzwerker/docker v3.0.2

Terraform has been successfully initialized!

# 実行
$ terraform apply
...
docker_image.nginx: Creating...
docker_image.nginx: Creation complete after 6s [id=----nginx:latest]
docker_container.tutorial: Creating...
docker_container.tutorial: Creation complete after 0s [id=----]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

結果確認

# Docker Container一覧
$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                  NAMES
8010e5783101   2383c216ef35   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8000->80/tcp   tutorial

# Docker Image一覧
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    2383c216ef35   10 days ago   188MB

後片付け

pullしてきたDockerイメージや作成したコンテナを削除するには、以下のコマンドを打てば一発で消えます。

$ terraform destroy