弊社で定期的にやっている社内ワークショップで、Dockerを試してみるというテーマを扱いました。筆者自身、このワークショップの為にDockerを使ってみたのが正直なところなのですが、思ったほど敷居は高くないという印象です。

本番環境でWebサーバやアプリケーションサーバとして運用する場合は事情は異なると思いますが、ちょっとした開発環境を構築するなどの用途であれば、気軽に使うこともできそうです。

今回は、Dockerの詳細には深入りせず、ワークショップでやった内容をそのまま紹介しようと思います。

目次

Dockerについて

Dockerはコンテナ型の仮想環境構築を実現するツールです。KVMなど仮想マシンによるハイパーバイザ型の仮想化と比較し、以下のような利点があると言われています。

  • 仮想化によるオーバーヘッドが小さい
  • イメージのサイズは小さく軽量

コンテナ型仮想化のメリットとして一般に強調されるのは、仮想化によるオーバーヘッドが小さいという点です。仮想マシンによる仮想化では、ホストOS上でゲストOSを実行する必要があるため、そのためのオーバーヘッドが生じます。一方、DockerやLXCなどコンテナによる仮想化の場合、こうしたオーバーヘッドはほとんど生じません。

また開発環境・検証環境として使用する観点では、イメージサイズの小ささもメリットとなります。筆者もよくVagrant(VirtualBox)で仮想環境を構築するのですが、boxのサイズが大きく、いつの間にかイメージでディスクの容量を逼迫していたといったこともありました。こうしたユースケースでも、コンテナ型の仮想化は有利だと言えるでしょう。

Dockerを使ってみる

以下では、CoreOSを使ったDockerの使い方について簡単に紹介していきます。

VagrantでのCoreOSの起動

今回は、Vagrant上のCoreOSを使ってDockerを使用しますので、まずはVagrantで仮想マシンを立ち上げます。

CoreOSにログインしたら、Dockerが入っていることを確認します。

以下のようにバージョン情報が表示されればDockerが利用できます。

イメージの取得とコンテナの起動

弊社では主にCentOSを使っているので、今回はCentOSを利用する方法を述べていきます。まずはCentOSのイメージを取得しましょう。docker pullというコマンドを実行すると、後述するDocker Hub上からDockerのイメージをダウンロードできます。

イメージをpullした後でdocker imagesを実行してみます。docker imagesはローカルにあるDockerのイメージを一覧で確認できます。先ほどダウンロードしたCentOSのイメージが確認できるはずです。

さて、ダウンロードしたイメージ上で何かしらコマンドを実行したい、ということがあると思います。ここでは試しにCentOS上で yum version を実行してみましょう。

下記のようにバージョンが表示されるので、確かにCentOS上でコマンドを実行できていることが確認できます。

コンテナからのイメージ保存

Dockerで生成したコンテナ上でコマンドが実行できたとはいえ、それだけではあまり役に立ちませんよね。

次はイメージから生成したコンテナに変更を加え、そのコンテナを保存してみましょう。下記のコマンドを実行すると、CentOS上のbashに入れます。

立ち上げたコンテナのシェル上で、適当にコマンドを実行してみましょう。今回はPHPをインストールしてみます。

インストールが完了したら、コンテナ上のシェルから出ます。コンテナ上で実行したコマンドが終了したことが確認できます。

docker ps -l で最新のコンテナに関する情報が確認できます。コンテナのIDを使い、コミットしてイメージ作成します。

docker commit でコンテナをコミットします。

再び docker images によりイメージの一覧を確認すると、先ほどのコミットで新しいイメージができていることが確認できると思います。

イメージが生成できていることを確認できたら、いったんコンテナは削除してしまいましょう。docker ps -a -q で存在するコンテナのIDのみをすべて出力することができます。

改めてイメージからコンテナを立ち上げると、先ほどインストールしたPHPが入っていることを確認できます。

このようにコンテナをコミットすることで、新しいイメージとして保存することが可能です。

イメージの取得からコンテナ作成までの流れ

ここまでの流れを簡単にまとめると、以下のようになります。

docker_image_commit

最初にイメージを取得したうえで、イメージからコンテナを立ち上げるには、 docker run を実行します。逆にコンテナからイメージを生成する場合は docker commit を使うという感覚です。

Dockerfileを使ったイメージの作成

前章では変更したコンテナの内容を docker commit することでイメージを作成しました。

先の方法でもイメージを作成することはできますが、完成されたイメージが共有できるのみで、そもそもそのイメージがどのような手順を経て構築されたのか?を知ることができません。

そこでこのイメージ生成のための手順を記述したものが、 Dockerfileです。Dockerfileでもベースとなるイメージを使用するのですが、ベースとなるイメージから、各種コマンドを実行したりポートを変更したうえで、新しいイメージを作成できます。

今回はDockerfileの例として、なんちゃってLAMP環境を作成してみましょう。

Apacheのインストール

Dockerfileへは以下の内容を記述します。

Dockerfileが記述できたら、ビルドしてイメージを生成してみましょう。

問題がなければ、Successfully … と表示されます。問題がなければ、立ち上げてみましょう。

docker run は立ち上げのコマンドです。-d はデタッチモードでの立ち上げ、また -p ではコンテナとDockerを実行しているOSの間でポートのマッピングを行うことができるオプションです。

正常に立ち上がっていれば、下記のURLでApacheが立ち上がっていることが確認できるはずです。
http://172.17.8.101/

PHPの実行環境構築

次はPHPをインストールしてみましょう。Dockerfileを下記のように変更します。

phpの動作確認ができるように、index.phpというファイルを作っておきます。

先ほどと同じようにビルドし、実行してみましょう。既に実行中のコンテナがポートを使用していると、80番へのマッピングができずエラーになるので、実行前に既存のコンテナは停止させておきます。

先ほどと同じURLへアクセスすると、phpinfo()によって出力されるPHPの情報が表示されるはずです。

MySQLのインストール

続いてLAMPのMである、MySQLをインストールしてみましょう。

先ほどのDockerfileは以下のように変更します。

先ほどと同じように、ビルドと実行をおこないます。

再び先ほどのURLへアクセスすると、PhpMyAdminライクなGUIの管理画面であるAdminerのログイン画面が表示されるはずです。MySQLはセーフモードで立ち上げているので、 root というユーザ名さえ入力すればログインすることができます。

この例でもわかるように、docker runにより実行する際にはプロセスをフォアグラウンドで起動しておく必要があります。今回はApacheやMySQLを直接起動しましたが、実際にDockerを活用する場合、実行時に複数のプロセスを実行しておくことが必須になるはずです。プロセスをデーモン化するsupervisordなどをフォアグラウンドで起動することで、複数のプロセスを立ち上げることになると思います。

Docker Hubでのイメージ共有

Dockerには、Docker HubというDockerのイメージを共有できるプラットフォームがあります。全世界のDockerユーザーが公開しているイメージを探して使用することができるので、ちょっとした実行環境がほしいというときには、ここから目的のイメージを探して共有することができます。

前章までで使用したCentOSのイメージも、Docker Hubから取得してきたものです。

またイメージは利用するのみならず、アカウントを取得すれば、誰でも自由にイメージを公開することができます。ここでは簡単なイメージの利用方法を紹介します。

Docker Hubから共有されているイメージを探す

Docker Hub内にあるこちらのページからイメージを探すことができます。

探してきたイメージは、以下のコマンドでに利用できます。

Docker Hubへイメージを公開する

Dockerのイメージ公開にはDocker Hubのアカウントが必要です。アカウントの作成はこちらから可能なので、興味のある方は作成してみてください。

作成後、Dockerの入っているマシンに戻り、以下のコマンドを入力します。

ログインすると、以下のコマンドでDocker Hubにイメージを共有することができます。

GitHub/BitBucketと連携したイメージの自動ビルド

Dockerfileを管理するGithubやBitBucketのリポジトリと連携し、Dockerfileの更新にあわせてイメージをビルドすることができます。

docker_automated_build

これを利用すると、Dockerfileを編集するだけで編集後のイメージ配布ができるので、継続的に変更を加えていくようなイメージの配布にも便利です。

前章で作成したDockerfileも、Automated Buildを利用してこちらからダウンロードできるようにしています。

まとめ

Dockerは、少し利用するだけならたいして難しいものではありません。検証環境を作っては壊し…といったことをしたいケースなどでは、Vagrantで構築をし直すよりも、Dockerで構築するのが便利です。

また本番環境での具体的な運用事例が出てくれば、今後幅広い領域で使われる可能性をもった技術だと思います。2014年10月現在のところ、Dockerを本格的に使用した事例はまだ少ないと思いますが、まずは簡単なケースで使用してみるといいのではないでしょうか。