 
      曇りのある夏の日、AvitoからRIT2017までのセクションを訪れた後、ドッカーに関する誇大広告が数年間沈黙しておらず、ついにそれをマスターする時が来たことが突然わかりました。 Dotnetコア+ C#がパッケージングのテスト対象として選択されました。これは、LinuxでC#を使用して開発するのがどのようなものかを見るのが長かったからです。
読者への警告:この記事は、Docker / dotnetコアのまったく新しいものを対象としており、主に自分自身へのリマインダーとして書かれています。 Docker入門ガイドの最初の3部と特定の英語のブログ投稿に触発されました。 英語が得意な人はすぐに読むことができ、一般的には非常に似ています。 上記のすべての後で、読み続けるためにまだ心を変えていないなら、猫にようこそ。
前提条件
したがって、Linux(私の場合はWindows 10のVirtualBoxのUbuntu 16.04)、 dotnet core 、 docker 、 docker composeが必要です。そうすると、複数のコンテナーを一度に持ち上げるのがより便利になります。
特別なインストールの問題は発生しません。 少なくとも何もありませんでした。
  開発環境の選択 
       正式には、少なくともノートブックに書き込み、ログまたはコンソールメッセージを介してデバッグできますが、 私は少し甘やかされていますが、それでも通常のデバッグと、できれば通常のリファクタリングを取得したかったのです。 
      
        
        
        
      
    
      
        
        
        
      
Linuxでできることから、私自身はVisual Studio CodeとJetBrains Riderを試しました。
        
        
        
      
    
      
        
        
        
      
ビジュアルスタジオコード
        
        
        
      
私は何を言うことができます-それは動作します。 デバッグできますが、構文は強調表示されますが、すべてが非常に気取らない-印象は、これがデバッグ機能を備えたメモ帳であるということです。
        
        
        
      
    
      
        
        
        
      
ライダー
        
        
        
      
本質的に、Ideaは再シャーパーと交差しました。JetBrainsのIDEで以前に機能していれば、すべてがシンプルで理解しやすいものになります。 最近まで、デバッグはLinuxでは機能しませんでしたが、最新のEAPビルドで返されました。 一般的に、私にとって、ライダーを支持する選択は明確でした。 クールな製品を提供してくれたJetBrainsに感謝します。
        
        
        
      
    
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(); }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      これは、コンテナ内にあるアプリケーションに戻るために必要です。
デフォルトでは、アプリケーションを実行するKestrelは
http://localhost:5000
      
      リッスンし
http://localhost:5000
      
      。 問題は、localhostがループバックインターフェイスであり、コンテナーでアプリケーションを実行すると、コンテナー内でのみ使用できることです。
したがって、dotnetコアアプリケーションをリッスンURLのデフォルト設定でドッキングした後、ポートフォワーディングが機能しない理由を長い間疑問に思って、エラーを探してドッカーファイルを再読み込みできます。
  アプリケーションにいくつかの機能を追加することもできます。 
        アプリケーションにパラメーターを渡す 
      
        
        
        
      
    
      
        
        
        
      
コンテナを起動するとき、アプリケーションにパラメータを渡すことができるようにしたいと思います。
        
        
        
      
簡単なグーグルは、コンテナ内から構成サービスにアクセスするエキゾチックなタイプを省くと、環境変数を通過したり、構成ファイルをスプーフィングするパラメーターを使用できることを示しました。
        
        
        
      
    
      
        
        
        
      
さて、環境変数を渡します。
        
        
        
      
    
      
        
        
        
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
し、
        
        
        
      
    
        
        
        
      
      
        
        
        
      
に
        
        
        
      
    
        
        
        
      
      
        
        
        
      
メソッドが呼び出され
        
        
        
      
    
        
        
        
      
      
        
        
        
      
いることを確認します。
        
        
        
      
    
      
        
        
        
      
実際、すべて-DIを介してどこからでも環境変数からパラメーターを注入できます。
        
        
        
      
    
      
        
        
        
      
インスタンスID
        
        
        
      
    
      
        
        
        
      
アプリケーションインスタンスの開始時に、新しいGuidを生成し、それをIoCコンテナーに入れて、被災者に配布します。 これは、たとえば、複数の並列サービスインスタンスからのログを分析するために必要です。
        
        
        
      
    
      
        
        
        
      
すべてが非常に簡単です-ConfigurationBuilderを呼び出します:
        
        
        
      
    
      
        
        
        
      
    
        
        
        
      
これらの2つのステップの後、
        
        
        
      
    
        
        
        
      
      
        
        
        
      
は次のようになります。
        
        
        
      
    
      
        
        
        
      
    
        
        
        
      
DIについて少し
        
        
        
      
    
      
        
        
        
      
彼は私には少し直感的でもないようでした。 深く掘り下げたわけではありませんが、それでも、起動時に設定したインスタンスのIDと環境変数(MyTestParam変数など)からコントローラーに何かをスローする方法の簡単な例を以下に示します。
        
        
        
      
    
      
        
        
        
      
まず、設定クラスを作成する必要があります。フィールド名は、注入する構成パラメーターの名前と一致する必要があります。
        
        
        
      
    
      
        
        
        
      
    
        
        
        
      
次に、
        
        
        
      
    
        
        
        
      
      
        
        
        
      
に移動して
        
        
        
      
    
        
        
        
      
      
        
        
        
      
を変更し
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      
        
        
        
      
    
      
        
        
        
      
    
        
        
        
      
最後のステップでは、マシンによって作成された唯一の実験的な
        
        
        
      
    
        
        
        
      
      
        
        
        
      
進み、コンストラクターを介してインジェクションを記述します
        
        
        
      
    
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
を
        
        
        
      
    
        
        
        
      
      
        
        
        
      
して追加すること
        
        
        
      
    
        
        
        
      
      
        
        
        
      
忘れないでください
        
        
        
      
    
        
        
        
      
      
        
        
        
      
。 テストのために、コントローラーが取得したパラメーター、開始、確認→利益を返すように、いいね!されたメソッドの応答を再定義します。
        
        
        
      
    
コンテナを起動するとき、アプリケーションにパラメータを渡すことができるようにしたいと思います。
簡単なグーグルは、コンテナ内から構成サービスにアクセスするエキゾチックなタイプを省くと、環境変数を通過したり、構成ファイルをスプーフィングするパラメーターを使用できることを示しました。
さて、環境変数を渡します。
Startup.cs publicpublic Startup(IHostingEnvironment env)
      
      し、
ConfigurationBuilder
      
      に
AddEnvironmentVariables()
      
      メソッドが呼び出され
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 core
      
      で
dotnet core
      
      した経験がある場合(dockerは特に興味深いですが、dockerは特に興味深い)-コメントで使用した印象を共有してください。 実際の問題とその解決方法について聞くことは特に興味深いでしょう。