レッツトライ!夏休みに覚える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からインストーラーがダウンロードできるようになっています。

Windowsはインストーラー付属です

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

アイコンをダルブクリックでDockerが開始します

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

Windows版での起動画面

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月現在です)。これだけで必要なものが揃います。

アーカイブ選択でCoreOSを選択します

後はパスワードや公開鍵の入力などを行ってください。この状態で起動してみます。

<サーバに接続する>

Webベースのコンソールもありますが、今回はターミナルからつないでみます。公開鍵認証が優先なので、先ほど設定していれば、

$ ssh core@server_ip_address

で接続できます(server_ip_addressは各自読み替えてください)。IPアドレスはサーバ一覧のインタフェースで確認してもらえます。

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のインストール開始画面が表示されるはずです。

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 Hub

自作コンテナの作り方

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

ShipyardをインストールするのもDockerでできます。こういう所も便利ですね。

docker run -i -t -v /var/run/docker.sock:/docker.sock shipyard/deploy setup

立ち上がったら、 http://docker_ip:8000/ へアクセスして、 admin/shipyard でログインできます。

Shipyard Project

<DockerUI>

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>

Flynn

DockerをHeroku風に使おうという試みです。つまりDockerをPaaSにしてしまうということです。Go言語で書かれています。

Flynn - The product that ops provides to developers

<CoreOS>

CoreOS

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

CoreOS is Linux for Massive Server Deployments

<Using etcd with CoreOS>

etcd

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

Using etcd with CoreOS

<Deis>

Deis

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

Deis | Your Paas. Your Rules.

<Shippable>

Shippable

ShippableはGitHub/Bitbucketに対応したCIサービスを提供しています。その際、Dockerを使ってセキュアに実行できるようになっています。

Shippable: Hosted continuous integration and deployment platform

ホスティング

Dockerを使ったホスティングは実に数多いです。元々コンテナ技術を使ったホスティングサービスは幾つかあったのですが、Dockerによってより手軽に、自動スケーリングできるようになったということかも知れません。

<Orchard>

Orchard

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

Orchard | Instant Docker hosts in the cloud

<Tutum>

Tutum

月額4ドル(256MBメモリ)から月額64ドル(4GBメモリ)となっています。フリートライアルも用意されています。

Docker Hosting – Run Docker Containers in the Cloud - Tutum

<Stackdock>

Stackdock

価格は3段階で、1〜12GBのメモリ、ディスクはSSDで20〜100GB、コア数は1〜4コアとなっています。最低月額5ドルから100ドルと幅広くなっています。

Stackdock - Docker hosting on blazing fast dedicated infrastructure

<Quay.io>

Quay.io

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

Hosted Private Docker Registry · Quay.io

<Docker Hub>

Docker Hub

Dockerでもプライベートリポジトリホスティングサービスを提供しています。月額7ドルで5つのプライベートリポジトリが利用できます。

Docker Hub - Content, Collaboration, Workflows, and More

その他

<The Docker Book>

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向けのコンテナをゼロから作ってみよう

おしらせ