読者です 読者をやめる 読者になる 読者になる

Terraform0.4のDockerサポートを試してみた

Terraform Docker

みんなだいすきテッッラフォォォォムゥ!! ということで本日はTerraformネタをお届けします。

そもそもTerraformとは

TerraformはHashicorpがリリースしているオーケストレーションツールです。

Terraform by HashiCorp

ChefやAnsibleでは作られた環境に対してミドルウェアツールをインストール、設定等をプログラマブルに行いますが、Terraformでは環境そのものの作成をプログラマブルに行うという点が違います。

Terraformでは様々なクラウド環境やホスティングサービスに対応しています。TerraformではこれらをProvidersと定義しています。

最近AWSプロジェクトやってるので、AWSのマネジメントコンソールを使って構築するのではなく、基本的にTerraformを使って行ってます。まあ微妙に機能足りない

で、Terraformは最近最新のver0.4.0がリリースされたんですが、このバージョンでは新規にDockerが対応されたので早速試してみましたよという話。

Dockerのオーケストレーション

Dockerのコンテナを起動するには、Dockerのイメージをダウンロード(docker pull)したり、Dockerfileを作って独自にイメージをビルドしたり(docker build)してイメージを用意して、docker runすることで起動させることができます。

$ docker run -d -p 5432:5432 --name postgres-local -e POSTGRES_USER=tehepero -e POSTGRES_PASSWORD=tehepero postgres:9.4

1つであればこれで十分ですが、開発では色々なミドルウェアを使って開発するわけで一々docker runするのは面倒臭いし管理も大変です。というわけでそれを管理するようなツールも出てきました。

Docker Compose

docs.docker.com

その代表格としてDocker Composeがあります。Docker ComposeはもともとFigという名前で開発されていて、最近Docker本体に取り込まれてDocker Composeとなりました。

基本的に仕様はFig時代と変わってなくて、YAMLファイルでコンテナを管理します。docker-compose.yml(旧: fig.yml)を以下のような感じで用意するわけです。

web:
  build: .
  links:
   - db
  ports:
   - "8000:8000"
db:
  image: postgres

構成がYAMLに集約されることによって、docker runしまくるような管理から開放されるのがメリットですね。

TerraformでDockerのコンテナを立ち上げる

本題。TerraformでDockerのコンテナを立ち上げましょう。DockerのホストはAWSでもDigitalOceanでもboot2dockerでもdocker-machineでもなんでもいいです。

TerraformでのDockerコンテナ構築機能については、公式ドキュメントを見るとよいでしょう。

Provider: Docker - Terraform by HashiCorp

今のところ機能としては大きく2つあって、docker_container(コンテナを生成する)とdocker_image(利用するイメージを定義する)とだけです。ポートの設定やボリュームのマウント等、docker-composeでもあるような機能はある程度抑えているといった印象です。ただ、docker-composeではDockerfileをビルドして、即起動みたいなことができますが、イメージのビルドはTerraformのスコープ外のようですね。あくまで出来上がっているイメージを利用するという感じだと思います。

Terraformを実行するディレクトリに.tfファイルを用意して、どのような構成にするかを書きます。.tfファイルになっているものは全て実行対象になります。試しに以下のようなのを書きました。

provider "docker" {
    host = "tcp://XXX.XXX.XXX.XXX:XXX"
}

resource "docker_image" "aeromock" {
    name = "stormcat24/aeromock:latest"
}

resource "docker_container" "aeromock" {
    image = "${docker_image.aeromock.latest}"
    name = "aeromock"
}
  • provider:ターゲットとなるDockerのホストを定義する(IPとポートはマスクしてます)
  • docker_image:利用するイメージを定義する
  • docker_container:コンテナ名と、どのイメージを利用するかというのを定義したdocker_imageから参照する

といった感じ。

$ terraform apply

するとDockerホスト上にコンテナがサクッと作成されます。

メリットとしては、例えばCoreOSでDockerをホストするようなサーバをTerraformで構築して、その一連の流れでDockerのコンテナの作成までも行えちゃうということでしょうか。ただ、クラスタを組んで実践的な運用ができるような構成を作ったりするのは厳しいでしょうね。使いどころはちょっとこれから探っていこうかと思います。