私はDockerコンテナー内でJenkinsを実行しています。JenkinsコンテナがDockerホストでもかまいませんか?私が考えているのは、Jenkins内から(データベース、メッセージブローカーなどを起動するために)統合テストビルドごとに新しいDockerコンテナーを起動することです。したがって、統合テストが完了したら、コンテナーをシャットダウンする必要があります。この方法で別のDockerコンテナ内からDockerコンテナを実行しないようにする理由はありますか?
私はDockerコンテナー内でJenkinsを実行しています。JenkinsコンテナがDockerホストでもかまいませんか?私が考えているのは、Jenkins内から(データベース、メッセージブローカーなどを起動するために)統合テストビルドごとに新しいDockerコンテナーを起動することです。したがって、統合テストが完了したら、コンテナーをシャットダウンする必要があります。この方法で別のDockerコンテナ内からDockerコンテナを実行しないようにする理由はありますか?
回答:
Docker(別名dind)内でDockerを実行することは、可能であれば、可能な限り回避する必要があります。(ソースは以下に提供されています。)代わりに、メインコンテナーが兄弟コンテナーを生成して通信する方法を設定します。
JérômePetazzoni( DockerをDockerコンテナー内で実行できるようにした機能の作成者)が、実際にはそうしないようにブログに投稿しました。彼が説明するユースケースは、他のDockerコンテナー内でジョブを実行する必要があるCI DockerコンテナーのOPの正確なユースケースと一致します。
Petazzoniはdindが面倒である2つの理由をリストします:
そのブログ投稿から、彼は次の代替案について説明しています、
[最も簡単な方法は、
-v
フラグを使用してバインドマウントすることにより、DockerソケットをCIコンテナーに公開することです。簡単に言えば、Docker-in-Dockerで何かをハッキングする代わりに、CIコンテナー(Jenkinsなど)を開始するときに、次のように開始します。
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
これで、このコンテナーはDockerソケットにアクセスできるようになり、コンテナーを開始できるようになります。「子」コンテナを開始する代わりに、「兄弟」コンテナを開始します。
sudo
このようにせずにDockerコマンドを実行するにはどうすればよいですか?ありがとう
docker
グループに追加する必要があります:sudo usermod -aG docker $USER
。その後、再度ログインする必要があります。
/var/run/docker.sock
macosマシンでdocker for macを実行すると、Docker ソケットも同じ場所にあるため、同じです。
/var/run/docker.sock
私は以前、Docker内でDockerコンテナーを実行する方法について、同様の質問に回答しました。
docker内でdockerを実行することは間違いなく可能です。主なことは、(で始まる)追加の特権を持つ
run
外部コンテナーを作成し、そのコンテナーにdockerをインストールすることです。--privileged=true
詳細については、このブログ投稿を確認してください:Docker-in-Docker。
このエントリの 1つの潜在的な使用例は、このエントリで説明されていますます。このブログでは、Jenkinsのdockerコンテナー内でdockerコンテナーを構築する方法について説明しています。
ただし、Docker内のDockerは、この種の問題を解決するための推奨されるアプローチではありません。代わりに、この投稿で説明されている「兄弟」コンテナを作成することをお勧めします。
そのため、Docker内でDockerを実行することは、この種の問題に対する適切なタイプのソリューションと見なされていました。現在、代わりに「兄弟」コンテナを使用する傾向があります。詳細については、このページの@predmijatによる回答を参照してください。
Docker-in-Docker(DinD)を実行することは問題ありません。実際、Docker(会社)はこのための公式DinDイメージを持っています。
ただし、注意が必要なのは、特権コンテナが必要なことです。これは、セキュリティのニーズによっては、実行可能な代替手段ではない場合があります。
兄弟コンテナー(Docker-out-of-DockerまたはDooD)を使用してDockerを実行する代替ソリューションでは、特権コンテナーは必要ありませんが、次のようなコンテキスト内からコンテナーを起動しているという事実に起因するいくつかの欠点があります。それが実行されているものとは異なります(つまり、コンテナー内からコンテナーを起動しますが、コンテナー内ではなくホストのレベルで実行されます)。
DinDとDooDの長所/短所を説明するブログをこちらに書きました。
そうは言っても、Nestybox(私が設立したばかりのスタートアップ)は、真のDocker-in-Dockerを安全に(特権コンテナを使用せずに)実行するソリューションに取り組んでいます。www.nestybox.comで確認できます。
はい、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 ...