Docker のソースの構成についてのメモ

Go 言語が読めるようになってきたので、早速 Docker のソース(docker/docker)を読んで行こうかなと。上モノでピンと来ていないところを確認しつつ、早めにカーネルの方で対応する機能のコードを、あわせて読みたい。

そこで、まずはトップディレクトリを、とりあえず分類してみる。

分類はザッと見で以下のよう。間違いがあるかも知れないので、読みながら追っかけ修正する。

今日(Jan 11 2015)時点で、バージョンは 1.4.1。

クライアントサイドのコード

Docker クライアントのコマンドと、ライブラリ。

  • api/ クライアント側の Web API(client)
  • runconfig/ runサブコマンドの設定かな? コンテナや、コンテナを管理するホストの情報を保持する構造のようだ
  • opts/ 各種サブコマンドのオプションを validate したりする
  • nat/ NAT 構成指示の文字列を操作する(これは engine かな?)

Docker Engine 本体のコード

Docker 1.0 以降では、Docker 本体に「Docker Engine」の名前がつけられている。「Docker」ブランドのコアとしての「Docker Engine」ということなんだろうな。 ∥ いまさら聞けないDocker入門(2):ついに1.0がリリース! Dockerのインストールと主なコマンドの使い方 (1/3) - @IT

hack/make/cross を見ると分かるように、現状でサーバになれるのは「linux/amd64」のみである。

  • engine/ Docker のコアだと言う。ストレージ・エンジンとは関係が無さそう。
    • main.mainDaemon() から engine.New() している
    • サーバの機能そのもののように見える。builtins.Register(eng)registry.NewService(daemonCfg.InsecureRegistries).Install(eng) などをしている。気になる
  • builder/ Dockerfile のパーサ。実行もか?
  • daemon/ イメージ操作とコンテナ管理
  • builtins/ ?(たぶん engine)
  • events/ engine 内で用いられる Event 型のようだ
  • graph/ versioned な差分ファイルシステムのグラフ構造を保持する
  • image/ graph を操作するコードに見える。なぜ graph と別になっている?
  • volumes/ コンテナに bind 等される「volume」のことだろう
  • links/ 多分、--link のコンテナ間リンク機能
  • registry/ イメージのレジストリに関するコード

クライアント, Engine 共通のコード

  • dockerversion/ バージョン情報。docker/ に入れたいが、dockerinit/ が要するのでこの階層に置くとある
  • docker/ バイナリのフロント。Docker は、cli クライアントとデーモンとがワンバイナリである
  • vendor/ たとえば github.com/docker/libtrust であれば vendor/src/github.com/docker/libtrust/ に入る
  • trust/ これ(docker/libtrust)のフロントかな? 証明書や署名の validattion 等を扱う模様
  • utils/ いろいろ
  • pkg/ 汎用の(Docker に依存しない)ライブラリ

その他

それ以外はボチボチ見る。

  • ビルド関連
    • hack/ もしくは project/ ビルドと配布に関するリソース
    • bundles/ バイナリの出力先
  • dockerinit/ pkg/reexec/ を使っている。コンテナ用の init(8) か? 後で見る
  • integration-cli/ 統合テストか?
  • docs/ 文書。最新版の出力は Docker Documentation にある
    • sources/ 文書本体
  • contrib/ もろもろ。あまりメンテされていないかも知れない?
  • integration/ 旧統合テスト。deprecated 予定