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 予定