Dockerとtmuxを連携するdmuxというツールをつくった

Docker + tmux = dmux !

dmuxを使うと現在起動中のtmuxのwindowにおいて,新しくpaneをつくりそこでDockerコンテナを起動することができる.使い捨て,かつ高速に起動するクリーンな環境でコマンドを試したり,ツールを入れて使ってみたりなどといったことができる.また,プロセスと途中で止めて,後にそれを再開することもできる.

デモ

以下は簡単な動作例.

上のデモでは,以下のことが可能であることを示している.

  • dmux initにより新しいpaneでコンテナを起動し,そこにアタッチする
  • dmux stopでプロセスを停止してpaneを削除する
  • dmux startで停止したプロセスを再開(for文のカウントが途中から再開している)し,新しいpaneで再びコンテナにアタッチする
  • dmux deleteでコンテナとpaneを削除する

なぜつくったか

Dockerのv0.12.0で追加されたpauseunpauseコマンドの検証と,それによってどのようことができそうかを探求するためにつくった.

そもそもDockerには,stopstartというコマンドがある.これらは,コンテナの停止と起動のために使われる.具体的にはstopを実行すると,コンテナにはSIGTERMSIGKILLが送られコンテナはシャットダウンする.そしてstartを実行すると停止したコンテナが再起動する.

それと異なりpauseは,cgroup freezerにより,コンテナを停止する.つまり,pauseを使うとプロセスの実行を一時停止,再開することができるようになる.

pauseを使えばライブマイグレーションができるのでは,といろいろ試してみたが,まだまだその土壌はなく断念した.それでもこれは面白い機能なので,何かできないかということで今回の実装に至った.実際,上のデモにおけるfor文の停止とその再開はこのpauseを使って実現している.

また,dotcloudのjpetazzoさんが,CRIU(”Checkpoint Restart In Userspace”)を使って似たようなツールをつくっており,それにインスパイアされている.

dmuxの機能

pauseunpauseで遊ぶだけでなく,ある程度使えるツールにはしてある(つもり).上のデモの内容に加えて以下のことできる.

  • dmux initではデフォルトでubuntuイメージが使われるが,-iオプションで好きなイメージを指定することができる.つまり,作成したイメージの軽い検証に使える.
  • dmux saveを使うといろいろ試したコンテナをイメージとして保存することができる.

詳しい使い方はREADMEを参照.

インストール

go getでインストールできる.

1
$ go get install github.com/tcnksm/dmux

バグは@deeeet,もしくはGithubのIssueにお願いします.

参考


Full Blog →