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 に移行する方法について書いた。 基本的な設計や操作方法は変わっていないため、移行してもそんなに悩むこともなさそうだ。