269

Docker コンテナー内で Jenkins を実行しています。Jenkins コンテナが Docker ホストでもいいのでしょうか? 私が考えているのは、Jenkins 内から統合テスト ビルドごとに新しい docker コンテナーを開始することです (データベース、メッセージ ブローカーなどを開始するため)。したがって、統合テストが完了したら、コンテナーをシャットダウンする必要があります。この方法で別の docker コンテナー内から docker コンテナーを実行することを避ける理由はありますか?

4

4 に答える 4

315

Docker (別名dind ) 内で Docker を実行することは、可能な限り避けてください。(ソースは以下に提供されています。) 代わりに、メイン コンテナーが生成し、兄弟コンテナーと通信する方法を設定する必要があります。

Jérôme Petazzoni — Docker を Docker コンテナ内で実行できるようにする機能の作者 — は、実際にブログ投稿で、実行しないようにと書いています。彼が説明するユース ケースは、他の Docker コンテナー内でジョブを実行する必要がある CI Docker コンテナーの OP の正確なユース ケースと一致します。

Petazzoni は、dind が面倒な理由を 2 つ挙げています。

  1. Linux セキュリティ モジュール (LSM) とはうまく連携しません。
  2. これにより、ファイル システムに不一致が生じ、親コンテナー内に作成されたコンテナーに問題が生じます。

そのブログ投稿から、彼は次の代替案について説明しています。

[最も簡単な方法は、Docker ソケットを-vフラグでバインドマウントすることにより、CI コンテナーに公開することです。

簡単に言えば、CI コンテナー (Jenkins など) を起動するときに、Docker-in-Docker で何かをハッキングする代わりに、次のように起動します。

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

これで、このコンテナーは Docker ソケットにアクセスできるようになり、コンテナーを開始できるようになります。ただし、「子」コンテナーを開始する代わりに、「兄弟」コンテナーを開始します。

于 2015-10-07T22:10:28.480 に答える
73

Docker 内で Docker コンテナーを実行する方法について、以前に同様の質問に答えました。

docker 内で docker を実行することは間違いなく可能です。重要なことは、追加の権限( で始まる) をrun持つ外側のコンテナーを作成し、そのコンテナーに docker をインストールすることです。--privileged=true

詳細については、このブログ投稿を確認してください: Docker-in-Docker

これの潜在的なユースケースの 1 つが、このエントリーで説明されています。このブログでは、Jenkins docker コンテナー内に docker コンテナーを構築する方法について説明しています。

ただし、Docker 内部の Docker は、この種の問題を解決するための推奨されるアプローチではありません。代わりに、この投稿で説明されているように、 「兄弟」コンテナーを作成することをお勧めします。

そのため、Docker 内で Docker を実行することは、この種の問題に対する優れた解決策であると考えられていました。現在は、代わりに「兄弟」コンテナーを使用する傾向があります。詳細については、このページの @predmijat による回答を参照してください。

于 2015-01-10T18:33:00.527 に答える