文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

vagrantしか知らない私がdocker-machineを試してみた

  ∧,,∧
 (`・ω・)〆ゑゐ、 < docker-machineはじめました
  |  つニニニフ
  しーJ

f:id:treeapps:20160730183608p:plain

生のdockerは実行時にオプションを大量に付けなくてはいけないので、いくら速くても面倒だったので敬遠していました。しかし最近docker-machineというdockerのホストマシンを簡単に作成できるアプリが公式から提供されたので、現在Vagrantからdockerに移行中なのです。

docker-machineとは?

私も最初なにこれ?と思ったのですが、Vagrantに例えると解りやすいかもしれません。

Vagrantの場合は以下が定番ですね。

dockerコンテナ(CnetOS 7とか)
CoreOS(dockerホスト)
Virtualbox, VMwareFusion ...etc
Vagrant
mac

docker-machineだとこうなります。

dockerコンテナ(CnetOS 7とか)
Virtualbox, VMwareFusion ...etc
docker-machine(dockerホスト)
mac

Vagrantがdocker-machineに代わり、更にdocker-machineがCoreOSも内包してしまっているようなイメージです。

linux環境でもmacの部分がlinuxになるだけだし、windows環境でも同じなので「ほとんどの環境で同じdocker環境が簡単に構築できる」のがdocker-machineです。Vagrant+CoreOSでも同様の事ができますが、docker-machineの方が速く・簡単に環境が構築できます。

内部的にはboot2dockerを使っているようで、mac上のdockerコンテナの中にdockerコンテナを作成する(合ってるのか?)ようですね。

docker-machineを試してみる

mac環境では大まかに以下の手順でdockerホストマシンが作成できます。

また、この例ではdriverにはVMwareFusionを指定していますが、Virtualboxでも可です。

1,macにdockerをインストール

homebrewでインストールします。

brew install docker

2、macにdocker-machineをインストール

# mac用docker-machineをダウンロード
tree-no-iMac:~ tree$ curl -L https://github.com/docker/machine/releases/download/v0.2.0/docker-machine_darwin-amd64 > /usr/local/bin/docker-machine
# 実行権限付与
tree-no-iMac:~ tree$ chmod +x /usr/local/bin/docker-machine

docker-machineはシングルバイナリのようで、適当にパスが通っているところにDLし、実行権限を付けます。
docs.docker.com

3、dockerホストを作成

tree-no-iMac:~ tree$ docker-machine create --driver vmwarefusion test-machine
INFO[0000] Creating SSH key...
INFO[0000] Creating VM...
INFO[0000] Starting test-machine...
INFO[0002] Waiting for VM to come online...
INFO[0041] "test-machine" has been created and is now the active machine.
INFO[0041] To point your Docker client at it, run this in your shell: eval "$(docker-machine env test-machine)"

大体30秒くらいでホストマシンが作成できます。「test-machine」というのはホスト名なので、自由に付けて下さい。(あまり長いと今後のコマンド入力が大変なので短めの名称を推奨)

もしVMwareFusionが無ければ、-dオプションに「virtualbox」を指定するとVirutualboxにdockerホストマシンが作成できます。

4、環境変数をセット

# docker環境変数をセット
tree-no-iMac:~ tree$ eval "$(docker-machine env test-machine)"
# 確認
tree-no-iMac:~ tree$ env | grep -i docker
DOCKER_HOST=tcp://172.16.53.129:2376
DOCKER_TLS_VERIFY=1
DOCKER_CERT_PATH=/Users/tree/.docker/machine/machines/test-machine

evalのコマンドは、docker-machine createした時のログに「このコマンド実行しろや」と書いてあるので、そのまま実行します。永続的に環境変数を設定する場合は ~/.bash_profile 等のログインシェルで読み込まれる部分に書きましょう。

5,macからdockerホストにアクセスしてみる

tree-no-iMac:~ tree$ docker-machine ssh
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.5.0, build vmware-support : e883254 - Fri Feb 27 18:00:02 UTC 2015
Docker version 1.5.0, build a8a31ef

これでホストマシンにsshできます。もし複数のホストマシンを作成している場合は、「docker-machine ssh ホスト名」として下さい。

準備OK!!

これでdockerホストが作成できました。目茶苦茶簡単ですね。

dockerコンテナを作成・実行してみる

さて、dockerホストが作成できたので、今度はdockerホスト上でdockerコマンドを使ってdockerコンテナを作成してみましょう。

dockerホストにsshしてホスト上でdockerコマンドを叩いてもいいのですが、macからdockerホストに直接コマンドを実行する事が可能なので、今回はそちらでいきます。

では早速mac上からcentos7のコンテナを実行してみます。

tree-no-iMac:~ tree$ docker $(docker-machine config test-machine) run centos:7 echo test
Unable to find image 'centos:7' locally
FATA[0000] Error response from daemon: client and server don't have same version (client : 1.18, server: 1.17)

!?

なんかエラーでました。このエラーはmac側のdockerのバージョンとdocker-machineのdockerのバージョンの不一致が原因で起きています。

最初の手順でhomebrewでdockerをインストールしましたが、その時は最新のdocker1.6系がインストールされましたが、docker-machine上のdockerはver1.5なのです。

ではmac側のdockerを1.6から1.5にダウングレードしましょう。homebrewならこういう時簡単なんですよね〜

homebrewでdockerをバージョンダウンする

さて余裕余裕っと。

tree-no-iMac:~ tree$ brew versions docker
Error: Unknown command: versions


!?

はい。いつの間にかversionsによるバージョン一覧表示機能は廃止されており、代わりにリポジトリを追加する形に変わったようなのです。では早速リポジトリを追加してdocker v1.5をインストールしましょう。

1,既存のdockerをアンインストール

homebrewでインストールしたdockerをアンインストールします。

tree-no-iMac:~ tree$ brew uninstall docker

2,homebrew/versionsリポジトリを追加

versionsコマンドの代わりにversionsリポジトリを使います。リポジトリを追加すると、brew search等で旧バージョンが検索・インストールできるようになります。

tree-no-iMac:~ tree$ brew tap homebrew/versions

3,dockerを検索

tree-no-iMac:~ tree$ brew search docker
boot2docker	boot2docker133	boot2docker141	docker		docker-compose	docker-machine	docker-swarm	docker133	docker141	docker150
homebrew/completions/boot2docker-completion		Caskroom/cask/boot2docker-status			Caskroom/cask/docker-compose
homebrew/completions/docker-completion			Caskroom/cask/boot2docker				Caskroom/cask/docker-machine

v1.5、ありましたね。「docker150」がお目当てのバージョンです。

4,docker v1.5をインストールする

tree-no-iMac:~ tree$ brew install docker150
==> Installing docker150 from homebrew/homebrew-versions
==> Downloading https://homebrew.bintray.com/bottles-versions/docker150-1.5.0.yosemite.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/docker150-1.5.0.yosemite.bottle.tar.gz
==> Pouring docker150-1.5.0.yosemite.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/docker150/1.5.0: 9 files, 7.2M

5,mac側とdocker-machine側のdockerバージョンを確認

まずはmac側。

tree-no-iMac:~ tree$ docker --version
Docker version 1.5.0, build a8a31ef

続いてdocker-machine側。

tree-no-iMac:~ tree$ docker-machine ssh test-machine "docker --version"
Docker version 1.5.0, build a8a31ef

よし。一致しました。

6,macからdocker runしてみる

「docker $(docker-machine config test-machine) run ほげほげ」とすると、macからdockerホストを介して直接dockerコマンドを叩く事ができます。ちなみにdocker-machine test-machine configを実行すると、以下が表示されます。

tree-no-iMac:~ tree$ docker-machine config test-machine
--tlsverify --tlscacert="/Users/tree/.docker/machine/machines/test-machine/ca.pem" --tlscert="/Users/tree/.docker/machine/machines/test-machine/cert.pem" --tlskey="/Users/tree/.docker/machine/machines/test-machine/key.pem" -H=tcp://172.16.53.129:2376

何やら接続オプションらしきものが表示されましたね。これを手で入力するのは大変だし、dockerホストを再作成したりして情報が変わると大変なので、「docker $(docker-machine config ホスト名)」とします。では実行してみましょう。

公式のCentOS7をpullし、echoさせてみます。

tree-no-iMac:~ tree$ docker $(docker-machine config test-machine) run centos:7 echo hogeeeeeee
Unable to find image 'centos:7' locally
Pulling repository centos
fd44297e2ddb: Download complete
6941bfcbbfca: Download complete
41459f052977: Download complete
Status: Downloaded newer image for centos:7
hogeeeeeee

できました。docker pullしない状態でrunすると、自動的にイメージがダウンロードされます(OSのサイズに比例してDLに時間かかります)。

雑感

率直な感想ですが、docker-machineの登場で環境の整備は簡単になりました。しかしdockerは高速な代わりにVagrantよりも学習コストが高いので、まだまだ勉強が必要になりそうです。

docker-machine upgrade とかやると応答が無くなってしまったり、まだまだ不安定なようですが、いちいちVagrant上にCoreOSを用意する必要が無くなるので、これは楽ですね。様々な環境に簡単にdockerホストを作成できるので、これは間違いなく流行るというかデファクトスタンダードになりそうです。

docker-swarm と docker-compose(旧fig)についてはおいおい試していこうと思います。とりあえずは先日書いたredmine2.6 or 3.0のansibleのplaybookをdockerコンテナに適用するのが当面の目標です。

Docker入門 Immutable Infrastructureを実現する

Docker入門 Immutable Infrastructureを実現する