Docker コンテナ内で Jenkins を実行しています。Jenkins コンテナを Docker ホストとしても問題ないでしょうか? 私が考えているのは、Jenkins 内から統合テスト ビルドごとに新しい Docker コンテナを起動することです (データベース、メッセージ ブローカーなどを起動するため)。したがって、統合テストが完了したら、コンテナをシャットダウンする必要があります。このように、別の Docker コンテナ内から Docker コンテナを実行しない理由はありますか?
ベストアンサー1
Docker 内で Docker を実行すること (別名dind ) は可能ですが、可能な限り避けるべきです。(ソースは下記に提供されています。) 代わりに、メイン コンテナーが兄弟コンテナーを生成して通信する方法を設定する必要があります。
ジェローム・ペタゾーニ— Dockerコンテナ内でDockerを実行可能にした機能の作者 — は実際に次のように書いた。それをしてはいけないというブログ記事彼が説明するユースケースは、他の Docker コンテナ内でジョブを実行する必要がある CI Docker コンテナの OP のユースケースとまったく一致しています。
Petazzoni は、dind が問題となる 2 つの理由を挙げています。
- Linux セキュリティ モジュール (LSM) とうまく連携しません。
- これにより、ファイル システムに不一致が生じ、親コンテナー内に作成されたコンテナーに問題が発生します。
そのブログ記事では、彼は次のような代替案を説明しています。
最も簡単な方法は、フラグを使用してバインドマウントし、Docker ソケットを CI コンテナーに公開することです
-v
。簡単に言うと、CI コンテナ (Jenkins など) を起動するときに、Docker-in-Docker で何かをハッキングするのではなく、次のように起動します。
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
これで、このコンテナは Docker ソケットにアクセスできるようになり、コンテナを起動できるようになります。ただし、「子」コンテナを起動する代わりに、「兄弟」コンテナを起動します。