さらに別のチュートリアル:Linuxのdockerでdotnetコアアプリケーションを実行する



曇りのある夏の日、AvitoからRIT2017までのセクションを訪れた後、ドッカーに関する誇大広告が数年間沈黙しておらず、ついにそれをマスターする時が来たことが突然わかりました。 Dotnetコア+ C#がパッケージングのテスト対象として選択されました。これは、LinuxでC#を使用して開発するのがどのようなものかを見るのが長かったからです。

読者への警告:この記事は、Docker / dotnetコアのまったく新しいものを対象としており、主に自分自身へのリマインダーとして書かれています。 Docker入門ガイドの最初の3部と特定の英語のブログ投稿に触発されました。 英語が得意な人はすぐに読むことができ、一般的には非常に似ています。 上記のすべての後で、読み続けるためにまだ心を変えていないなら、猫にようこそ。

前提条件

したがって、Linux(私の場合はWindows 10のVirtualBoxのUbuntu 16.04)、 dotnet coredockerdocker composeが必要です。そうすると、複数のコンテナーを一度に持ち上げるのがより便利になります。

特別なインストールの問題は発生しません。 少なくとも何もありませんでした。

開発環境の選択
正式には、少なくともノートブックに書き込み、ログまたはコンソールメッセージを介してデバッグできますが、 私は少し甘やかされていますが、それでも通常のデバッグと、できれば通常のリファクタリングを取得したかったのです。

Linuxでできることから、私自身はVisual Studio CodeとJetBrains Riderを試しました。

ビジュアルスタジオコード
私は何を言うことができます-それは動作します。 デバッグできますが、構文は強調表示されますが、すべてが非常に気取らない-印象は、これがデバッグ機能を備えたメモ帳であるということです。

ライダー
本質的に、Ideaは再シャーパーと交差しました。JetBrainsのIDEで以前に機能していれば、すべてがシンプルで理解しやすいものになります。 最近まで、デバッグはLinuxでは機能しませんでしたが、最新のEAPビルドで返されました。 一般的に、私にとって、ライダーを支持する選択は明確でした。 クールな製品を提供してくれたJetBrainsに感謝します。

プロジェクトを作成する

教育目的のために、さまざまなIDEの[ プロジェクト作成]ボタンを軽deし、コンソールを介してペンですべてを実行します。

1.将来のプロジェクトのディレクトリに移動します
2.楽しみにして、使用できるパターンを見てみましょう

dotnet new -all 

3. WebApiプロジェクトを作成する

 dotnet new webapi 

4.依存関係を強化します

 dotnet restore 

5.アプリケーションを起動します

 dotnet run 

6. http://localhost:5000/api/valuesを開き、LinuxでC#コードの作業を楽しみます

Dockerizationアプリケーションの準備

Program.cs移動し、ホスト構成に追加します

 .UseUrls("http://*:5000") // listen on port 5000 on all network interfaces 

結果は次のようになります

 public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseUrls("http://*:5000") // listen on port 5000 on all network interfaces .UseStartup<Startup>() .Build(); host.Run(); } 

これは、コンテナ内にあるアプリケーションに戻るために必要です。
デフォルトでは、アプリケーションを実行するKestrelhttp://localhost:5000リッスンしhttp://localhost:5000 。 問題は、localhostがループバックインターフェイスであり、コンテナーでアプリケーションを実行すると、コンテナー内でのみ使用できることです。

したがって、dotnetコアアプリケーションをリッスンURLのデフォルト設定でドッキングした後、ポートフォワーディングが機能しない理由を長い間疑問に思って、エラーを探してドッカーファイルを再読み込みできます。

アプリケーションにいくつかの機能を追加することもできます。
アプリケーションにパラメーターを渡す

コンテナを起動するとき、アプリケーションにパラメータを渡すことができるようにしたいと思います。
簡単なグーグルは、コンテナ内から構成サービスにアクセスするエキゾチックなタイプを省くと、環境変数を通過したり、構成ファイルをスプーフィングするパラメーターを使用できることを示しました。

さて、環境変数を渡します。

Startup.cs publicpublic Startup(IHostingEnvironment env)し、 ConfigurationBuilderAddEnvironmentVariables()メソッドが呼び出されConfigurationBuilderいることを確認します。

実際、すべて-DIを介してどこからでも環境変数からパラメーターを注入できます。

インスタンスID

アプリケーションインスタンスの開始時に、新しいGuidを生成し、それをIoCコンテナーに入れて、被災者に配布します。 これは、たとえば、複数の並列サービスインスタンスからのログを分析するために必要です。

すべてが非常に簡単です-ConfigurationBuilderを呼び出します:

  .AddInMemoryCollection(new Dictionary<string, string> { {"InstanseId", Guid.NewGuid().ToString()} }) 

これらの2つのステップの後、 public Startup(IHostingEnvironment env)は次のようになります。

 public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddInMemoryCollection(new Dictionary<string, string> { {"InstanseId", Guid.NewGuid().ToString()} }) .AddEnvironmentVariables(); Configuration = builder.Build(); } 

DIについて少し

彼は私には少し直感的でもないようでした。 深く掘り下げたわけではありませんが、それでも、起動時に設定したインスタンスのIDと環境変数(MyTestParam変数など)からコントローラーに何かをスローする方法の簡単な例を以下に示します。

まず、設定クラスを作成する必要があります。フィールド名は、注入する構成パラメーターの名前と一致する必要があります。

  public class ValuesControllerSettings { public string MyTestParam { get; set; } public string InstanseId { get; set; } } 

次に、 Startup.csに移動してConfigureServices(IServiceCollection services)を変更しConfigureServices(IServiceCollection services)

  // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { //  Ionfiguration //    ValuesControllerSettings services.Configure<ValuesControllerSettings>(Configuration); // Add framework services. services.AddMvc(); } 

最後のステップでは、マシンによって作成された唯一の実験的なValuesController進み、コンストラクターを介してインジェクションを記述します

  private readonly ValuesControllerSettings _settings; public ValuesController(IOptions<ValuesControllerSettings> settings) { _settings = settings.Value; } 

using Microsoft.Extensions.Options;using Microsoft.Extensions.Options;して追加することusing Microsoft.Extensions.Options;忘れないでくださいusing Microsoft.Extensions.Options; 。 テストのために、コントローラーが取得したパラメーター、開始、確認→利益を返すように、いいね!されたメソッドの応答を再定義します。

Dockerイメージをビルドして実行する

1.まず、公開用のアプリケーションのバイナリを取得します。 これを行うには、ターミナルを開き、プロジェクトディレクトリに移動して呼び出します。

 dotnet publish 

コマンドの詳細については、 こちらをご覧ください

追加せずにこのコマンドを実行します。 プロジェクトディレクトリの引数は、。 ./bin/Debug/[framework]/publishに公開するために./bin/Debug/[framework]/publish

2.実際、このパパをdockerイメージに入れます。

これを行うには、プロジェクトDockerfileを作成し、以下について記述します。

 #      FROM microsoft/dotnet:runtime #        CMD WORKDIR /testapp #      (, dockerfile     )    COPY /bin/Debug/netcoreapp1.1/publish /testapp #     5000,   Kestrel EXPOSE 5000 #       CMD ["dotnet",".dll"] 

3. Dockerfile後、 Dockerfile実行します。

 docker build -t my-cool-service:1.0 . 

my-cool-serviceは画像の名前、 1.0はアプリケーションのバージョンを示すタグです

4.次に、サービスのイメージがリポジトリにあることを確認します。

 docker images 

5.最後に、イメージを実行します。

 docker run -p 5000:5000 my-cool-service:1.0 

6. http://localhost:5000/api/valuesを開き、LinuxのdockerでC#コードの作業をお楽しみください

便利なDockerコマンド
ローカルリポジトリの画像を表示する
 docker images 

実行中のコンテナを表示する
 docker ps 

分離モードでコンテナを実行する
 docker run   -d 

コンテナ情報を取得する
 docker inspect ___ 

コンテナを停止
 docker stop ___ 

すべてのコンテナとすべてのイメージを削除します
 # Delete all containers docker rm $(docker ps -a -q) # Delete all images docker rmi $(docker images -q) 


最後に小さなdocker-compose

docker-composeは 、関連するコンテナのグループを実行するのに便利です。 例として、新しいマイクロサービスの開発を引用します。すでに記述され、ドッキングされているservices1およびservice2と通信したいservice3を記述しましょう。 開発目的のService1およびService2は、docker docker-composeを使用してリポジトリから便利かつ迅速に生成できます。

単純なdocker-compose.yml 。これにより、アプリケーションのコンテナーとnginxを含むコンテナーが発生し(開発中にローカルで必要になる理由はわかりませんが、例として機能します)、後者をアプリケーションのリバースプロキシとして構成します。

 #   docker-compose  version: '3.3' services: #    service1: container_name: service1_container #    image: my-cool-service:1.0 #  ,      environment: - MyTestParam=DBForService1 # nginx reverse-proxy: container_name: reverse-proxy image: nginx #      nginx ports: - "777:80" #  nginx   volumes: - ./test_nginx.conf:/etc/nginx/conf.d/default.conf 

docker-composeファイルに記述されているサービス間の起動時のdocker-composeは、ローカルエリアネットワークを発生させ、サービスの名前に従ってホスト名を配布します。 これにより、このようなサービスは互いに便利に通信できます。 このプロパティを使用して、nginxの簡単な構成ファイルを作成します

 upstream myapp1 { server service1:5000; /*           docker-compose */ } server { listen 80; location / { proxy_pass http://myapp1; } } 

私たちは電話します:

 docker-compose up 

docker-compose.ymlを含むディレクトリから、アプリケーションのリバースプロキシとしてnginxを取得します。 同時に、nginxの代わりに何かが本当に便利であなたにとって必要であると想像することをお勧めします。 たとえば、テスト実行時のデータベース。

おわりに

dotnet core Linuxアプリケーションを作成し、そのためのdockerイメージをビルドおよび実行する方法を学び、さらにdocker-compose少し知りました。

この記事が誰かがdockerやdotnetコアの開発に時間を節約するのに役立つことを願っています。

読者へのリクエスト:突然、誰かがLinuxの実稼働dotnet coredotnet coreした経験がある場合(dockerは特に興味深いですが、dockerは特に興味深い)-コメントで使用した印象を共有してください。 実際の問題とその解決方法について聞くことは特に興味深いでしょう。

Source: https://habr.com/ru/post/J332582/


All Articles