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


185

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


11
別の可能性は、Dockerソケットをホストからコンテナー内のボリュームとしてマウントすることです。これにより、「兄弟」のコンテナを作成でき、キャッシュを再利用できるという利点があります。
Adrian Mouat、2015年

4
ホストからDockerソケットを使用する場合、外部ボリュームをマウントする場合は、Dockerデーモンが実行される場所として、ホストに対するボリュームパスを設定する必要があることがわかりました。コンテナーを開始するコンテナーに対して相対的に設定すると、パスが一致しない限り、必ずしも機能しません。
Jakob Runge 2016年

回答:


224

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

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

Petazzoniはdindが面倒である2つの理由をリストします:

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

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

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

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

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

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


1
sudoこのようにせずにDockerコマンドを実行するにはどうすればよいですか?ありがとう
c4k

3
ユーザーをdockerグループに追加する必要があります:sudo usermod -aG docker $USER。その後、再度ログインする必要があります。
predmijat 16

2
コインテイナー内から再ログインするにはどうすればよいですか?
thiagowfx 2017

1
@AlexanderMills /var/run/docker.sockmacosマシンでdocker for macを実行すると、Docker ソケットも同じ場所にあるため、同じです。
ブルースサン

1
窓はどうですか?持っていない/var/run/docker.sock
Abdelhafid

54

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

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

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

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

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

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


dockerでのdockerの回避については、以下のコメントを参照してください。
Dan Poltawski、2016

6

Docker-in-Docker(DinD)を実行することは問題ありません。実際、Docker(会社)はこのための公式DinDイメージを持っています。

ただし、注意が必要なのは、特権コンテナが必要なことです。これは、セキュリティのニーズによっては、実行可能な代替手段ではない場合があります。

兄弟コンテナー(Docker-out-of-DockerまたはDooD)を使用してDockerを実行する代替ソリューションでは、特権コンテナーは必要ありませんが、次のようなコンテキスト内からコンテナーを起動しているという事実に起因するいくつかの欠点があります。それが実行されているものとは異なります(つまり、コンテナー内からコンテナーを起動しますが、コンテナー内ではなくホストのレベルで実行されます)。

DinDとDooDの長所/短所を説明するブログをこちらに書きました

そうは言っても、Nestybox(私が設立したばかりのスタートアップ)は、真のDocker-in-Dockerを安全に(特権コンテナを使用せずに)実行するソリューションに取り組んでいます。www.nestybox.comで確認できます。


0

はい、Dockerでdockerを実行できます。「-v / var / run」を使用して、デフォルトでdockerデーモンがボリュームとして親dockerにリッスンするunix sockeet "/var/run/docker.sock"をアタッチする必要があります/docker.sock:/var/run/docker.sock " 「sudo chmod 757 /var/run/docker.sock」を記述できるdockerデーモンソケットのアクセス許可の問題が発生する場合があります。

また、Dockerを特権モードで実行する必要があるため、コマンドは次のようになります。

sudo chmod 757 /var/run/docker.sock

docker run --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.