1. ホーム

[解決済み】dockerの内部からdockerを実行しても大丈夫ですか?

2022-04-05 20:31:38

質問

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

解決方法は?

Dockerの中でDockerを実行する(a.k.a. ディンド ) は、可能ではありますが、可能な限り避けるべきでしょう。(その代わり、メインコンテナから 兄弟 コンテナです。

Jérôme Petazzoni(ジェローム・ペタゾーニ - DockerをDockerコンテナの中で実行できるようにした機能の作者は、実際に次のように書いています。 というブログ記事があります。 . 彼が説明するユースケースは、他のDockerコンテナ内でジョブを実行する必要があるCI DockerコンテナというOPのユースケースと正確に一致します。

ペタゾーニ氏は、dindが厄介な理由を2つ挙げています。

  1. Linux Security Modules (LSM)との連携がうまくいかない。
  2. ファイルシステムにミスマッチが生じ、親コンテナの中に作成されたコンテナに問題が発生します。

そのブログ記事から、次のような代替案を説明しています。

[最もシンプルな方法は、DockerソケットをCIコンテナに公開することです。 -v フラグを使用します。

簡単に言うと、CIコンテナ(Jenkinsなど)を起動するときに、Docker-in-Dockerで何かをハックするのではなく、Docker-in-Dockerで起動するのです。

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

これで、このコンテナはDockerソケットにアクセスできるようになり、コンテナを起動できるようになります。ただし、quot;child"コンテナを起動するのではなく、quot;sibling"コンテナを起動することになります。