docker-machine を使って boot2docker から脱却する

More than 3 years have passed since last update.


結論

ローカルで docker 環境をいじりたいけど、ローカルのリソースを使いたくない人には docker-machine が便利です。

さらに、複数の docker ホストを仕事で使ってる人とかは、切り替えも簡単なので、とてもお薦め。


概要

自分は Mac で開発してるのですが結構な頻度で docker build で image を作っては試しの繰り返しをしたりしています。

MBA だとマシンパワーが残念な感じなので、docker-machine を使って Digital Ocean に docker 環境を用意してしまいます。

あたかもローカルで docker run しているけど、実は Digital Ocean に繋いでいるという感じを構築します。


注意

別に boot2docker が嫌いとかではないです。単にローカルのマシンパワーを吸い取られるのがイヤなだけです。


環境


  • Mac OSX 10.10.3


    • CPU 2 コア

    • メモリ 8 GB



  • docker 1.6.0


    • boot2docker



docker のインストールは済みの前提で進めます。


docker-machine をインストールする

https://docs.docker.com/machine/#osx-and-linux

$ curl -L https://github.com/docker/machine/releases/download/v0.2.0/docker-machine_darwin-amd64 > /usr/local/bin/docker-machine

$ chmod +x /usr/local/bin/docker-machine

docker-machine -v でバージョンを確認してみてください。

docker-machine --version

docker-machine version 0.2.0 (8b9eaf2)


Digital Ocean の Personal Access Tokens を取得する

SSD Cloud Server, VPS Server, Simple Cloud Hosting | DigitalOcean

<広告>ここから Digital Ocean にサインアップすると 10 ドル貰えます </広告>

API から Personal Access Tokens を生成してください。名前は docker-machine とかにすれば良いです。


docker-machine を生成する

region はシンガポール、size は 4 コア / 4GB を指定して docker-machine create を実行します。

ドライバーが digitalocean になってることを確認してください。

$ docker-machine create --driver digitalocean --digitalocean-access-token <トークンを指定する> --digitalocean-region sgp1 --digitalocean-size 4gb dev

INFO[0001] Creating SSH key...
INFO[0003] Creating Digital Ocean droplet...
INFO[0148] "dev" has been created and is now the active machine.
INFO[0148] To point your Docker client at it, run this in your shell: eval "$(docker-machine env dev)"

生成できたら docker-machine ls で確認してみてください。

$ docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM
dev * digitalocean Running tcp://192.0.2.1:2376


docker-machine env を使って環境変数を設定する

docker-machine env を使うことでローカルの docker コマンドの実行が docker-machine イメージ上で実行されます。

$ docker-machine env dev

export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH="/Users/voluntas/.docker/machine/machines/dev"
export DOCKER_HOST=tcp://192.0.2.1:2376

# Run this command to configure your shell: eval "$(docker-machine env dev)"

docker コマンドの向き先を変える前に docker info で自分の環境を見てみましょう。

$ docker info

Containers: 47
Images: 213
Storage Driver: aufs
Root Dir: /mnt/sda1/var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 307
Dirperm1 Supported: true
Execution Driver: native-0.2
Kernel Version: 3.18.11-tinycore64
Operating System: Boot2Docker 1.6.0 (TCL 5.4); master : a270c71 - Thu Apr 16 19:50:36 UTC 2015
CPUs: 4
Total Memory: 1.961 GiB
Name: boot2docker
ID: M5CC:AO2T:5NCE:A6V6:HLM5:CXPA:YAHE:JGZ4:QOZ4:GDU4:P4DL:A5ZA
Debug mode (server): true
Debug mode (client): false
Fds: 12
Goroutines: 16
System Time: Tue May 5 17:44:28 UTC 2015
EventsListeners: 0
Init SHA1: 9145575052383dbf64cede3bac278606472e027c
Init Path: /usr/local/bin/docker
Docker Root Dir: /mnt/sda1/var/lib/docker
Username: voluntas
Registry: [https://index.docker.io/v1/]

変えてみましょう。

eval "$(docker-machine env dev)"

docker info で見てみましょう。

$ docker info

Containers: 0
Images: 0
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 0
Dirperm1 Supported: false
Execution Driver: native-0.2
Kernel Version: 3.13.0-43-generic
Operating System: Ubuntu 14.04.1 LTS
CPUs: 2
Total Memory: 3.861 GiB
Name: dev
ID: QI6N:X5LQ:7GF6:YJ4W:MW2K:J4A6:GJCQ:EVSI:7G24:G7T7:3LQS:R6R3
Username: voluntas
Registry: [https://index.docker.io/v1/]
WARNING: No swap limit support
Labels:
provider=digitalocean

向き先が Digital Ocean になってるのが確認できました。


docker build してみる

お試しに CentOS 6.6 用の Erlang/OTP docker イメージをビルドしてみましょう。

こちらに Dockerfile は用意してあります。git clone してみてください。

https://github.com/shiguredo/dockerfiles/blob/develop/erlang/centos/6.6/Dockerfile

$ docker build --no-cache=true -t shiguredo/erlang:centos-6.6 .

いかがでしょうか、一切ローカルのリソースを使わずに docker build が実行されていきます。

実行が終わったら docker images を打ってみましょう。これは Digital Ocean 側の環境です。

$ docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
shiguredo/erlang centos-6.6 eb2eec3e9f0c 25 seconds ago 875.3 MB
<none> <none> 516a257787ae 7 minutes ago 212.1 MB
<none> <none> dc8f73009b2f 7 minutes ago 358.8 MB
centos 6.6 8b44529354f3 13 days ago 202.6 MB


作成したイメージのコンテナを使って見る

さて docker run で作ったイメージを実行してみましょう。お試しなので落としたら消えるように --rm もつけておきます。

$ docker run -i --rm -t shiguredo/erlang:centos-6.6 /bin/bash

[root@85e17ead0bff /]# erl
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:10] [kernel-poll:false]

Eshell V6.4 (abort with ^G)
1>

無事 Erlang が起動しました。


docker-machine ssh を使って見る

一応、docker-machine create で生成したホストには ssh できます。

試しにログインして docker images を打ってみましょう。

% docker-machine ssh

Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-43-generic x86_64)

* Documentation: https://help.ubuntu.com/

System information as of Tue May 5 14:02:11 EDT 2015

System load: 0.01 Processes: 79
Usage of /: 6.3% of 58.93GB Users logged in: 0
Memory usage: 9% IP address for eth0: 192.0.2.1
Swap usage: 0% IP address for docker0: 172.17.42.1

Graph this data and manage this system at:
https://landscape.canonical.com/

Last login: Tue May 5 14:02:12 2015 from 192.0.2.100
root@dev:~# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
shiguredo/erlang centos-6.6 eb2eec3e9f0c 5 minutes ago 875.3 MB
<none> <none> 516a257787ae 12 minutes ago 212.1 MB
<none> <none> dc8f73009b2f 12 minutes ago 358.8 MB
centos 6.6 8b44529354f3 13 days ago 202.6 MB
centos 7.1.1503 f1dade627e25 13 days ago 212.1 MB

ローカルの実行と一緒ですね。


docker-machine で削除する

さて、使い終わった machine ホストを止めて削除しましょう。

$ docker-machine stop dev

$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
dev * digitalocean Stopped tcp://192.0.2.1:2376
$ docker-machine rm dev
INFO[0000] The machine was successfully removed.

これで無事削除されました。


環境変数を元に戻す

最後にローカルの docker コマンドの向きを元に戻しましょう。

$ eval "$(docker-machine env dev -u)"

-u を付ければ環境変数がクリアされます。


クラウドを使ったとしても docker cp は使える

docker-machine を使った場合で DigitalOcean などのクラウドを machine とした場合は -v が使えません。

-v はローカルと docker コンテナ上で共有ディレクトリを作ってくれる便利なオプションです。

docker 上で何か生成したファイルを取り出したい場合はローカルの場合はこれを使っていたのですが、クラウドとなるとそうも行きません。

この辺は docker-machine scp というのが実装されている流れがあったりするので、こっちは待ちましょう。

Implement docker-machine scp by nathanleclaire · Pull Request #1140 · docker/machine

すでにマージされてますので、0.3 では来るのでは無いでしょうか。

で、代替に使えるのが docker cp です。これはコンテナ ID とパスをしていすれば、ローカルにファイルを持ってくることが出来ます。

クラウドでも関係なく動作します。

$ docker run --name spam IMAGE

$ docker cp spam:/path/to/egg .

ざっくりこんな感じで使う事が出来ます。コンテナは不要になったら消しましょう。


まとめ

自分の使い方だとローカルの boot2docker 不便だなぁ、と色々思っていたのですが、docker-machine を使う事でローカルでは無くネット越しで気軽に使うことができるようになりました。

もちろん、ネットワークが繋がることが前提になるのですが、docker 実行するときって基本はネット環境にいることが多いので、これは全然アリだと思いました。

また、転送量は Digital Ocean であれば数テラありますので、よほど変な使い方をしなければ問題は無いと思います。


docker-machine について

そもそも docker-machine は好きな場所に docker 環境を構築し、管理する仕組みです。別に boot2docker を駆逐するための仕組みでは無いです。

ただ、今回は説明していませんが docker-machine のプロバイダーには virtualbox もありますので、そちらで環境を作るというのもありかもしれません。


参考