web-dev-qa-db-ja.com

gitlab ciでのdocker-in-docker(dind)サービスの役割

公式の gitlabドキュメント によると、ciパイプライン内でdocker buildを有効にする1つの方法は、dindサービス(gitlab-ciサービス )。

ただし、Dockerエグゼキューターで実行されているciジョブでは常にそうであるため、docker:latestイメージも必要です。

誰か説明できますか:

  • docker:dinddocker:latestの画像の違いは何ですか?
  • (最も重要なこと):whybothサービスとdockerイメージ実行するために必要です(例: この例では 、githubドキュメントからリンク) docker build ciジョブですか? docker:latestイメージ(内でジョブが実行される!)dockerデーモンを組み込みません(そしてdocker-composeまた)、必要なコマンドに必要なツールはどれですか(例:docker builddocker Pushなど)?

私が間違っていない限り、質問は次のようになります。

DockerクライアントとDockerデーモンが同じDocker(有効な)コンテナに常駐できない理由

29
pkaramol

docker:dindとdocker:latestイメージの違いは何ですか?

  • docker:latest には、Dockerデーモンへの接続、つまりdocker builddocker runなどの実行に必要なすべてが含まれています。 。また、dockerデーモンも含まれていますが、エントリポイントとして起動されていません。
  • docker:dinddocker:latestに基づいて構築され、エントリポイントとしてdockerデーモンを起動します。

そのため、それらのコンテンツはほとんど同じですが、エントリポイントを通じて、1つはクライアントとしてtcp://docker:2375に接続するように構成され、もう1つはデーモンに使用されることを意図しています。

サービスとdockerイメージの両方が必要な理由[…]?

両方は必要ありません。最初のステップとしてdockerdを開始し、その後、通常どおりdocker buildおよびdocker runコマンドを実行して、2つのいずれかを使用できます here ;明らかに、これはgitlabの元のアプローチ のある時点 でした。しかし、service: docker:dindをセットアップしてdockerdを設定するのではなく、before_scriptを記述する方が簡単です。また、ベースイメージでdockerdを適切に起動およびインストールする方法を理解する必要はありません(docker:latestを使用していない場合)。

.gitlab-ci.ymlでサービスを宣言すると、ランナーが画像に/var/run/docker.sockをマウントしていることがわかっている場合、docker-in-dockerを簡単に交換できます。 protected variableDOCKER_Hostunix:///var/run/docker.sockに設定して、ビルドを高速化できます。そのようなランナーにアクセスできない他のユーザーは、.gitlab-ci.ymlを変更せずに、リポジトリをフォークしてdindサービスにフォールバックできます。

36
saraedum