はじめてのDocker on Mac OS X

docker

ども、大瀧です。
今週金曜日にあるDocker Meetup Tokyo #2という勉強会でLTすることになりまして、大慌てでDocker触ってます。Dockerの開発は非常に活発で、新機能や仕様変更が続々と出ており刺激的なのですが、手元の開発環境として使っているMBAでのセットアップ方法が以前と変わりすぎていたので、備忘録としてまとめておきます。

Dockerの実行方法はVagrantを使う方法などいくつかありますが、今回はDocker公式ドキュメントをベースに、Homebrewで簡単にインストールする方法をチョイスしてみました。すぐに陳腐化する恐れがありますので、そこんとこオナシャス!です。

必要なソフトウェア

VirtualBoxおよびHomebrewのインストールは割愛しますので、先にセットアップを済ませておきましょう。Homebrewについては、以下のコマンドが通ればOKです。

ikkomon:~ ryuta$ brew --version
0.9.5
ikkomon:~ ryuta$

構成

OS X環境のDockerは、以下のソフトウェアの組み合わせで実行します。

構成図で書くと、以下のような感じになります。

docker-on-osx-1

"OS X対応"と謳うにはちょっと無理があるかなーと個人的には思います。が、確かにOS Xのターミナル上でdockerコマンドが実行でき、Dockerコンテナもちゃんと動作します。

簡単に構成を説明すると、VirtualBox(仮想化ソフトウェア)でBoot2docker(Dockerサーバーがプリインストールされた仮想マシン)を実行します。手元のOSXのDockerクライアントから仮想マシンのDockerサーバーを操作し、Dockerコンテナを実行する形です。まぁ、Dockerの基本機能を試す分にはこの構成を意識する必要はありません。本エントリー後半のネットワーク構成のような応用的なことをするときのために、頭の片隅に置いておいてください。

セットアップ手順

1. ソフトウェアのインストール

公式ドキュメントではcurlコマンドで実行ファイルを直接ダウンロードしていますが、今回は頻繁になるであろうバージョンアップを楽にする目的 *1で、Homebrewでインストールしていきます。brew installコマンドでdocker、boot2dockerパッケージをインストールします。

ikkomon:~ ryuta$ brew install docker boot2docker
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/docker-0.9.1.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring docker-0.9.1.mavericks.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
  /usr/local/Cellar/docker/0.9.1: 9 files, 12M
==> Downloading https://github.com/boot2docker/boot2docker/archive/v0.7.1.tar.gz
######################################################################## 100.0%
  /usr/local/Cellar/boot2docker/0.7.1: 4 files, 32K, built in 2 seconds
ikkomon:usr ryuta$ brew list
  :
docker
boot2docker
  :
ikkomon:~ ryuta$

インストールが完了すると、boot2dockerコマンド、dockerコマンドがそれぞれ実行できます。

ikkomon:~ ryuta$ boot2docker
Usage /usr/local/bin/boot2docker {init|start|up|save|pause|stop|restart|status|info|delete|ssh|download}
ikkomon:~ ryuta$ docker -v
Docker version 0.9.1, build 867b2a9
ikkomon:~ ryuta$

動いてますね!

2. Boot2dockerの起動

続いて、Dockerコンテナを実行する仮想マシン、Boot2dockerを起動します。boot2dockerコマンドはVagrantライクに使えるBoot2docker仮想マシンを管理するコマンドラインツールです。まずはboot2docker initで仮想マシンイメージをダウンロードします。

ikkomon:~ ryuta$ boot2docker init
[2014-04-07 21:38:08] Creating VM boot2docker-vm
Virtual machine 'boot2docker-vm' is created and registered.
UUID: eef72495-cd1b-4172-b4e4-067f729f472d
Settings file: '/Users/ryuta/VirtualBox VMs/boot2docker-vm/boot2docker-vm.vbox'
[2014-04-07 21:38:08] Apply interim patch to VM boot2docker-vm (https://www.virtualbox.org/ticket/12748)
[2014-04-07 21:38:08] Setting VM settings
[2014-04-07 21:38:08] Setting VM networking
[2014-04-07 21:38:08] Setting VM disks
[2014-04-07 21:38:08] Creating 40000 Meg hard drive...
Converting from raw image file="stdin" to file="/Users/ryuta/.boot2docker/boot2docker-vm.vmdk"...
Creating dynamic image with size 41943040000 bytes (40000MB)...
[2014-04-07 21:38:09] Done.
[2014-04-07 21:38:09] You can now type boot2docker up and wait for the VM to start.
ikkomon:~ ryuta$

続いて、boot2docker upで仮想マシンを起動します。

ikkomon:~ ryuta$ boot2docker up
[2014-04-07 21:38:12] Starting boot2docker-vm...
[2014-04-07 21:38:32] Started.

To connect the docker client to the Docker daemon, please set:
export DOCKER_HOST=tcp://localhost:4243
ikkomon:~ ryuta$

その他、boot2docker statusで仮想マシンの状態確認、boot2docker stopで仮想マシンのシャットダウンもできます。このあと仮想マシンを使うので、シャットダウンは割愛します。

ikkomon:~ ryuta$ boot2docker status
[2014-04-08 22:29:14] boot2docker-vm is running.
ikkomon:~ ryuta$

3. 環境変数の設定

Dockerクライアントは、初期設定ではローカルのDockerサーバー(ソケットファイル)に接続しようとしますが、今回の構成ですとDockerサーバーはBoot2dockerの仮想マシンで実行される(下図参照)ため、クライアントの接続先を環境変数DOCKER_HOSTで設定します。

docker-on-osx-2

boot2docker upコマンドの出力にもあったように、tcp://localhost:4243で決め打ちです。~/.bash_profileファイルなどに以下を追加しましょう。

~/.bash_profile

  : 
export DOCKER_HOST=tcp://localhost:4243

docker versionコマンドの結果にDockerサーバーの情報が含まれていればOKです。

ikkomon:~ ryuta$ docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 867b2a9
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1
Last stable version: 0.9.1
ikkomon:~ ryuta$

これで準備OKです!

Dockerコンテナの作成、実行を試してみる

Docker自体の使い方はEC2での弊社佐々木のエントリーや、また別のエントリーでご紹介したいと思います。今回は例として、最近個人ブログで使い始めたGhostがインストール、構成済みのDockerイメージを動かしてみます。Dockerには世界中のユーザーが作ったDockerイメージ(Dockerコンテナのコピー)をシェアするDocker Indexという仕組みがあり、そこで提供されているGhostの中の人が作ったであろうイメージを使ってみます。docker pullコマンドでイメージをダウンロード、docker imagesコマンドで確認します。

ikkomon:~ ryuta$ docker pull dockerfile/ghost
Pulling repository dockerfile/ghost
7cdf426e1d13: Pulling dependent layers
27cf78414709: Download complete
b750fe79269d: Download complete
  :
ikkomon:~ ryuta$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
dockerfile/ghost    latest              7cdf426e1d13        7 weeks ago         653 MB
ikkomon:~ ryuta$

イメージがダウンロードできたら、docker runコマンドで早速起動しますが、今回は-p 80:2368オプションを追加しました。理由は後述します。

ikkomon:~ ryuta$ docker run -d -p 80:2368 dockerfile/ghost
f17c66e711b761780c77d5e7c7e06c64c5bcc4c97775ba3b2bad47ddafd330e4
ikkomon:~ ryuta$

実行しているDockerコンテナは、docker psコマンドで確認します。

ikkomon:~ ryuta$ docker ps
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS                  NAMES
f17c66e711b7        dockerfile/ghost:latest   bash /ghost-start   49 seconds ago      Up 51 seconds       0.0.0.0:80->2368/tcp   furious_darwin
ikkomon:~ ryuta$

Status列が「Up」になっていることから、実行中になっていることがわかります。

先ほどdocker runコマンドに付与した-pオプションは、Dockerコンテナのポートフォワーディング設定を行うものです。今回のGhostコンテナでは2368番ポートでHTTPをListenするので、Dockerサーバーの80番ポートにマッピングしています。手元のOSXからアクセスするためには、さらにBoot2dockerを実行するVirtualBoxで仮想マシンのポートフォワーディング設定が必要です。以下にOSXで実行するDockerコンテナのネットワーク構成を示します。

docker-on-osx-network

オレンジの矢印がポートフォワーディングを示します。VirtualBoxで仮想マシンのポートフォワーディング設定は以下のように追加できます。boot2docker仮想マシンのネットワーク設定画面を開き、[ポートフォワーディング]ボタンをクリックします。

boot2docker-vm01

docker run -pでBoot2docker仮想マシンの80番ポート(ゲストポート)にマッピングしているため、それをOSXの任意のホストポート(今回は8080番)に再度マッピングします。名前は任意のものでOKです。

boot2docker-vm02

これでOKです。Webブラウザからローカルの8080番ポートにアクセスしてみます。

ghost-screenshot

Dockerコンテナで動作するGhostの初期画面が表示できました!

まとめ

最後の動作確認は、少し難しい設定もありましたが、コンテナを動作させるだけであれば比較的手軽にできるのではないでしょうか。みなさんもお手持ちのMBAなどでDockerにチャレンジしてみてはいかがでしょうか?

脚注

  1. 新バージョンのリリースは少し遅れますが