1. ホーム
  2. docker

gitlab ciにおけるdocker-in-docker (dind)サービスの役割

2023-07-24 15:15:21

質問内容

公式発表によると gitlab ドキュメント を有効にする一つの方法として docker build の中で ci パイプラインの中で dind サービスを利用することです (この点については gitlab-ci サービス ).

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

誰か説明してください。

  • の違いは何ですか? docker:dinddocker:latest の画像は?
  • (最も重要)です。 なぜ ともに サービスや必要なdockerイメージ(例:表示されているように この例では を実行するために必要なサービスやDockerイメージ(例えばgithubのドキュメントからリンクされている)を示します。 docker build を実行するために、例えば、ciジョブ内で docker:latest の画像はないのですか? 内で、ジョブが実行される !)にドッカーデーモンを組み込んでいます。 docker-compose も)、必要なコマンドに必要なツールである(例えば docker build , docker push など)?

私が間違っていなければ、質問は多かれ少なかれなるものです。

なぜ docker クライアントと docker デーモンは同じ docker (有効) コンテナに常駐できないのですか?

どのように解決するのですか?

<ブロッククオート

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

  • docker:latest には、Docker デーモンに接続するために必要なもの、つまり、Docker デーモンを起動するために必要なものがすべて含まれています。 docker build , docker run などと表示されます。dockerデーモンも入っていますが、そのエントリポイントとして起動されていません。
  • docker:dind ビルドオン docker:latest を構築し、そのエントリポイントとして docker デーモンを開始します。

つまり、内容はほとんど同じですが、エントリーポイントを通して、1つの接続先が tcp://docker:2375 に接続するように設定されており、もう一方はデーモンとして使用されることを意図しています。

なぜサービスとdockerイメージの両方が必要なのでしょうか[...]?

両方必要なわけではありません。どちらか一方だけでいいのです、start dockerd を最初のステップとして実行し、その後 docker builddocker run のように、いつものようにコマンドを ここで どうやらgitlabではこれが本来のやり方だったようです。 ある時点では . しかし、私は単に service: docker:dind と書く方がすっきりします。 before_script を設定します。 dockerd . また、& をどのように起動するかを考える必要はありません。 dockerd を適切にベースイメージにインストールする方法を考える必要もありません (もし docker:latest .)

サービスの宣言は .gitlab-ci.yml の中で宣言することで、ランナーがドッカーインドッカーをマウントしていることが分かっている場合、簡単にドッカーインドッカーを交換することができます。 /var/run/docker.sock をイメージにマウントしていることがわかれば、 簡単に入れ替えることができます。を設定することができます。 保護された変数 DOCKER_HOST から unix:///var/run/docker.sock を追加することで、より高速なビルドが可能になります。このようなランナーにアクセスできない人は、あなたのリポジトリをフォークして dind サービスを利用することができます。 .gitlab-ci.yml .