CUBE SUGAR CONTAINER

技術系のこと書きます。

Homebrew で boot2docker から Docker Machine に移行する

OSX や Windows から Docker を楽に使うことのできるツールとして有名な boot2docker だけど、これが最近になって非推奨になってしまった。 例えば boot2docker で Docker ホストの仮想マシンを起動したりすると、以下の様なメッセージが表示される。

$ boot2docker up

  WARNING: The 'boot2docker' command line interface is officially deprecated.

  Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.

  Docker Toolbox (https://docker.com/toolbox) is the recommended install method.
...(省略)

このコマンドラインインターフェースは非推奨なので、早急に Docker Machine に移行してほしいらしい。 その際、インストールする方法としては Docker Toolbox を推奨しているようだ。

Docker Machine をインストールする

上記の Docker Toolbox 自体は Homebrew Cask を使ってすぐにインストールできそうなことがわかった。

$ brew cask search docker toolbox
==> Exact match
dockertoolbox

ただ、公式ドキュメントを見ると Docker Toolbox にはお目当ての Docker Machine 以外にも Docker Compose や Docker Kitematic といったコンポーネント、果ては VirtualBox まで同梱されているらしい。 Homebrew Cask はバージョン管理がイマイチなところもあるので、正直余計なパッケージまでは入れたくない。 現状 Homebrew を使って boot2docker をインストールしているので、同じように管理したいところ。

$ brew list | grep boot2docker
boot2docker

その場合、幸いにも Homebrew を使って Docker Machine を単体でインストールすることができる。

$ brew install docker-machine

boot2docker の仮想マシンを Docker Machine に移行する

ここからは boot2docker で使っていた仮想マシンを Docker Machine に移行する方法について書いていく。

まずは boot2docker が正常に動作することを確認しよう。

$ boot2docker status
running
$ eval "$(boot2docker shellinit)" 
$ docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 19:47:52 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:49:29 UTC 2015
 OS/Arch:      linux/amd64

boot2docker の仮想マシン上にも Docker コンテナが残っている状態。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                        PORTS               NAMES
e3f80197a69d        centos:7            "/bin/sh"           About a minute ago   Exited (130) 10 seconds ago                       agitated_torvalds

確認が終わったら、一旦 boot2docker の仮想マシンを止めて仮想マシンの名前を確認しておく。 デフォルトでは "boot2docker-vm" になっているはず。

$ boot2docker stop
$ boot2docker config | grep ^VM
VM = "boot2docker-vm"

名前を確認したら移行用のコマンドを実行する。 一番最後のパラメータが移行後の仮想マシンの名前になる。 boo2docker では管理できる仮想マシンの数が 1 台に限られていたが、Docker Machine では複数台になったため名前で管理することになる。

$ docker-machine create -d virtualbox --virtualbox-import-boot2docker-vm boot2docker-vm dev
Creating VirtualBox VM...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env dev

ちなみに、もし移行する必要がないのであれば --virtualbox-import-boot2docker-vm オプションを抜いて実行すれば良い。 これで、まっさらな状態の仮想マシンができる。

$ docker-machine create -d virtualbox dev

Docker Machine を使ってみる

ここからは実際に Docker Machine を使っていこう。 とはいえ、大体の流れは boot2docker と同じなので心配する必要はない。

まず、docker-machine ls コマンドで Docker Machine が管理している仮想マシンの一覧が確認できる。 上手くいけばここに移行もしくは作成した仮想マシンが表示されるはずだ。

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

次に、boo2docker shellinit 相当のコマンドは Docker Machine では docker-machine env サブコマンドになっている。

$ docker-machine env dev
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.106:2376"
export DOCKER_CERT_PATH="/Users/amedama/.docker/machine/machines/dev"
export DOCKER_MACHINE_NAME="dev"
# Run this command to configure your shell: 
# eval "$(docker-machine env dev)"

使い方については boo2docker shellinit と同様、出力を eval に突っ込む。 これで 'dev' という名前の付いた Docker ホストを使う準備が整った。

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

準備ができたら docker version サブコマンドで Docker Machine の仮想マシンと正常に通信できることを確認しよう。 下記のように Server の項目が出力されていれば問題ない。 もし、何かエラーが出るようであればメッセージに沿って修正していく。

$ docker version
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 19:47:52 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Thu Aug 13 02:49:29 UTC 2015
 OS/Arch:      linux/amd64

動作を確認する

docker ps コマンドで確認すると boot2docker の仮想マシンにあった Docker コンテナがそのまま引き継がれていることがわかる。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
e3f80197a69d        centos:7            "/bin/sh"           10 minutes ago      Exited (130) 9 minutes ago                       agitated_torvalds

もちろん新しい Docker コンテナを起動することもできる。

$ docker run -i -t centos:7 /bin/sh
Unable to find image 'centos:7' locally
7: Pulling from library/centos

f1b10cd84249: Pull complete 
c852f6d61e65: Pull complete 
7322fbe74aa5: Pull complete 
Digest: sha256:a33ee9b2bb0eab603419279a1830281676f6df9b63261c90efd1981301c4bda8
Status: Downloaded newer image for centos:7
sh-4.2# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
sh-4.2# uname -r
4.0.9-boot2docker

上記の uname コマンドの出力や以下のように docker-machine ssh した際の表示からも分かるように、Docker Machine で使っている仮想マシンのイメージは boot2docker のそれをそのまま流用しているようだ。

$ docker-machine ssh dev
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79

boot2docker と docker-machine コマンドの対比

参考までに boot2docker コマンドと docker-machine コマンドの対比表を載せておく。 公式ドキュメントでは boot2docker の poweroff が stop に対応していたり reset が restart に対応してるけどこれは嘘っぽい。 stop や restart ではいつまでたっても仮想マシンを強制シャットダウンしてくれないみたいだから kill を使って止める必要がありそう。

boot2docker docker-machine 説明
init create Docker ホストを作成する
up/start/boot start Docker ホストを起動する
ssh ssh Docker ホストに SSH でログインする
save/suspend - Docker ホストを一時停止する
down/stop/halt stop Docker ホストをシャットダウンする
restart restart Docker ホストを再起動する
poweroff kill Docker ホストを強制シャットダウンする
reset - Docker ホストを強制再起動する
delete/destroy rm Docker ホストを削除する
config/cfg inspect 設定を表示する
info inspect Docker ホストの詳細情報を表示する
ip ip Docker ホスト IP アドレスを表示する
shellinit env Docker クライアント用のシェルコマンドを表示する
status status Docker ホストの状態を表示する
download - Docker ホストの ISO イメージをダウンロードする
upgrade upgrade Docker ホストの ISO イメージを更新する
version --version バージョン情報を表示する
- active 起動中の Docker ホストを表示する
- config Docker ホストへの接続設定を表示する
- ls Docker ホストの一覧を表示する
- regenerate-certs TLS の証明書を作り直す
- scp Docker ホスト間でファイルをコピーする
- url Docker ホストのURL を表示する
- help ヘルプメッセージを表示する

まとめ

今回は Homebrew を使って boot2docker から Docker Machine に移行する方法について書いた。 基本的な設計や操作方法は変わっていないため、移行してもそんなに悩むこともなさそうだ。