web-dev-qa-db-ja.com

docker内からdockerを実行しても大丈夫ですか?

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

130
Johan

可能な限り、Docker内でDockerを実行する(別名dind)は、避けるべきです。 (以下にソースを示します。)代わりに、メインコンテナーがsiblingコンテナーを生成および通信する方法を設定する必要があります。

JérômePetazzoni — DockerをDockerコンテナ内で実行できるようにする機能の作成者—実際に書いた それをしないと言っているブログ投稿 。彼が説明する使用例は、他のDockerコンテナー内でジョブを実行する必要があるCI DockerコンテナーのOPの正確な使用例と一致します。

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

  1. Linux Security Modules(LSM)とはうまく連携しません。
  2. ファイルシステムに不一致が生じ、親コンテナ内に作成されたコンテナに問題が発生します。

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

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

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

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

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

156
predmijat

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

Docker内でdockerを実行することは間違いなく可能です。主なことは、外部コンテナをrun追加の特権--privileged=trueで始まる)にしてから、そのコンテナにdockerをインストールすることです。

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

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

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

そのため、Docker内でDockerを実行することは、多くの場合、この種の問題に対する優れたソリューションと見なされていました。現在では、代わりに「兄弟」コンテナを使用する傾向があります。詳細については、 このページの@predmijatによる回答 を参照してください。

44
wassgren