TerraformでDockerコンテナを操作する

スポンサーリンク
TerraformでDockerコンテナを操作する ノウハウ
TerraformでDockerコンテナを操作する
この記事は約9分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、Terraformを使用したDockerコンテナの起動についてご紹介します。

スポンサーリンク

背景

先日の記事でTerraformをインストールしたので、今回は実際使用してみたいと思います。

Terraformのインストール記事に関しては、下記をご覧ください。

TerraformでDockerを操作する

Terraform をインストールしたので、Docker を使用して NGINX サーバーをプロビジョニングしてみます。

Docker Desktop for Mac

Dockerを使用するために、Docker Desktop for Mac をダウンロードし、インストールします。ローカルマシンにDocker をインストールしたら、Docker Desktop を起動します。

Docker Desktop for Macは下記からダウンロードし、インストールします。

Docker Desktop を起動します。

open -a Docker

NGINXのプロビジョニング

Learn-terraform-docker-container という名前のディレクトリを作成します

 mkdir learn-terraform-docker-container

この作業ディレクトリには、Terraform で作成および管理するインフラストラクチャを記述するために作成する構成ファイルが格納されています。 ここで構成を初期化して適用すると、Terraform はこのディレクトリを使用して、必要なプラグイン、モジュール (事前に作成された構成)、および作成した実際のインフラストラクチャに関する情報を格納します。

作業ディレクトリに移動します。

 cd learn-terraform-docker-container

作業ディレクトリで、main.tf というファイルを作成します。下記にファイルの中身を貼り付けます。

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

Terraform が Docker と対話できるようにするプロバイダーと呼ばれるプラグインをダウンロードするプロジェクトを初期化します。

terraform init

apply を使用して NGINX サーバー コンテナーをプロビジョニングします。 Terraform で確認を求められたら、yes と入力して ENTER を押します。

terraform apply

Web ブラウザーで localhost:8000 にアクセスするか、docker ps を実行してコンテナーを表示し、NGINX コンテナーの存在を確認します。

% docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
30f7d1ad2808   6405d9b26faf   "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:8000->80/tcp   tutorial

コンテナーを停止するには、terraform destroy を実行します。

terraform destroy

これで、Terraform を使用して NGINX Web サーバーをプロビジョニングし、破棄しました。

解説

main.tf

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

このコードは、DockerコンテナをTerraformを使ってデプロイするためのものです。Terraformは、コードでリソースを定義し、それを実行することで、インフラストラクチャの自動化を行います。この場合、TerraformはDockerプロバイダを使用して、DockerイメージとDockerコンテナを作成します。

まず、terraformブロックで、必要なプロバイダとそのバージョンを指定しています。ここでは、Dockerプロバイダを使用しているため、required_providersブロック内でdockerを指定しています。このブロックには、sourceversionを指定する必要があります。この例では、kreuzwerker/dockerという名前のプロバイダのバージョン3.0.1を使用しています。

次に、providerブロックで、Dockerプロバイダを設定しています。ここでは、何も指定せずにプロバイダを設定しています。この例では、Dockerプロバイダはローカルマシン上で実行されているDockerデーモンに接続することを期待しています。

その後、docker_imageブロックで、Dockerイメージを作成しています。ここでは、nameで作成するDockerイメージの名前を指定しています。また、keep_locallyfalseに設定することで、Dockerイメージをローカルで保持しないようにしています。

最後に、docker_containerブロックで、Dockerコンテナを作成しています。imageで使用するDockerイメージのIDを指定し、nameでDockerコンテナの名前を指定しています。また、portsで、内部ポート80を外部ポート8000にマッピングする設定を行っています。

以上が、このTerraformコードの概要です。これにより、DockerイメージとDockerコンテナが作成され、外部から8000番ポートでアクセスできるようになります。

terraform ブロック

Terraform ブロックには、Terraform がインフラストラクチャのプロビジョニングに使用する必要なプロバイダーなど、Terraform の設定が含まれています。プロバイダーごとに、 source属性はオプションのホスト名、名前空間、およびプロバイダーの種類を定義します。

プロバイダーは下記のリポジトリに登録されているものを使用します。

required_providersブロックで定義された各プロバイダーのバージョン制約を設定することもできす。このversion属性はオプションですが、構成で機能しないバージョンのプロバイダーが Terraform によってインストールされないように、これを使用してプロバイダーのバージョンを制限することをお勧めします。プロバイダーのバージョンを指定しない場合、Terraform は初期化中に最新バージョンを自動的にダウンロードします。

詳細については、プロバイダー ソースのドキュメントを参照してください。

provider ブロック

このproviderブロックは、指定されたprovider (この場合は ) dockerを構成します。providerは、Terraform がリソースの作成と管理に使用するプラグインです。

Terraform 構成で複数のproviderブロックを使用して、さまざまなproviderからのリソースを管理できます。異なるproviderを一緒に使用することもできます。たとえば、Docker イメージ ID を Kubernetes サービスに渡すことができます。

resource ブロック

resourceブロックを使用して、インフラストラクチャのコンポーネントを定義します。リソースは、Docker コンテナーなどの物理または仮想コンポーネントである場合もあれば、Heroku アプリケーションなどの論理リソースである場合もあります。

resourceブロックには、ブロックの前にリソース タイプとリソース名の 2 つの文字列があります。この例では、最初のリソース タイプは docker_image で、名前は nginx です。型のプレフィックスは、プロバイダーの名前にマップされます。構成例では、Terraform はdockerプロバイダーのdocker_imageを使用してリソース を管理します。リソース タイプとリソース名が一緒になって、リソースの一意の ID を形成します。たとえば、Docker イメージの ID はdocker_image.nginx.

resource ブロックには、リソースの構成に使用する引数が含まれています。引数には、マシンのサイズ、ディスク イメージ名、VPC ID などを含めることができます。コンテナーの場合、構成例では Dockerイメージをdocker_containerリソースのイメージ ソースとして設定します。

下記のリファレンスには、 各リソースの必須およびオプションの引数が記載されています。

おわりに

今日は、Terraformを使用して、Dockerコンテナを起動する方法をご紹介しました。機会があれば、AWSでインフラ環境を構築する方法をご紹介しようと思います。

今回使用したソースは下記のGitHubにあります。

よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました