Más contenido relacionado La actualidad más candente (20) Similar a C#エンジニアのためのdocker kubernetesハンズオン (20) Más de Takayoshi Tanaka (20) C#エンジニアのためのdocker kubernetesハンズオン2. 自己紹介
Senior Technical Support Engineer @ New Relic K.K.
◦ アプリケーションプラットフォーム監視(APM)のSaaSです
◦ Observability(可観測性)の獲得を助けます
◦ 日本語サポートなど日本市場に注力しています
Microsoft MVP for Azure
◦ .NET Core on Linux, Kubernetes, Azureなどのお仕事してました
◦ Visual StudioやQ#などにも興味があります
ソーシャル活動
◦ Twitter: @tanaka_733
◦ Blog: 銀の光と碧い空
14. .NET Coreでコンテナ
コンテナのメリットは「可搬性」 どこでも動く
.NET Core自体がクロスプラットフォーム前提
◦ 例えば開発マシン(Win or Mac)とコンテナ(Linuxコンテナ)で同じアプリを動かせる
ASP.NET CoreがKestrelなど軽量Webサーバーをサポートしているので、
IISなどの重いWebサーバーをコンテナに入れなくてすむ
コンテナという広く使われている技術の上で動かすアプリケーションの開発言語として
.NET Core (C#)を採用できる!
17. 【補足】 Dockerfile best practice
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#leverage-
build-cache
の中で今回説明したもの
Use multi-stage builds
◦ マルチステージビルドを使う
Leverage build cache
◦ 変更されやすいものほど最後に書いて、キャッシュが効くようにする
(書いていないが説明したもの)
アプリケーションのコンパイルもDockerコンテナ内で完結させる
◦ ホストでコンパイルすると、環境依存になる
◦ 特にDockerビルドを行うクラウドサービスを使うとき、SDKがない場合がある
18. 【補足】マルチステージビルド
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS publish
WORKDIR /src
COPY . .
RUN dotnet publish MyWebApp.csproj -c Release -o /app
FROM base As final
WORKDIR /app
COPY --from=publish /app /app
ENTRYPOINT [ "dotnet", "MyWebApp.dll" ]
aspnet:2.2
base
sdk:2.2
publish
Runtimeのみ、軽量
SDK入り。重い。
ネットワーク設定等
dotnet publish
ENTRYPOINT
COPY ビルド成果物
こちらが最終的なdockerイメージ
こっちは使われない
csproj
など一式
final
31. New Relicの.NET Coreコンテナ対応
基本的な流れはQiitaに書いてあります
◦ https://qiita.com/takayoshitanaka/items/6eef46d821704a7384dc
推奨手順はインストーラー実行なのでDockerfile内でインストール実行
◦ インストーラー実行せずともdllやconfigなどを一式コピーしても動作することは確認
.NET CoreではkestrelおよびIISのみデフォルトで監視
◦ コンテナ上のASP.NET Coreはデフォルトkestrelを利用
32. FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base
ENV CORECLR_ENABLE_PROFILING=1
CORECLR_PROFILER={36032161-FFC0-4B61-B559-F6C5D41BAE5A}
CORECLR_NEWRELIC_HOME=/usr/local/newrelic-netcore20-agent
CORECLR_PROFILER_PATH=/usr/local/newrelic-netcore20-agent/libNewRelicProfiler.so
ARG agent_version="8.16.567.0"
RUN curl https://download.newrelic.com/dot_net_agent/previous_releases/${agent_version}/newrelic-netcore20-
agent_${agent_version}_amd64.deb -o newrelic-netcore20-agent_${agent_version}_amd64.deb
&& dpkg -i newrelic-netcore20-agent_${agent_version}_amd64.deb
&& rm newrelic-netcore20-agent_${agent_version}_amd64.deb
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS publish
WORKDIR /src
COPY . .
RUN dotnet publish <csprojファイルのパス> -c Release -o /app
FROM base As final
WORKDIR /app
COPY --from=publish /app /app
ENTRYPOINT [ "dotnet", "<publishしたdllのファイル名>" ]
New Relic用のDockerfile例
環境変数の設定
(ライセンスキーとアプリ名は
コンテナ起動時に指定するので
ここでは省略)
Agentのインストーラーを
インターネットから取得してインストール
Notas del editor OSとミドルウェア(.NET Core、JVM など)とアプリの組み合わせで簡単にイメージを作れる
=>いつでも同じ環境を起動できる
可搬性がある
=>開発用マシン、オンプレサーバーで動く。ACSやECSを使うとコンテナイメージ1つを手軽にクラウド上で動かせる
OSの技術を使いこのようなコンテナを移動、実行するための実装技術の一つがdocker。
そのコアとなるものがdocker daemon。
デーモンを操作するためにREST APIやdocker CLIが提供されている。今日はCLIを使う。 LinuxではLinux、WInではWinのコンテナイメージのみ(現状)
Docker CLIからの指示を受けてdocker daemonがうごく。
DockerのイメージはRegistryに保管される。Docker HubをはじめとするpublicなRegistryやprivateなRegistryを作れる。
docker daemonは必要になったイメージをまずローカルで探し、なければRegistryからもってくる。これをpullとよぶ。
コンテナからホスト、コンテナから別コンテナは原則アクセスできない
(明示的な指定でネットワークアクセスを許可したり、ボリュームマウントできる)