Docker コンテナー内で Jenkins を実行しています。Jenkins コンテナが Docker ホストでもいいのでしょうか? 私が考えているのは、Jenkins 内から統合テスト ビルドごとに新しい docker コンテナーを開始することです (データベース、メッセージ ブローカーなどを開始するため)。したがって、統合テストが完了したら、コンテナーをシャットダウンする必要があります。この方法で別の docker コンテナー内から docker コンテナーを実行することを避ける理由はありますか?
4 に答える
Docker (別名dind ) 内で Docker を実行することは、可能な限り避けてください。(ソースは以下に提供されています。) 代わりに、メイン コンテナーが生成し、兄弟コンテナーと通信する方法を設定する必要があります。
Jérôme Petazzoni — Docker を Docker コンテナ内で実行できるようにする機能の作者 — は、実際にブログ投稿で、実行しないようにと書いています。彼が説明するユース ケースは、他の Docker コンテナー内でジョブを実行する必要がある CI Docker コンテナーの OP の正確なユース ケースと一致します。
Petazzoni は、dind が面倒な理由を 2 つ挙げています。
- Linux セキュリティ モジュール (LSM) とはうまく連携しません。
- これにより、ファイル システムに不一致が生じ、親コンテナー内に作成されたコンテナーに問題が生じます。
そのブログ投稿から、彼は次の代替案について説明しています。
[最も簡単な方法は、Docker ソケットを
-v
フラグでバインドマウントすることにより、CI コンテナーに公開することです。簡単に言えば、CI コンテナー (Jenkins など) を起動するときに、Docker-in-Docker で何かをハッキングする代わりに、次のように起動します。
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
これで、このコンテナーは Docker ソケットにアクセスできるようになり、コンテナーを開始できるようになります。ただし、「子」コンテナーを開始する代わりに、「兄弟」コンテナーを開始します。
Docker 内で Docker コンテナーを実行する方法について、以前に同様の質問に答えました。
docker 内で docker を実行することは間違いなく可能です。重要なことは、追加の権限( で始まる) を
run
持つ外側のコンテナーを作成し、そのコンテナーに docker をインストールすることです。--privileged=true
詳細については、このブログ投稿を確認してください: Docker-in-Docker。
これの潜在的なユースケースの 1 つが、このエントリーで説明されています。このブログでは、Jenkins docker コンテナー内に docker コンテナーを構築する方法について説明しています。
ただし、Docker 内部の Docker は、この種の問題を解決するための推奨されるアプローチではありません。代わりに、この投稿で説明されているように、 「兄弟」コンテナーを作成することをお勧めします。
そのため、Docker 内で Docker を実行することは、この種の問題に対する優れた解決策であると考えられていました。現在は、代わりに「兄弟」コンテナーを使用する傾向があります。詳細については、このページの @predmijat による回答を参照してください。