はじめてのDocker on Mac OS X
ども、大瀧です。
今週金曜日にあるDocker Meetup Tokyo #2という勉強会でLTすることになりまして、大慌てでDocker触ってます。Dockerの開発は非常に活発で、新機能や仕様変更が続々と出ており刺激的なのですが、手元の開発環境として使っているMBAでのセットアップ方法が以前と変わりすぎていたので、備忘録としてまとめておきます。
Dockerの実行方法はVagrantを使う方法などいくつかありますが、今回はDocker公式ドキュメントをベースに、Homebrewで簡単にインストールする方法をチョイスしてみました。すぐに陳腐化する恐れがありますので、そこんとこオナシャス!です。
必要なソフトウェア
- OS X Mavericks(DockerはSnow Leopard以降をサポート)
- VirtualBox
- Homebrew
VirtualBoxおよびHomebrewのインストールは割愛しますので、先にセットアップを済ませておきましょう。Homebrewについては、以下のコマンドが通ればOKです。
ikkomon:~ ryuta$ brew --version 0.9.5 ikkomon:~ ryuta$
構成
OS X環境のDockerは、以下のソフトウェアの組み合わせで実行します。
構成図で書くと、以下のような感じになります。
"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で設定します。
boot2docker upコマンドの出力にもあったように、VirtualBox + Boot2docker構成では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コンテナのネットワーク構成を示します。
オレンジの矢印がポートフォワーディングを示します。VirtualBoxで仮想マシンのポートフォワーディング設定は以下のように追加できます。boot2docker仮想マシンのネットワーク設定画面を開き、[ポートフォワーディング]ボタンをクリックします。
docker run -pでBoot2docker仮想マシンの80番ポート(ゲストポート)にマッピングしているため、それをOSXの任意のホストポート(今回は8080番)に再度マッピングします。名前は任意のものでOKです。
これでOKです。Webブラウザからローカルの8080番ポートにアクセスしてみます。
Dockerコンテナで動作するGhostの初期画面が表示できました!
まとめ
最後の動作確認は、少し難しい設定もありましたが、コンテナを動作させるだけであれば比較的手軽にできるのではないでしょうか。みなさんもお手持ちのMBAなどでDockerにチャレンジしましょう!
おまけ
HomebrewでDockerをインストールすると、おまけでbash/zshのコマンドライン補完(completion)設定がついてきます。bashであれば、以下を~/.bash_profileに追記すると<TAB><TAB>でdocker以下のサブコマンド補完が出来て、すこぶる捗りますよ。
~/.bash_profile
: if [ -f $(brew --prefix)/etc/bash_completion ]; then . $(brew --prefix)/etc/bash_completion fi
一旦端末を閉じて再度開くと...
ikkomon:~ ryuta$ docker <TAB><TAB> attach events import load pull run tag build export info login push save top commit help insert logs restart search version cp history inspect port rm start wait diff images kill ps rmi stop ikkomon:~ ryuta$ docker
いい感じです!
脚注
- 新バージョンのリリースは少し遅れますが ↩