Golang Cafe #27 まとめ Dockerのソースコードを読む。その2

2014/04/27に開催された「Golang Cafe #27」についてのまとめです。
前回に引き続き、今回もDockerソースコードを読んでいきます。


今回は/docker/api/client/commands.go:1776行付近のCmdRunメソッドを読んでいきます。
前回、起動までの手順を読んでわかったように、

$ docker run -i -t busybox

のように実行された場合にCmdRunメソッドがリフレクションを使用して実行されます。


まずは引数の解析。runサブコマンド以降の引数をチェックします。
イメージが指定されていない場合は、Usageを表示して終了。


コンテナIDファイルの存在をチェックして現在起動中かどうかを確認します。
存在している(起動中の)場合は終了します。


以降の処理についてはunixドメインソケット(プロセス間通信)を使用してサーバー側と通信を行ないます。
サーバー側と書きましたが、Ubuntuだとapt-get経由でdockerをインストールした時点で

[taknb2nch@ubuntu13:~]$ ps axu | grep docker
root       666  0.2  0.3 339504  7332 ?        Ssl  13:44   0:00 /usr/bin/docker -d
1000      3000  0.0  0.0  14624   948 pts/5    R+   13:45   0:00 grep --color=auto docker

このようにdockerのデーモンが起動しているようです。
どうやらクライアント側はこのデーモンに対してコマンドとパラメータを投げているだけのように見えてきました。


デーモン側の処理をまだみていないので以下は半分予測です。
まず、POST:/containers/createで起動するイメージを作成(準備?)します。
もし指定してたイメージが存在していない場合は、POST:/images/createでリポジトリからイメージをダウンロードしてくる流れになっています。


起動するイメージのコンテナIDファイルを作成します。


起動するイメージに対するアタッチ(この場合でいうと、イメージ上でターミナルの操作をしたり、入出力を受け取ったり)が必要な場合は、POST:/containers/(ID)/attachで接続します。


最後にPOST:/containers/(ID)/startで起動します。


停止する場合は、POST:/containers/(ID)/waitでイメージを停止後、DELETE:/containers/(ID)?v=1で削除されるようです。
ただダウンロードされたイメージは自動的には削除されないと思うので、実際にはなんらかの別の処理が行われているのではないかと思います。

まとめ

今回の成果としては、起動しているdockerデーモンに対してクライアントからコマンドを投げて処理をしているという流れがわかったということでしょうか。
あとは、やはりシステムコールやシグナルが使われているのでwindowsじゃ動かないなと。
次回はクライアントから投げたコマンド行方(デーモン側)を読んでいくことになりました。