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

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

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

ベストアンサー1

Docker 内で Docker を実行すること (別名dind ) は可能ですが、可能な限り避けるべきです。(ソースは下記に提供されています。) 代わりに、メイン コンテナーが兄弟コンテナーを生成して通信する方法を設定する必要があります。

ジェローム・ペタゾーニ— Dockerコンテナ内でDockerを実行可能にした機能の作者 — は実際に次のように書いた。それをしてはいけないというブログ記事彼が説明するユースケースは、他の Docker コンテナ内でジョブを実行する必要がある CI Docker コンテナの OP のユースケースとまったく一致しています。

Petazzoni は、dind が問題となる 2 つの理由を挙げています。

  1. Linux セキュリティ モジュール (LSM) とうまく連携しません。
  2. これにより、ファイル システムに不一致が生じ、親コンテナー内に作成されたコンテナーに問題が発生します。

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

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

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

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

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

おすすめ記事