レッツトライ!夏休みに覚えるDocker

こんにちは。MOONGIFTというサイトを運営している中津川と言います。MOONGIFTは10年くらい前からオープンソース・ソフトウェアを紹介しているのですが、昨年よりサーバのホスティング先をさくらさんに変更しています。そんなご縁もあって、今回からさくらのナレッジにて記事を書かせてもらうことになりました。オープンソース・ソフトウェアのレビューやクラウド周りの最新情報発信などを行っていきますのでよろしくお願いします!
8月と言えば夏休みです。サーバ管理者の方もひと時の心休まるひと時を過ごされているのではないでしょうか。サーバルームの方が涼しいとか、いつ電話が鳴るか分からないなんてことは今は忘れましょう。
せっかくの夏休み、日頃の疲れを癒すべくゆったりと南国の空のもとで過ごすのも良いですが、ITエンジニアたるもの日々の精進は欠かせませんよね。ということで忙しい日々の業務に追われてなかなかトレンドをキャッチアップできていないという方向けに最近話題のDockerに関してまとめて情報をお届けしたいと思います。

目次
Dockerとは?
昨年、今年とサーバ界隈でたびたび話題にあがっているのがDockerです。Linuxコンテナを使ってアプリケーションの配置を自動化し、複雑化するサーバアプリケーションをシンプルなものにしてくれます。
Docker - Build, Ship, and Run Any App, Anywhere
よくある問題として、アプリケーションごとの依存するライブラリやプログラミング言語のバージョン問題や、多数のサーバで同じ環境を整えなければならないといったことがあります。1台セットアップして終わり、であれば関係ないでしょうが複数台をセットアップしたり、ライブラリをバージョンアップした時のテストなどを考えると頭の痛い問題です。
そういった問題の解決策として考えられているのがDockerです。開発環境のスクラップ&ビルドとしてよくきかれましたが、6月に1.0がリリースされたこともあって、実際の運用の中で使われるケースも増えています。
そこでまずはDockerを試すまでをステップを踏んで説明していきたいと思います。Linuxに限らず、手元のマシンでさくっと試せますのでぜひチャレンジしてみてください。
Windowsでの始め方
WindowsではWindows 7以上、かつ64bit版に対応したBoot2Dockerがリリースされています。GitHubからインストーラーがダウンロードできるようになっています。

インストーラーは VirtualBoxやGitクライアントも含んでいますので、他に用意するものはありません。既に環境があればそちらを利用することもできます。

インストールすると、 Boot2Docker Start というショートカットが作成されますので、それをダブルクリックするとコマンドプロンプトが開いてDockerが開始されます。 初期パスワードはtcuserです。

Dockerとは言っても、実際のところ CoreOSがインストールされたVirualBoxイメージが立ち上がるので、Windows上で動いているというのとは若干違うかも知れません。とは言えVirualBox上ではCoreOSが動いていますので普通にdockerコマンドが使えます。
$ docker run ubuntu /bin/echo hello world
などとコマンドを打てば、初回は数十MBのUbuntuイメージをダウンロード後、 hello world と出力されます。その後からはすぐにレスポンスが返るようになるはずです。
Mac OSXでの始め方
Mac OSXもそのまま動くのではなく、VirtualBox上のイメージを使って動作します。Mac OSXの場合、専用のインストーラーとHomebrewを使ったインストールの2種類が用意されます。Homebrewを使う場合、以下のコマンドでインストールできます。
$ brew tap homebrew/binary $ brew install docker boot2docker
インストールが終わったら、まず初期化をします。
$ boot2docker init
初期化のタイミングで公開鍵を生成したりします。次に起動です。
$ boot2docker up
VMが起動後、最後に
export DOCKER_HOST=tcp://192.168.59.103:2375
のようなメッセージが出ますので、これを環境変数として設定します。そうするとDockerのサーバにSSHでログインしたりすることなく、
$ docker run ubuntu /bin/echo hello world hello world
のように結果が得られるようになります。VMを介してはいますが、Windowsよりも本当のDockerっぽいと言えるでしょう。
クラウドでの始め方
さて、ここからが本番です。Dockerを使うのはやはり素のLinux上が一番すっきりしていると思います。今回は当社のさくらのクラウドを使ったDockerの始め方を紹介します。実際のところ、5分もかからずにはじめられるはずです。
必要なもの
<さくらのクラウドのアカウント>

アカウントはさくらのクラウドトップページからできます。
<クラウドサーバを追加する>

管理画面に入りましたら、サーバの追加を選択します。追加画面では、サーバの名前、メモリ数、ディスクプランなどを決めていきます。大事なのはアーカイブ選択の中にある CoreOS 367.1.0 (stable) を選択することです(バージョン番号は2014年08月現在です)。これだけで必要なものが揃います。

後はパスワードや公開鍵の入力などを行ってください。この状態で起動してみます。
<サーバに接続する>
Webベースのコンソールもありますが、今回はターミナルからつないでみます。公開鍵認証が優先なので、先ほど設定していれば、
$ ssh core@server_ip_address
で接続できます(server_ip_addressは各自読み替えてください)。IPアドレスはサーバ一覧のインタフェースで確認してもらえます。

<実行>
ログインできたら、
$ docker run ubuntu /bin/echo hello world
と打ってみます。回線の速度も速いので、30秒もあれば初回のイメージダウンロード&実行が行われるのではないでしょうか。その後の実行については待たされるようなことありません。

試してみる
環境が整ったところで、Dockerを試してみましょう。今回はよくありそうなケースとして、WordPressを設定してみることにしましょう。
とりあえず使ってみる
といっても特に作業する訳ではありません。既にDockerfileを用意してくれている方がいますので(ここがDockerの強みですね!)、それを利用します。
docker build -rm -t (your_name)/wordpress git://github.com/jbfink/docker-wordpress.git
(your_name) は自由に設定してください。これを実行すると、必要なイメージがダウンロードされてビルドが開始されます。終わったら、
$ docker run --name wordpress -d -p 8080:80 -p 2022:22 (your_name)/wordpress
のように実行します。(your_name) は先ほど決めたものを指定してください。80番(HTTP)、22番(SSH)のポートをホストのどこにルーティングするかも設定しています。この例の場合、80番を8080に、22番を2022に指定しています。
この起動は一瞬で終わるはずです。終わったら、 http://(さくらのクラウドのIPアドレス):8080/ にアクセスしてみてください。WordPressのインストール開始画面が表示されるはずです。

使い終わったら、
$ docker stop wordpress
で終了します。これは8080にもアクセスできなくなります。もう一度再開するには、
$ docker start wordpress
と入力します。
なお、このWordPressのDockerfileの場合、SSHやMySQLのパスワードはログファイル中に書き出されています。
$ docker logs wordpress ssh user password: hogehoge // <- ここ 140731 07:47:57 mysqld_safe Can't log to error log and syslog at the same time. Remove all --log-error configuration options for --syslog to take effect. 140731 07:47:57 mysqld_safe Logging to '/var/log/mysql/error.log'. 140731 07:47:57 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql mysql root password: hugahuga // <- ここ wordpress password: testtest // <- ここ 140731 07:48:08 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
のような感じです。
別なコンテナを作ってみる
先に作ったWordPressを終了します。
$ docker stop wordpress
そして再度、今度は名前を変えて実行してみます。
$ docker run --name wp2 -d -p 8080:80 -p 2022:22 (your_name)/wordpress
これで再度ブラウザでアクセスすると、またインストールから開始になります。最初に作ったWordPressとは別物です。
変更した内容を保存しておく
コンテナは基本的に実行後に破棄されます。しかし実行した状態を呼び出したいという場合は多いと思います。そんな時にはまず、 $ docker ps -a を実行します。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 75ccdd14edde moongift/wordpress:latest /bin/bash /start.sh 3 minutes ago Exited (-1) 47 seconds ago wp3 5639dc9af0b5 moongift/wordpress:latest /bin/bash /start.sh 5 minutes ago Exited (-1) 3 minutes ago wp2 31a1145c2146 moongift/wordpress:latest /bin/bash /start.sh 35 minutes ago Exited (-1) 4 minutes ago wordpress ab7ef4cc2467 ubuntu:latest /bin/echo hello worl 53 minutes ago Exited (0) 53 minutes ago drunk_archimedes b6b436f12593 ubuntu:latest /bin/echo hello worl 53 minutes ago Exited (0) 53 minutes ago berserk_wilson
そうするとこのように一覧が出ますので、この中から使いたいコンテナIDをコピーして状態をコミットします。
$ docker commit 31a1145c2146 wp:test
これでコンテナがコミットされ、イメージ化されます。
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE wp test 9dfde4e6f5c7 34 seconds ago 499.4 MB moongift/wordpress latest 4f14d0b090bd 39 minutes ago 474.7 MB ubuntu latest ba5877dc9bec 9 days ago 192.7 MB
こうやって既存のイメージから自分のカスタマイズを行っていくことができるようになります。
コンテナと仮想化の違い
Dockerは古くからあるコンテナ技術を今風にしたもので、昔であればchrootやjailといった技術で知られていました。ある領域以下を囲んで(コンテナ化して)、外部から触れなくしたり、逆に内部からも外部を触れなくすることでセキュアな環境を用意します。とは言え仮想化とは異なり、同じOS上で動いているものになるのでバーチャルマシンのように毎回の実行に数十秒かかるといったことはありません。突き詰めればプロセスの一つです。
コンテナはCPUやメモリなどのリソースも分割して管理されますので、一つのコンテナがCPUをマックスまで使ってしまっても他のコンテナが影響を受けることはありません。そういった独立性も大事な技術です。また、コンテナ内部からホストの環境に直接触れないということもあって、万一セキュリティインシデントがあってもコンテナを破棄するだけという安心もあります。
他のDockerを探す
他の方が作ったDockerを探すにはDocker Hubを使うのが一番です。Docker Hubについては当ブログの記事、Dockerコンテナをクラウドサービス上で共有できる「Docker Hub」を使ってみるを参考にしてください。
GitHub風のUIで、有名なソフトウェアを使えるDockerリポジトリが並んでいます。ここを探すだけでも大抵のものが手に入りそうです。
自作コンテナの作り方
DockerはDockerfileという設定ファイルを記述してコンテナを作成できるのですが、ゼロから全て記述して作っていくというのは意外と骨が折れる作業です。個人的にはベースになるコンテナを取ってきて、そこに必要なライブラリを入れつつコミットしていくのが早いのかなと思います。
一度UbuntuやCentOSでコンテナを作成し、bashで接続します。
$ docker run -i -t ubuntu /bin/bash
後はこの状態から必要なライブラリをインストールしていきます。終わったらexitします。
$ exit
Dockerを実行しているshellに戻ったら、イメージの一覧を表示します。-a をつけて、終了しているコンテナも出します。
$ docker ps -a
その中(恐らく一番上)に今作業したコンテナが出ると思いますので、それをコミットしてイメージにします。
$ docker commit COMMIT_ID (your_name)/(image_name)
これで作業状態がコミットされます。こうやって段階的に作っていくのが一番手軽だと思います。作業が終わればプッシュすることでDocker Hubなどに保存されます。
Dockerfileを作成する
Dockerfileを使った場合、ベースになるUbuntu/CentOSなどのイメージからコマンドを実行してコンテナを作っていきます。まっさらから作りますので環境が綺麗に整います。
ROM ubuntu MAINTAINER Your name <example@example.com> RUN echo "Hello World"
この形がDockerfileの基本形になります。後はDockerfileのあるディレクトリで、
docker build -t (your_name)/(your_image_name) .
と実行するとイメージが作成(ビルド)されます。
Dockerコンテナをゼロから作成する
さらにDocker Hubからだけでなく、自分でゼロからコンテナを作ることもできます。当ブログの記事、Docker向けのコンテナをゼロから作ってみようを参考にしてください。
Dockerホスト/ゲストでファイル共有
Dockerのホストとゲストで特定のディレクトリを共有できます。こうすることで複数コンテナ間でファイルを共有したり、コミットしなくともデータの永続化を実現できます。
$ docker run -v /host_path:/guest_path -i -t (your_name)/(your_image_name) /bin/bash
このように host_path と guest_path を指定するだけで共有できます。
便利なサービスたち
Web UI
Dockerを自動化する場合はコマンドラインで操作していくのが良いですが、その管理となるとWebブラウザ上で行いたいと考えるでしょう。そこで幾つかのDocker管理UIがリリースされています。
<Shipyard>

ShipyardをインストールするのもDockerでできます。こういう所も便利ですね。
docker run -i -t -v /var/run/docker.sock:/docker.sock shipyard/deploy setup
立ち上がったら、 http://docker_ip:8000/ へアクセスして、 admin/shipyard でログインできます。
<DockerUI>

DockerUIは以下のようなコマンドでインストール、実行できます。
$ docker build -t crosbymichael/dockerui github.com/crosbymichael/dockerui $ docker run -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock crosbymichael/dockerui -e /docker.sock
これで完了です。 http://docker_ip:9000/ へアクセスするとDockerUIの管理画面が表示されます。
便利なライブラリ
その他にもDocker周辺には様々なサービスが立ち上がっています。ここではその一例を紹介します。
<Flynn>

DockerをHeroku風に使おうという試みです。つまりDockerをPaaSにしてしまうということです。Go言語で書かれています。
Flynn - The product that ops provides to developers
<CoreOS>

Dockerのために作られたごく小さなLinuxディストリビューションです。元々DockerはCentOSやUbuntuなどで動いていましたが、今度はCoreOSをベースにしていくのが一番速そうです。
CoreOS is Linux for Massive Server Deployments
<Using etcd with CoreOS>

Dockerでetcdを使う方法です。etcdを使うことで設定ファイルを共有できるようになりますので、Dockerが複雑化したり、複数のコンテナ間で設定を共有できるようになります。
<Deis>

Docker/CoreOSを使った軽量PaaSです。Herokuと同じような使い方でDockerコンテナ上で動作するアプリケーションがデプロイできます。
<Shippable>

ShippableはGitHub/Bitbucketに対応したCIサービスを提供しています。その際、Dockerを使ってセキュアに実行できるようになっています。
Shippable: Hosted continuous integration and deployment platform
ホスティング
Dockerを使ったホスティングは実に数多いです。元々コンテナ技術を使ったホスティングサービスは幾つかあったのですが、Dockerによってより手軽に、自動スケーリングできるようになったということかも知れません。
<Orchard>

メモリは512MB〜8GB、ディスクはSSDで20GB〜60GBまで選べます。コア数も1〜4コアとなっています。価格は月額10ドル(または1.34セント/時間)〜月額160ドル(または21.44セント/時間)となっています。
Orchard | Instant Docker hosts in the cloud
<Tutum>

月額4ドル(256MBメモリ)から月額64ドル(4GBメモリ)となっています。フリートライアルも用意されています。
Docker Hosting – Run Docker Containers in the Cloud - Tutum
<Stackdock>

価格は3段階で、1〜12GBのメモリ、ディスクはSSDで20〜100GB、コア数は1〜4コアとなっています。最低月額5ドルから100ドルと幅広くなっています。
Stackdock - Docker hosting on blazing fast dedicated infrastructure
<Quay.io>

こちらはDockerリポジトリをホスティングするサービスになります。月額12ドルで5つのリポジトリを管理できます。チームであれば10リポジトリが25ドルからとなっています。
Hosted Private Docker Registry · Quay.io
<Docker Hub>

Dockerでもプライベートリポジトリホスティングサービスを提供しています。月額7ドルで5つのプライベートリポジトリが利用できます。
Docker Hub - Content, Collaboration, Workflows, and More
その他
<The Docker Book>

Dockerに関する書籍(英語)を販売しています。価格は9.99ドルです。PDF/ePub/Kindle版などがあります。日本でもKindle本を中心に幾つか解説書が出てきていますね。
いかがだったでしょうか。Dockerはファイルシステム、環境をポータブルにし、差分の管理を使ってサーバ設定を自動化できます。サーバ管理者がテスト環境を構築していく以外にも用途が増えていっています。
本番環境での利用は怖くとも、社内の開発部署内で使ってみるのはいかがでしょう。RedmineやJenkins、WikiエンジンなどもDockerを使って一発構築できますし、WordPressなどの環境も簡単に構築できますのでデザイナーの方にとっても便利ではないでしょうか。
Dockerはテスト時にはローカルでも良いですが、やはりCoreOSを使って高速なネットワークを使って素早くコンテナを作り出すところに気持ちよさがあります。ぜひ1時間9円から使えるさくらのクラウドでDockerの面白さを体感してください!
【関連記事】
>>これから始める「DockerでかんたんLAMP環境 for CentOS」
>>Dockerコンテナをクラウドサービス上で共有できる「Docker Hub」を使ってみる
>>Docker向けのコンテナをゼロから作ってみよう