MacOSX
docker
docker-compose

macOSでDocker環境構築

前置き

エンジニア"見習い"なので、ついこの間までdockerなんて使ってなかったけど使い始めたら感動したのでまとめます。

docker?なにそれ?って方や聞いたことはあるけどよくわからないって方はこちら

今回は、macOSでdocker環境を構築することをゴールとします。

dockerはそもそもLinux環境で動くのものであり、MacやWindowsではVirtualBoxなどVMを立てて動かすものです。macでdockerをサポートするツールがいろいろあるので、今回は2つのアプローチを紹介します。

Docker for Mac

VirtualBoxにdockerをのせて運用していると、 VMを立ち上げる手間が発生したり、そもそも環境構築が難しく手間もかかります。そんな問題を解決してくれるのが Docker for Mac です。

1. インストール

下記リンクよりインストールします。無難にStable版で大丈夫です。
https://store.docker.com/editions/community/docker-ce-desktop-mac

2. セットアップ

インストールして従っていくとツールバーにクジラが現れますね。
クジラを押すと各種情報や設定、終了の操作ができます。

About Docker
※2018年3月時点の最新バージョン情報です。
スクリーンショット 2018-03-02 15.29.18.png

Preferences → Advanced
スクリーンショット 2018-03-02 15.29.02.png
最初に必要な設定は特にないんですが、CPUとメモリの設定は各自マシンによって決めてください。VirtualBoxは不要ですが、実際にはHyperKitというMacネイティブの仮想化環境が裏で動いています。ここではそれに割り振るCPUとメモリを設定します。

ちなみに筆者のマシンは

  • macOS Sierra 10.12.6
  • プロセッサ 2GHz 2コア Intel Core i5
  • メモリ 8GB 1867MHz LPDDR3

コンテナが複雑になってくると最低でも4GBくらい振らないとキツイです。
筆者はメモリ8GBマシンなので、docker動かしながらIDEとか使っちゃうともうカツカツでブラウジングすら危うくなってきます。AtomでもやばかったのでVSCodeに乗り換えました...

3. 実行

ツールボックスのクジラがDocker is runningとなっていればもうdockerコマンドは使えるはずです。

$ docker version
Client:
 Version:   17.12.0-ce
 API version:   1.35
 Go version:    go1.9.2
 Git commit:    c97c6d6
 Built: Wed Dec 27 20:03:51 2017
 OS/Arch:   darwin/amd64

Server:
 Engine:
  Version:  17.12.0-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.9.2
  Git commit:   c97c6d6
  Built:    Wed Dec 27 20:12:29 2017
  OS/Arch:  linux/amd64
  Experimental: true

Docker Toolbox + Dinghy

こちらは無難にVMを立ててdockerを扱うアプローチです。
Docker Toolboxは必要な以下のツールをまとめたパッケージのようなものです。
※各ツールの役割は割愛します

  • Docker Client
  • Docker Machine
  • Docker Compose
  • Docker Kitematic
  • Docker Quickstart Termina
  • VirtualBox

Docker Toolboxだけでも十分なんですが、今回はdinghyというツールも利用します。

Dockerでは基本的にローカルのファイルをマウントすることになりますが、VirtualBoxの共有フォルダ機能は遅いため、Dockerでのマウントもだいぶ遅くなります。
dinghyはDocker MachineのVolumes機能をNFSマウントに入れ替えてくれて、ファイル共有を高速化することができます。

1. インストール

Homebrewを使うので入れてない人は入れてください。

DockerTollboxをインストール
$ brew cask install docker-toolbox
dinghyをインストール
$ brew tap codekitchen/dinghy

$ brew install --HEAD dinghy

2. セットアップ

dockerホストを作成
$ /usr/local/Cellar/dinghy/4.2.0/bin/dinghy help create

$ dinghy create --disk=30000 --provider virtualbox

※ディスクは各自マシンに応じて決めてください

dinghy createが終わると環境変数設定してねと促されます。

export DOCKER_HOST=tcp://192.168.99.101:2376
export DOCKER_CERT_PATH=/Users/xxx/.docker/machine/machines/dinghy
export DOCKER_TLS_VERIFY=1
export DOCKER_MACHINE_NAME=dinghy

.bash_profileに書くなどしてください。万が一コピペし忘れても

eval "$(dinghy shellinit)"

で設定可能です。

dinghy upでDockerホストの起動、dinghy downで終了ができるようになるはずです。
Dockerホスト起動状態ならばdockerコマンドが使えるはずです。

両者の比較

Docker for Mac と Docker Toolbox + Dinghy の2つのパターンを紹介しましたが、ご覧の通り環境構築およびDocker起動の手間は明らかに前者のほうが簡単ですね。
ではなぜDocker Toolboxも紹介したのか? それはDinghyの説明でも少し触れましたが、ファイル共有の問題です。
Docker for Macは登場当初からファイル共有が遅いというのがずっと問題として挙げられていました。
最近はオプションでcachedなどが出てきて改善されてはいますが、大規模なアプリケーション開発になってくると遅さが目立つようです。

そこで実際にそれぞれのI/O処理速度を計測してみました。
とりあえずマウント領域でダミーファイルを読み書きするコマンドの処理速度で比較してみます。

write
$ time dd if=/dev/zero of=write_test bs=1k count=100000
read
$ time dd if=read_test of=/dev/null

※read_testは1GBのダミーファイル

5回ずつ測った平均で以下のような結果になりました。

write [MB/s] read [MB/s]
Docker for Mac 4.94 179.2
Docker for Mac (cached) 5.03 227.3
Docker Tollbox + Dinghy 42.60 295.6

まだまだDocker Toolbox + Dinghyの勝利って感じですね。

ただし、いろいろ調べてみるとDocker for Macの方が新しく、推奨されている感じなのでこれからDocker始めてみるって方はDocker for Macでいいと思います。

今後のアップデートでファイル共有問題が更に改善されることに期待しましょう。