web-dev-qa-db-ja.com

devopsライフサイクルの開発フェーズでdockerを使用するにはどうすればよいですか?

開発段階でのDockerの使用に関連するいくつかの質問があります。

devops

私は、Dockerを開発環境で使用する方法について3つの異なるシナリオを提案します。 REST API in JavaおよびSpring Bootを作成しています。これには、MySQLデータベースが必要です。

  1. 最初のシナリオは、MySQLコンテナーを使用した開発用のdocker-composeと、MySQLと別のコンテナー内のJavaアプリケーション(jar)を使用した本番用docker-composeです。開発するには、Dockerを起動します。 -compose-dev.ymlは、データベースのみを起動します。アプリケーションは、IntelliJ IdeaなどのIDEを使用して起動およびデバッグされます。コードに加えられた変更、IDEは、認識して再起動します変更を適用することによるアプリケーション。

  2. 2番目のシナリオは、開発環境と本番環境の両方で、データベースとアプリケーションコンテナーを使用してdocker-composeを作成することです。このようにして、コードに変更を加えるたびに、イメージを再構築して、変更がイメージに読み込まれ、コンテナーが再び起動されるようにする必要があります。このシナリオは最も一般的で、Dockerでの開発に使用されますが、変更があるたびにイメージを再構築する必要があるため、非常に遅いようです。

  3. 3番目のシナリオは、前の2つを組み合わせたものです。 2つのdocker-compose。開発docker-composeには両方のコンテナーが含まれていますが、アプリケーションのライブリロード、ボリュームのマッピング、Spring Dev Toolsなどの使用を可能にするメカニズムが含まれています。このようにして、コンテナが起動され、ファイルに変更があった場合、アプリケーションコンテナは変更があったことを検出して再起動されます。プロダクションの場合、docker-composeは両方のコンテナーを使用して単純に作成されますが、ライブリロードの機能はありません。私の意見では、これは理想的なシナリオですが、すべてがライブリロードを許可しているわけではないため、使用しているテクノロジーに大きく依存していると思います。

質問は以下の通りです。

  • フェーズにDockerを使用する場合、これらのシナリオのどれが最も一般的ですか?

  • シナリオ1は十分に提起されていますか?つまり、データベースやキューなどの外部サービスのみをドッキングし、Dockerを使用せずにIDEでアプリケーションの開発とデバッグを実行します。

私が提起する疑問とシナリオは、シナリオ2の問題を提起した後に浮上しました。コードを変更するたびに、イメージを再構築してコンテナを再起動する必要があるため、時間を大幅に浪費することになります。簡単に言えば、問題は次のとおりです。これを回避するには?

お時間をいただきありがとうございます。

[〜#〜]注[〜#〜]それは意見の対象となる質問かもしれませんが、開発者がこれらの問題を通常どのように処理するかを知っておくとよいでしょう。

7
Mr. Mars

まず最初に、docker-composeは開発とテストの段階にすぎず、本番環境ではありません。例:

最小限の基本的なdocker-composeで、すべてのコンテナーが同じマシンで実行されますか?開発目的の場合は問題ありませんが、本番環境では、すべてのアプリを1台のマシンに配置するのは危険です

仮定します

  • 01 Java api
  • 01 mysqlデータベース
  • APIを必要とする01 Webアプリケーション
  • これらのアプリケーション領域はすべて、すでに生産されています

素早い回答

Java apiに修正または新機能を追加する必要がある場合は、EclipseやIntelliJ IdeaなどのIDEを使用することをお勧めします。なぜですか?

  • なぜならJavaはコンパイルが必要だからです。
  • Mavenの依存関係により、Dockerコンテナー内でのコンパイルに時間がかかる
  • IDEにはコードの自動補完があります

この開発フェーズでは、Dockerは最も強力な機能の1つである「本番コンテナをローカルホストに持ち込む」ことを支援します。ええ、この場合、docker-compose.ymlが最適なオプションです。1つのファイルで、必要なすべてを開始できるためです。mysqlデータベースとWebアプリではなく、Java api。 Java好きなIDEのAPI。

とにかく、「開発」にdockerを使用したい場合は、ローカルホストでソースコードを実行する必要があるときに、Dockerfileとdocker buildを実行するだけです。

Dockerを使用した基本的なDevopsライフサイクル

  • Gitを使用した開発者プッシュのソースコードの変更
  • 継続的インテグレーション(C.I)プラットフォームがこの変更を検出して実行します
    • docker build ...(このステップでは、単体テストがトリガーされます)
    • dockerプライベートハブにプッシュします。コンテナーはこのステップでアップロードされ、他のサーバーへのデプロイメントに使用されます。
    • docker runまたはコンテナーを次の環境にデプロイ:テスト
  • 人間のテスター、セレンまたは別の自動化が作業を開始します
  • エラーが検出されなかった場合、C.Iはアップロードされたコンテナの本番環境への最終デプロイを実行します。 Dockerビルドは必要ありません。デプロイするか、Dockerを実行するだけです。

いくつかのヒント

Dockerの機能はすばらしいですが、複雑すぎる場合があります。したがって、ボリューム、ハードディスクの依存関係、ログ、または複雑な構成の使用を停止してください。ボリュームを使用する場合、コンテナーが別のホストにあるとどうなりますか?

JavaとNodejsは安定した言語であり、残りのAPIまたはWebアプリはクレイジーな設定を必要としません。 MavenコンパイルとJava -jar ...またはnpm installとnpm run startだけです。

ログの場合は、 https://www.graylog.org/google stasckdriver または別のログ管理を使用できます。

そしてHerokuのように、ハードディスクの依存関係の使用を可能な限り停止します。 Herokuプラットフォームでは、ディスクは使い捨てです。つまり、アプリを再起動するとディスクが消えます。したがって、ローカルファイルストレージの代わりに、多くの機能を持つ別のファイルストレージサービスを使用できます。

このアプローチを使用すると、コンテナーをどこにでも簡単にデプロイできます

0
JRichardsz