読者です 読者をやめる 読者になる 読者になる

隙あらば寝る

うぇぶのかいしゃではたらくえんじにあがかいています

docker-machine を普段使いする

docker の周辺ツールとして docker-machine というものがあり、これが色々と便利なので紹介する。

vagrant を使ったことがある人なら、あれと同じレイヤーだと思うとわかりやすい。

この内容はすべて mac をローカルマシンとして使う前提。

vm 作成

docker-machine は docker がインストールされた linux をすぐ使えるようにしてくれる。

まずは vm の作成から。ここでは名前を vm1 とする。

docker-machine create vm1

これだけで vm が立ち上がるところまでやってくれる。 virtualbox のインストールが前提になっているのでそこは入れておく。

ちなみに自分は macVMware Fusion を使っているが、この場合は

docker-machine create -d vmwarefusion vm1

で OK。

まずは ssh

vm を作ったらまずは ssh したくなるというもの。当然この機能が提供されている。

docker-machine ssh vm1

これで対象 vmssh できる。

docker を使う

ssh できるのでそこから docker run ... は当然できるが、もう少し便利に使えるようになっている。

docker コマンドはリモートの docker-engine 操作もできるように作られているので、ホスト側(macとか)から直接操作できる。

ただしこのリモート接続をするには DOCKER_HOST 環境変数等を適切に設定する必要があるので設定がめんどくさい。

そこは docker-machine が env サブコマンドで隠蔽してくれている。

具体的には以下のコマンドを一度叩けば OK。

eval $(docker-machine env vm1)

docker-machine env はシェルとして解釈可能な文字列(export DOCKER_HOST=XXX とか)を出力してくれ、それを eval することで各種設定ができるようになっている。

結果としてこのコマンドを打ったあとは mac で docker run すると vm1 でコンテナが走る。

ネットワーク接続が面倒?

ここまでで docker コマンドがまるでローカルで動いているようになるが、まだ不便な点がある。

まずはネットワーク。とくに bridged コンテナはホスト側から直接通信ができない。

そのためネットワークを利用した接続をするのであれば publish (-p) で特定ポートを公開するか、host モードで動かす必要がある。これは構成上どうしようもないので受け入れる必要がある。

そして今度は vm の IP を得る方法が必要になるが、これは以下のコマンドで得られる。

docker-machine ip vm1

シェルのコマンド置換を使って

nc $(docker-machine ip vm1) 22

のようにして使うことができる。localhost とか 127.0.0.1 とか打つよりは面倒だが、アドレスを覚える必要はない。

ファイルシステム

ローカルのファイルシステムvmファイルシステムは別なので、普通は docker run -v でコンテナにディレクトリを共有できない...と考えるところだが、 docker-machine では制限があるものの実現されている。

これは virtualboxvmware の shard folder で可能となっており、mac では /Users が vm の /Users にマウントされている。(これ危なくない?と思うが趣旨が変わるので置いておく)

つまり mac から以下のコマンドを叩くと

docker run -v /Users/yoru9zine:/home/yoru9zine ...

コンテナの中で自分のホームディレクトリが /home/yoru9zine として参照できる。

まとめ

以上がざっと一通り docker-machine の使い方。

create の時に swarm 系のセットアップもできるのでまだまだ使い方は幅広いが、ここまでの内容で十分便利だと思う。

自分の場合は(完全置き換えはできないものの)vagrant を使うケースの大半が docker-machine で置き換えられそうだと思っている。

vagrant 依存は provision 周りだったり、ユーザランドだけでなく本当に "その" ディストリが入ってないとダメなパターンがあるので外せないが、

それ以外は docker-machine で生活してみるつもり。