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