More than 1 year has 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 もありますので、そちらで環境を作るというのもありかもしれません。

参考

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.