NI+Cクラウドエバンジェリストの常田です。

先日のDockerCon2015が先日行われ様々なツールや新しくエコシステムが発表されました。Dockerがもたらすインフラストラクチャにおいてはパフォーマンスを最大限に利用する点でSoftLayerのベアメタルサーバは非常に適したサービスです。

今回はいくつもあるDockerの関連ツールの中でも実際のホストサーバを制御するdocker-machineを利用してみたいと思います。このツールは各種クラウド(AWS, Azure ,,, SoftLayer )などのサーバをプロビジョニングした上で dockerデーモンを導入済みの状態にセットアップをしてくれます。

現在は残念ながら docker-machine で作成をすることが出来るのは「仮想サーバ」だけですが既存のサーバをdocker-machineの管理におくことも出来る様になっているため「ベアメタルサーバ」も管理することが出来ます。。

また、これまでMac上ではBoot2Dockerを利用していましたがこれからはdocker-machineがその後継として動くようですので合わせて今回はローカルのVirtualBoxとSoftLayer上にDockerを動かしてみたいと思います。

ツールの導入

Mac上にdockerコマンドを導入

boot2dockerを導入します。

ダウンロードしたモジュールをクリックして導入して下さい。
今回はboot2dockerを導入しますが実際に利用するのは dockerコマンドを利用します。

Mac上にdocker-machine を導入する

今回は上記のドキュメントを参考に進めてみたいと思います。

$ curl -L https://github.com/docker/machine/releases/download/v0.3.0/docker-machine_darwin-amd64 > /usr/local/bin/docker-machine
$ chmod +x /usr/local/bin/docker-machine
$  docker-machine -v
docker-machine version 0.3.0 (0a251fe)

VirtualBox上のVMにDockerの導入

$ docker-machine create --driver virtualbox dev
Creating CA: /Users/hideaki/.docker/machine/certs/ca.pem
Creating client certificate: /Users/hideaki/.docker/machine/certs/cert.pem
Image cache does not exist, creating it at /Users/hideaki/.docker/machine/cache...
No default boot2docker iso found locally, downloading the latest release...
Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.7.0/boot2docker.iso to /Users/hideaki/.docker/machine/cache/boot2docker.iso...
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env dev

確認をしてみます。

$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM
dev             virtualbox   Running   tcp://192.168.99.100:2376

このようにVirtualBox上のVMとして動いている事がわかります。
次にサンプルのDockerコンテナを起動してみます。
そのためにはどのDockerホストで動いているかをdockerコマンドに教える必要があります

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

上記の設定で環境変数が設定されdockerコマンドで dev に接続することが出来ます。

$ docker run busybox echo hello world
Unable to find image 'busybox:latest' locally
latest: Pulling from busybox
cf2616975b4a: Pull complete
6ce2e90b0bc7: Pull complete
8c2e06607696: Already exists
busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d
Status: Downloaded newer image for busybox:latest
hello world

このように動く事がわかります。
次にNginxを動かしてみたいと思います。

$ docker run -d -p 8000:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from nginx
64e5325c0d9d: Pull complete
bf84c1d84a8f: Pull complete
aaa04ccb1cff: Pull complete
c25a494fd450: Pull complete
2b4392756878: Pull complete
a58c6ba7d446: Pull complete
6391a6648407: Pull complete
0b6365661275: Pull complete
5c1f0ec6cd7b: Pull complete
36f0b0306c21: Pull complete
107c338c1d31: Pull complete
319d2015d149: Already exists
nginx:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:0952acc92b56f936b5b5b93a6b7abb9205ec7ec64b920e113a6d9dae50f6f49d
Status: Downloaded newer image for nginx:latest
066de847bef08e9ef1575417341dcde63587789fe3f431420c43fe3b85195db1

実際に起動してるコンテナのIPアドレスは docker-machineで調べられます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                           NAMES
066de847bef0        nginx               "nginx -g 'daemon of   5 seconds ago       Up 3 seconds        443/tcp, 0.0.0.0:8000->80/tcp   admiring_wilson

$ docker-machine ip dev
192.168.99.100

ブラウザで http://192.168.99.100:8000 にアクセスしましょう

2015 07 15 午前0 48

SoftLayer上のサーバにDockerを導入

引数が長いので環境変数で定義するようにします。

export SOFTLAYER_API_KEY=xxxxxxxxxxx
export SOFTLAYER_CPU=1
export SOFTLAYER_DOMAIN=test.com
export SOFTLAYER_HOSTNAME=docker01
SOFTLAYER_IMAGE=UBUNTU_LATEST
export SOFTLAYER_MEMORY=1024
export SOFTLAYER_REGION=tok02
export SOFTLAYER_USER=NICxxxxx

その他のオプションは --help で確認することが出来ます。

$ docker-machine create --driver softlayer docker01
Creating SSH key...
SSH key docker02 (286629) created in SoftLayer
Getting Host IP
Waiting for host to become available
Waiting for host setup transactions to complete
To see how to connect Docker to this machine, run: docker-machine env docker01

先ほどのVirtualBoxだけでなくdocker-machineコマンドでも確認してみます。

$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                        SWARM
dev                 virtualbox   Stopped
docker01            softlayer    Running   tcp://161.202.73.xx:2376

先ほど同様にnginx を導入してみます。
まずはアクティブな接続先を変更します。

$ eval "$(docker-machine env docker01)"
$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM
dev                 virtualbox   Running   tcp://192.168.99.100:2376
docker01   *        softlayer    Running   tcp://161.202.73.xx:2376
$ docker run -d -p 8000:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from nginx
64e5325c0d9d: Pull complete
bf84c1d84a8f: Pull complete
aaa04ccb1cff: Pull complete
c25a494fd450: Pull complete
2b4392756878: Pull complete
a58c6ba7d446: Pull complete
6391a6648407: Pull complete
0b6365661275: Pull complete
5c1f0ec6cd7b: Pull complete
36f0b0306c21: Pull complete
107c338c1d31: Pull complete
319d2015d149: Already exists
nginx:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:0952acc92b56f936b5b5b93a6b7abb9205ec7ec64b920e113a6d9dae50f6f49d
Status: Downloaded newer image for nginx:latest
922a64a6868931c32342a8ebe77e4e312b4b54100edbce827ca1245b5a1efdeb

導入が出来れば docker-machine ip docker01でIPアドレスを確認してブラウザで接続してみます。

Docker-machineでの操作

docker-machineにはいくつもオプションが沢山ありますがここではファイルコピーをしてみたいと思います。このscp
オプションを使うとdocker-machine間でファイルが転送出来てしまいます。

まずローカル上の sample.txt をdevにコピーしてみます。

$ cat sample.txt
princess.local

$ docker-machine scp ./sample.txt dev:/tmp
sample.txt              100%   15     0.0KB/s   00:00

$ docker-machine ssh dev cat /tmp/sample.txt
princess.local

次にdocker-machine間でコピーしてみます。

$ docker-machine scp dev:/tmp/sample.txt docker01:/tmp
$ docker-machine ssh docker01 cat /tmp/sample.txt
princess.local

非常に便利に使えそうですね。

まとめ

今回は docker-machine を利用してローカルの環境とクラウドのSoftLayer上の環境を同時に管理することが出来ました。今回は利用していませんがクラスタ管理のSwarmも同時に使うことにより利便性が広がります。
また従来まではMac上で boot2docker を利用していたものを docker-machine で代用することも出来そうです。