logo header
logo header
logo header
logo header
  • 2014.11.17
  • 技術ブログ開発

PackerとAnsibleで作るDockerイメージ

今年いっぱい東京暮らしとなったtacckです。
札幌は雪の降り始める気候となったようですが、東京は東京で寒いなぁと感じる今日この頃。

さて、Ansible関連の記事をいくつか書いてきましたので、「どういったところで使えるのか」という事例を知りたいところですね。

私も知りたい。

そこで今回は、Dockerのイメージを作るところで、Ansibleを活用する方法を見てみたいと思います。

Dockerのイメージを作る"Packer"

Dockerのイメージを作るには、標準で"Dockerfile"を利用した方法が提供されていますが、今回は"Packer"というシステムを利用したいと思います。

Packerは、大きく以下の二つの機能を提供してくれるシステムです。

  1. どのイメージを作成するか
  2. どんなイメージを作成するか

「どのイメージを作成するか」は、今回のDocker以外に、Amazon EC2、VMware、VirtualBox、といった有名どころの仮想環境実行システムのイメージを選択することができます。

「どんなイメージを作成するか」は、上記のイメージを作成する際の事前の環境構築の手順を記載するところです。
例えば、NginxとPHPとMySQLをインストールしたイメージを作る・・・といった指示を書く場所ですね。
この手順を記載する手段として、Ansible、Shellスクリプト、Chef、Puppet、といったものを選択することができます。

詳しくは、本家のドキュメントを参照してください。

Packerの利点

本題から少しそれますが、Packerというシステムの利点を私なりに簡単にまとめてみます。

上記の通り機能として、「イメージ作成先」と「イメージ作成手段」を分離したものになっています。
これによって、「Docker」イメージ作成に使った環境をそのまま「VirtualBox」イメージ作成に利用する、ということが簡単にできるようになります。

また、過去にChefで書いたレシピを流用する、といったこともできるようになるため、特にプロビジョニングの資産があるところでは導入の敷居が低くなると思います。

実際にやってみる

今回は、以下の順で環境を作っていきます。

  1. Vagrantで、Ubuntu 14.04上にDocker実行環境を構築。
  2. Docker上に、Ansible実行できるイメージを構築。
  3. Ansibleを利用してNginxをインストールしたイメージを構築。

DockerはLinuxの機能を利用するコンテナ型の仮想化システムなので、そもそもLinuxで動作させる必要があります。
そのため、まずはVagrantにLinuxをインストールしてDockerの実行環境を構築する必要があります。
今回は、Ubuntu 14.04を選択しました。

同じディレクトリに下記ファイルを用意してください。

Vagrantfile

nginx.yml

packer-ansible.json

packer.json

provision.yml

ファイルについては、下記でも公開しています。

https://github.com/tacck/docker/tree/master/packer%2Bansible-env

Vagrantで、Ubuntu 14.04上にDocker実行環境を構築

上記ファイルを用意したディレクトリで、Vagrantを実行します。
(Vagrant、VirtualBox、Ansibleがインストール済みの想定です。)

長いので割愛しますが、Docker、Packerのインストールされた環境が構築されます。

Docker上に、Ansible実行できるイメージを構築

次に、この環境を使い、Ansible実行できるDockerイメージを構築します。
こちらをPackerを使って行ないます。
Dockerのベースとなるイメージダウンロードも入るため、時間がかかりますが気長に待ちましょう。

今回使用するファイルは、packer.jsonです。

途中のログは割愛していますが、イメージがきちんと作成できたことが確認できました。

ここでは、Packerの機能の「どんなイメージを作成するか」というところでShellスクリプトを利用して、Ansible入りのイメージを構築しています。

Ansibleを利用してNginxをインストールしたイメージを構築

引き続き、上記のイメージ内のAnsibleを利用して、Nginxのインストールされたイメージを構築します。

今回のログを見て確認できる通り、

「Ansibleが利用されていること」

「イメージが作成されていること」

「作成されたイメージにきちんとNginxがインストールされていること」がわかります。

まとめ

今回の手順で、簡単にDockerイメージを作ることができることがわかりました。
Ansibleを使う事で、さらに手軽にイメージを作ることができます。

みなさんも、自分の必要なイメージを色々と作ってみましょう。

ともに世界をアップグレードできる、そんな日を夢見て。
Upgrade the World!