matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

MacでDockerを動かす際に気をつけること

Boot2dockerを使ってMacDockerを動かす際に、いくつか気をつけることとかハマったことがあったのでまとめました。

VirtualBoxのポートフォワーディング設定

boot2dockerはVirtualBox上で動作しているので、MacからDockerで立ち上げたサーバやミドルウェアにアクセスするためにはVirtualBoxポートフォワーディング設定が必要です。
この辺はDockerのInstallation Guideに載ってます。
以下は、3000番ポートで起動中のRailsサーバにアクセスする場合の例。

VirtualBox上で直接設定する場合

f:id:matsukaz:20150128010918p:plain
f:id:matsukaz:20150128011231p:plain

CLIで設定する場合
$ VBoxManage modifyvm "boot2docker-vm" --natpf1 "rails,tcp,,3000,,3000"

Mac上のディレクトリをマウント

Mac上のディレクトリをDockerインスタンスにマウントするためには、以前はいろいろやることがあったんですが、現バージョンのboot2dockerはお手軽にマウントできます。

例えば以下の様なディレクトリ構造のプロジェクトがあった場合

myapp
├── Dockerfile
├── fig.yml
└── app             <-- Docker上でマウントしたいディレクトリ
    └── ・・・


Docker起動時に

$ docker run -v /Users/matsukaz/myapp/app:/app

のように指定するだけで/myapp/appのディレクトリが/appにマウントされます。楽〜。

figを使ってDockerインスタンスを管理している場合は、fig.ymlには以下のような記述をします。

myapp:
  build: .
  volumes:
    - app:/app

ただし注意点が少しあります。

  • 共有できるディレクトリは/Users配下のみ(/Users配下であれば、直下じゃなくても大丈夫)
  • 動的に変更できない(Dockerインスタンス起動時にしか設定できない)

詳しくは Docker 1.3: signed images, process injection, security options, Mac shared directories | Docker Blog に書いてあります。

Note that there are still some limitations: for example this feature is limited to boot2docker’s virtualbox configuration, cannot be managed dynamically, and only works for directories in /Users . But we are receiving exciting contributions to improve volume management, so expect this area to improve drastically in the next few releases.

時間がズレる

boot2dockerはVirtualBox上で動作しているので、Macをスリープ状態にしたりするとMac上の時間とずれちゃいます
Dockerインスタンスの時間はboot2dockerの時間を元にしているので、結果的にDockerの時間もズレると。

boot2dockerを再起動するか、以下のコマンドとかでNTP同期を取らせる必要があります。

boot2docker ssh "sudo ntpd -q -p 1.jp.pool.ntp.org"

ミドルウェアやサーバによっては時間がズレると動作がおかしくなるものもあるので、注意が必要です。

他にもMac上でlaunchctlを使って定期的に同期を取らせる方法とかもあります。

$ wget -q https://gist.githubusercontent.com/fcvarela/2c90b090e1e5f8c91127/raw/1e63833d4ec7edea98298204a0c26f79ead3db8e/com.fcvarela.boot2docker.datesync.plist -O ~/Library/LaunchAgents/com.fcvarela.boot2docker.datesync.plist && launchctl load ~/Library/LaunchAgents/com.fcvarela.boot2docker.datesync.plist && launchctl start com.fcvarela.boot2docker.datesync

今後リリース予定のboot2docker 1.5.0では
Add ntpd and crond that restarts it, which combats the boot2docker suspend issue by tianon · Pull Request #661 · boot2docker/boot2docker · GitHub のプルリクが取り込まれて改善されてるようなので、それ以前のバージョンを利用している場合はご注意ください。