Open5
docker のコンテナ実行の処理を読む
前提
以下の条件で Dockerfile を用意する。
$ docker --version
Docker version 20.10.21, build baeda1f
$ cat Dockerfile
FROM ubuntu:16.04
COPY helloworld /usr/local/bin
RUN chmod +x /usr/local/bin/helloworld
CMD ["helloworld"]%
イメージのビルド
$ docker image build .
コンテナの実行
$ docker container run IMAGE_ID
Hello, World!
docker/cli から読み進める。
cobra のサブコマンド docker container
の run
を読む。
コマンド実行内容は以下の関数を参照。
やっていることを箇条書きにすると
- イメージプルのオプションのバリデーション
- コンテナ作成時のオプションをビルド
- ホスト OS の conifg を読み込む
- コンテナオプションをパースし、コンテナの設定を生成
- ここの実装が長く、読み応えがありそうだ
- https://github.com/docker/cli/blob/88be16cb5bebac3451733ef4a0b003eefb1a4260/cli/command/container/opts.go#L320
- API クライアントのバージョンのバリデーション
- コンテナ実行
- 一番肝要な実装だろう
次は 3. のパース処理、5. コンテナ実行の順に読む。
パース処理
こちらも順に処理を追う。
- MAC アドレスのバリデーション
- swappiness (スワップの優先度)のバリデーション
- これはホスト OS の設定
-
/proc/sys/vm/swappiness
等で確認できる- mac で Docker 起動するときは HyperKit がホスト環境 になると思うがその設定が反映されるということだろうか?
- ボリュームのパース
- tmpfs マウントの引数のマッピング ref
- tmpfs マウントはコンテナ外部の一時的なファイルシステムにコンテナ実行時のデータを書き込むためのオプション
-
エントリーポイントの上書き
- エントリーポイントは Dockerfile で指定するコンテナで実行されるデフォルトのコマンドだが、docker run 実行時にオプションで指定することも可能で、ここではその上書きを行なっている
- publish オプションの取得
- コンテナとホスト OS のポートをマッピングするオプション
- expose で指定されたポートを publish のポートにマージ
- デバイスマッピングのパース&バリデーション
- コメントによるとデバイスのオプション指定のバリデーションが他のバリデーションと遅れてこの位置にくるのは、フラグをパースする際はまだホスト OS の種類が決定できていないからのようだ
- OS のバリデーションは
"linux"
or"windows"
を見ている
- 環境変数の読み込み
- コンテナへのラベルの設定
- ラベルを使うことでコンテナにメタデータを提供する
- PID, UTS の設定
- user, cgroup 名前空間の設定
- その他オプションのパース
- 多すぎて省略してしまった...
- ヘルスチェック周りのオプションが指定されていた場合、設定を生成
- コンテナ設定の生成
コンテナ実行
//nolint:gocyclo
でサイクロマティック複雑度の警告を抑制していることから複雑度が高いと推測される。
コンテナ生成
ここまでに生成されたコンテナ設定、ホスト、ネットワークの設定を元にコンテナを生成する。
OOM キラー
Linux のメモリ管理機能で、メモリ不足になった場合に実行中のプロセスを強制終了させる。
WIP