こんにちは。よっしーです(^^)
今日は、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
を指定しています。このブロックには、source
とversion
を指定する必要があります。この例では、kreuzwerker/docker
という名前のプロバイダのバージョン3.0.1を使用しています。
次に、provider
ブロックで、Dockerプロバイダを設定しています。ここでは、何も指定せずにプロバイダを設定しています。この例では、Dockerプロバイダはローカルマシン上で実行されているDockerデーモンに接続することを期待しています。
その後、docker_image
ブロックで、Dockerイメージを作成しています。ここでは、name
で作成するDockerイメージの名前を指定しています。また、keep_locally
をfalse
に設定することで、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にあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント