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で削除されるようです。
ただダウンロードされたイメージは自動的には削除されないと思うので、実際にはなんらかの別の処理が行われているのではないかと思います。