docker-machine を普段使いする
docker の周辺ツールとして docker-machine というものがあり、これが色々と便利なので紹介する。
vagrant を使ったことがある人なら、あれと同じレイヤーだと思うとわかりやすい。
この内容はすべて mac をローカルマシンとして使う前提。
vm 作成
docker-machine は docker がインストールされた linux をすぐ使えるようにしてくれる。
まずは vm の作成から。ここでは名前を vm1 とする。
docker-machine create vm1
これだけで vm が立ち上がるところまでやってくれる。 virtualbox のインストールが前提になっているのでそこは入れておく。
ちなみに自分は mac で VMware Fusion を使っているが、この場合は
docker-machine create -d vmwarefusion vm1
で OK。
まずは ssh
vm を作ったらまずは ssh したくなるというもの。当然この機能が提供されている。
docker-machine ssh vm1
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 では制限があるものの実現されている。
これは virtualbox や vmware の 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 で生活してみるつもり。