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 にアクセスしましょう
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 で代用することも出来そうです。