🍳

大人の学びなおしDocker(2)~中身編~

2024/12/14に公開

はじめに

前回はDockerの基礎の部分についておさらいしました。
ちょうどDockerの中身についてとても良い記事を見つけたので、今回からはDockerの深い仕様について少しだけ学びたいと思います。

Dockerとdeamon、Runtime

まず、Dockerの構成は以下のようになっています。本来はDocker Engineの上にDocker Swarmがいますが、今回は解説しないので省きます。

Docker Engine(デーモン)

  • クライアントから受け付けたコマンドの処理(docker pull, docker buildなどなど)
  • コンテナイメージの管理
  • ボリュームの管理
  • ネットワークの管理

などの仕事を受け持ちます。Docker EngineはAPIを公開しており、私たちがdocker pullなどのコマンドを叩くとその指示がDocker Engineに届きます。

Docker Engineの下にいるRuntimeはcontainerdとruncを含みます。これらRuntimeは主にコンテナの起動や停止を行います。コンテナのライフサイクルに関する機能はcontainerdが主に担っていますが、コンテナを作成することまではやりません。「何言ってんだ?」 って感じですが、containerdがやるのはコンテナ作成の指示を送るだけです。実際にはcontainerdの下にいるruncがコンテナを作成します。

runcはコンテナを作るとプロセスを終了します。そのためruncのプロセスが無限増殖することはありません。コンテナもプロセス共々死ぬんじゃ?と思いますが、コンテナは生き残ります。

runcは死ぬが、コンテナは死なない

コンテナを作ったruncが死んでいるのにコンテナが生き残っている理由として、shim という存在があります。

このshimはruncが死んだあとでコンテナの親プロセスとして動きます。そのためruncのプロセスだけ落としてもコンテナは死なず、逆にコンテナが終了した場合はこのshimのプロセスがDocker Engineに終了ステータスを伝えてくれます。

Docker EngineとRuntimeが分かれている理由

Docker EngineとRuntimeが分かれていることで、「Docker Engineが動かなくてもコンテナは稼働し続ける」というメリットがあるようです。

もしDocker Engineが不具合で停止してもRuntime側が生きていればコンテナは稼働し続けるし、Docker Engineにアップデートをかけたいときもコンテナを停止せずに実行できます。

まとめ

  • docker engineはコンテナを作らない。APIの公開やボリューム管理・ネットワーク管理などをする
  • Runtimeにはcontainerdとruncがいる。実際にコンテナを作るのはruncの方
  • コンテナは死なないわ、shimが守るもの

参照:https://medium.com/@dmosyan/deep-dive-into-docker-containers-architecture-and-features-530a937f4c87

コラボスタイル Developers

Discussion