Embed presentation
Download as PDF, PPTX











![p.12Docker for Windows の基本的な利用方法◼ 2. Dockerfile の作成 (Docker イメージ構築手順の指定) 適当なフォルダ(通常はソースコードのルートフォルダ)にテキストファイルを作成◼ 名前は "Dockerfile" (先頭は大文字にすること)◼ メモ帳などのテキストエディタを使って編集(エディタとして VS Code を使うと便利) Dockerfile に Docker イメージの構築手順を記述する◼ Docker イメージ ≒ アプリを動かすためのディスクイメージ + 起動コマンドライン指定◼ 今回のケースの場合には... ① Docker Hub から OpenJDK のオフィシャルイメージを取得 ② アプリや設定をファイルコピー(イメージに追加) ③ 外部に公開するポートを指定(※ やや複雑なため、詳細は後述) ④ コンテナ起動時に実行するアプリの起動コマンドラインを指定#① OpenJDK をベースにイメージ構築FROM openjdk:8-jre-alpine#② 出来上がっている jar ファイルを、Docker コンテナのディスクイメージに取り込みCOPY ./target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar#③ コンテナのポート 8080 を外に解放する予定であることを宣言#※ EXPOSE コマンドを使っても、ホストからの接続には docker -p 引数が必要EXPOSE 8080#④ 特に引数指定がなかった場合には、コンテナ立ち上げ時に以下のコマンドを実行CMD ["java", "-jar", "/app/ROOT.jar"]Dockerfile① Docker Hub で配布されている、OpenJDK 組み込み済みのディスクイメージを拾ってくる② ディスクイメージ内にアプリをコピーする③ この Docker イメージが起動された場合、自動起動させるコマンドラインを指定※ CMD を使った場合は実行時に上書き可能(後述)メモ帳で編集してもよいが、VS Code を使うと色がついてわかりやすいざっくり言えば...](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-12-2048.jpg&f=jpg&w=240)

![p.14Docker for Windows の基本的な利用方法◼ 3. Docker イメージの作成 Dockerfile ファイルと docker コマンドラインツールを使って、Docker イメージを作成◼ docker build -t <イメージ名> <Dockerfile へのパス>◼ これにより、Windows OS 上で Linux のイメージファイルを作成することができる◼ 初回実行時は Docker Hub からのイメージダウンロードに時間がかかる 作成されたイメージはローカルディスク上に保存される◼ docker images コマンドにより確認できるC:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>docker build -t myjavaapp .Sending build context to Docker daemon 110.8MBStep 1/4 : FROM openjdk:8-jdk-alpine---> cc2179b8f042Step 2/4 : COPY ./target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar---> Using cache---> e5d742024522Step 3/4 : EXPOSE 8080---> Using cache---> 9fa6489ab147Step 4/4 : CMD ["java", "-jar", "/app/ROOT.jar"]---> Using cache---> 137800a4d12cSuccessfully built 137800a4d12cSuccessfully tagged myjavaapp:latestSECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directoriesadded to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions forsensitive files and directories.C:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>コマンドラインC:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmyjavaapp latest 137800a4d12c 12 hours ago 170MBopenjdk 8-jdk-alpine cc2179b8f042 13 days ago 102MB作成されたイメージファイル• 無指定の場合、自動的に "latest" タグが付与される• このため、正式名は "myjavaapp:latest" となる](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-14-2048.jpg&f=jpg&w=240)
![p.15Docker for Windows の基本的な利用方法◼ 4. Docker コンテナの起動 docker コマンドラインツールを使って、Docker コンテナを起動◼ docker run --name <コンテナ名> -it -rm -p <ホスト側ポート番号>:<コンテナ側ポート番号> <イメージ名:タグ名> (上書きする実行コマンドライン)(参考) 主な Docker の起動オプションについて(株式会社ビヨンド様の blog)https://beyondjapan.com/blog/2016/08/docker-command-reverse-resolutionsオプション 概要 備考よく使うもの--name コンテナ名を付与する 無指定の場合は UUID 識別子 (68b89c08edda など)-it フォアグラウンド動作させ、コンソールへ出力する-p ホスト:コンテナ コンテナ内のポートをホスト側ポートにつないで公開--rm コンテナ終了時にファイルシステムを消す デバッグしたい場合には消さずに残すとよい-e "key=value" 環境変数を設定する必要に応じて使うもの-d デタッチドモードで動作させる フォアグラウウンドで動作しない = Ctrl + C で止められない-c, -m など CPU やメモリの利用に制限をかける-v ホスト:コンテナ 共有ファイルシステムを利用する--restart=always コンテナが終了した際に、自動的にコンテナを再起動C:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>docker run --name myjavaapp1 -it -p 5000:8080 myjavaapp:latest java -jar/app/ROOT.jar. ____ _ __ _ _/¥¥ / ___'_ __ _ _(_)_ __ __ _ ¥ ¥ ¥ ¥( ( )¥___ | '_ | '_| | '_ ¥/ _` | ¥ ¥ ¥ ¥¥¥/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_¥__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.0.0.RELEASE)2018-06-27 02:28:19.971 INFO 1 --- [ main] a.s.SpringBootSystemApplication : StartingSpringBootSystemApplication v0.0.1-SNAPSHOT on 68b89c08edda with PID 1 (/app/ROOT.jar started by root in /)コマンドライン特によく使う](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-15-2048.jpg&f=jpg&w=240)










![p.26Dockerfile の作り方◼ ① ホストマシンでコンパイルし、その結果だけをコンテナイメージ内にコピーする 最もオーソドックスな方法、通常はこの方法を利用すればよい 理由) Java や .NET の場合、コンパイルは Linux マシン上・Windows マシン上どちらであっても同じバイナリを出力するためコンテナユーザーイメージ実行ランタイムイメージホストマシンソースコードコンパイルバイナリパッケージファイル取り込みユーザーイメージ実行ランタイムイメージ出力Windows でコンパイル# OpenJDK をベースにイメージを構築# jar バイナリを実行するだけであるため、JRE のみのイメージを利用FROM openjdk:8-jre-alpine# すでに出来上がっている jar バイナリをホストマシンからからコンテナイメージに取り込みCOPY ./target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar# コンテナのポート 8080 を外に解放する予定であることを示すEXPOSE 8080# コンテナ起動時の実行コマンドを指定CMD ["java", "-jar", "/app/ROOT.jar"]# ビルド方法# C:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>docker build -t myjavaapp -f ./Dockerfile .# 実行方法# docker run --name myjavaapp1 -i -p 5000:8080 myjavaapp:latestDockerfile](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-26-2048.jpg&f=jpg&w=240)
![p.27Dockerfile の作り方◼ ② SDK を含むコンテナにソースコードを持ち込み、コンパイルして利用する ホストマシン側ではコンパイルできない場合や、ホストマシンとは異なる環境でコンパイルしたい場合に利用する ただし、この方法だとイメージが大きくなる → ③の方法を利用する# OpenJDK をベースにイメージを構築# ビルドまで行うために jdk を利用FROM openjdk:8-jdk-alpine# ホストマシンからコンテナにソースコードをコピーCOPY . /sourceWORKDIR /source# 改行コード修正と実行権限の修正RUN sed -i 's/¥r$//' mvnwRUN chmod 777 mvnw# ソースコードをビルドRUN ./mvnw clean package -DskipTestsRUN mkdir /appRUN mv /source/target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar# コンテナのポート 8080 を外に解放する予定であることを示すEXPOSE 8080# コンテナ起動時の実行コマンドを指定CMD ["java", "-jar", "/app/ROOT.jar"]DockerfileコンテナユーザーイメージSDKイメージホストマシンソースコードファイル取り込み出力コンパイルユーザーイメージSDKイメージ実行時には使わないLinux でコンパイルイメージが大きい](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-27-2048.jpg&f=jpg&w=240)
![p.28Dockerfile の作り方◼ ③ コンテナでコンパイルした後、実行用のコンテナイメージを別途作成する マルチステージビルドと呼ばれる手法 実行イメージに不要なソースを残す必要がなく、サイズも極小化できるユーザーイメージオフィシャルイメージコンテナユーザーイメージSDKイメージホストマシンソースコードファイル取り込みコンパイルコンテナユーザーイメージ実行ランタイムイメージファイル取り込み 出力イメージを極小化# ビルドを行うために jdk を利用FROM openjdk:8-jdk-alpine AS build# ソースコードをビルドCOPY . /sourceWORKDIR /source# 改行コード修正と実行権限の修正RUN sed -i 's/¥r$//' mvnwRUN chmod 777 mvnwRUN ./mvnw clean package -DskipTests# 最終イメージを作成FROM openjdk:8-jre-alpineRUN mkdir /appWORKDIR /appCOPY --from=build /source/target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar# コンテナのポート 8080 を外に解放する予定であることを示すEXPOSE 8080# コンテナ起動時の実行コマンドを指定CMD ["java", "-jar", "/app/ROOT.jar"]DockerfileLinux でコンパイルJDK を利用JRE を利用ビルド用コンテナからコンパイル結果をコピー](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-28-2048.jpg&f=jpg&w=240)


![p.31Dockerfile の作り方◼ その他の Dockerfile の作成例 参考) ASP.NET Core Web アプリケーションの場合◼ Web アプリプロジェクト内に Dockerfile ファイルを作成◼ マルチステージビルドを利用◼ 発行(publish)されたファイルのみをイメージに取り込んで利用するFROM microsoft/aspnetcore:2.0 AS baseWORKDIR /appEXPOSE 80FROM microsoft/aspnetcore-build:2.0 AS buildWORKDIR /srcCOPY . /srcRUN dotnet build . -c Release -o /appFROM build AS publishRUN dotnet publish . -c Release -o /appFROM base AS finalWORKDIR /appCOPY --from=publish /app .# ENTRYPOINT ではなく CMD で書いておく(コマンドラインでの上書きができる)CMD ["dotnet", "AzRefArc.AspNetCore.WebApp.dll"]# イメージビルド# C:¥Users¥nakama¥source¥repos¥AzRefArc.AspNetCore¥AzRefArc.AspNetCore.WebApp>docker build -t azrefarcaspnetcore .# イメージデバッグ コンテナ内ポート 80 をホスト側の 8080 へ接続# docker run --name azrefarcaspnetcore1 -it -p:8080:80 azrefarcaspnetcoreDockerfile](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-31-2048.jpg&f=jpg&w=240)


















![p.50VSTS ビルドによる Docker イメージのビルド◼ ① Windows マシンで自動ビルドマシンを構築する方法(続き) 利用する Dockerfile について◼ 下記のような Dockerfile を利用する◼ ソースコードの一部として Dockerfile を管理しておく# jar バイナリを実行するだけであるため、JRE のみのイメージを利用FROM openjdk:8-jre-alpine# すでに出来上がっている jar バイナリをホストマシンからからコンテナ# イメージに取り込みCOPY ./target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar# コンテナのポート 8080 を外に解放する予定であることを示すEXPOSE 8080# コンテナ起動時の実行コマンドを指定CMD ["java", "-jar", "/app/ROOT.jar"]Dockerfile](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-50-2048.jpg&f=jpg&w=240)


![p.53VSTS ビルドによる Docker イメージのビルド◼ ③ (参考) Windows マシンで自動ビルドマシンを構築するが、コンパイルはLinux Docker 上で行う方式 (Java などであれば問題ないが)Linux 上にしかコンパイラがないような場合に便利 マルチステージビルドを行う Dockerfile を作り、Docker コンテナ内でコンパイルも行うユーザーイメージオフィシャルイメージコンテナユーザーイメージSDKイメージビルドマシンソースコードファイル取り込みコンパイルコンテナユーザーイメージ実行ランタイムイメージファイル取り込み 出力Dockerfileコンパイルイメージ作成Linux でコンパイルイメージ発行コンテナレジストリACRプッシュFROM openjdk:8-jdk-alpine AS buildCOPY . /sourceWORKDIR /sourceRUN sed -i 's/¥r$//' mvnwRUN chmod 777 mvnwRUN ./mvnw clean package -DskipTestsFROM openjdk:8-jre-alpineRUN mkdir /appWORKDIR /appCOPY --from=build /source/target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jarEXPOSE 8080CMD ["java", "-jar", "/app/ROOT.jar"]Dockerfileコンパイルイメージを極小化イメージ作成イメージ作成イメージ作成イメージ発行](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-53-2048.jpg&f=jpg&w=240)









この資料では、Docker for Windows を使って Windows OS 上で Linux ベースのアプリを開発する方法、そして Web アプリを含む Docker コンテナをクラウド環境(Azure 環境)に展開する方法について解説します。※ 本資料では Docker の Linux コンテナのみを取り扱います。(Windows コンテナは取り扱いません。Windows OS で使い慣れたエディタや開発環境を使いつつ、Docker for Windows を活用して Linux 上でデバッグを行う、というシナリオを扱っています。)※ 資料の概要は以下の blog エントリを参照してください。https://blogs.msdn.microsoft.com/nakama/2018/09/27/dockerandazure/











![p.12Docker for Windows の基本的な利用方法◼ 2. Dockerfile の作成 (Docker イメージ構築手順の指定) 適当なフォルダ(通常はソースコードのルートフォルダ)にテキストファイルを作成◼ 名前は "Dockerfile" (先頭は大文字にすること)◼ メモ帳などのテキストエディタを使って編集(エディタとして VS Code を使うと便利) Dockerfile に Docker イメージの構築手順を記述する◼ Docker イメージ ≒ アプリを動かすためのディスクイメージ + 起動コマンドライン指定◼ 今回のケースの場合には... ① Docker Hub から OpenJDK のオフィシャルイメージを取得 ② アプリや設定をファイルコピー(イメージに追加) ③ 外部に公開するポートを指定(※ やや複雑なため、詳細は後述) ④ コンテナ起動時に実行するアプリの起動コマンドラインを指定#① OpenJDK をベースにイメージ構築FROM openjdk:8-jre-alpine#② 出来上がっている jar ファイルを、Docker コンテナのディスクイメージに取り込みCOPY ./target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar#③ コンテナのポート 8080 を外に解放する予定であることを宣言#※ EXPOSE コマンドを使っても、ホストからの接続には docker -p 引数が必要EXPOSE 8080#④ 特に引数指定がなかった場合には、コンテナ立ち上げ時に以下のコマンドを実行CMD ["java", "-jar", "/app/ROOT.jar"]Dockerfile① Docker Hub で配布されている、OpenJDK 組み込み済みのディスクイメージを拾ってくる② ディスクイメージ内にアプリをコピーする③ この Docker イメージが起動された場合、自動起動させるコマンドラインを指定※ CMD を使った場合は実行時に上書き可能(後述)メモ帳で編集してもよいが、VS Code を使うと色がついてわかりやすいざっくり言えば...](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-12-2048.jpg&f=jpg&w=240)

![p.14Docker for Windows の基本的な利用方法◼ 3. Docker イメージの作成 Dockerfile ファイルと docker コマンドラインツールを使って、Docker イメージを作成◼ docker build -t <イメージ名> <Dockerfile へのパス>◼ これにより、Windows OS 上で Linux のイメージファイルを作成することができる◼ 初回実行時は Docker Hub からのイメージダウンロードに時間がかかる 作成されたイメージはローカルディスク上に保存される◼ docker images コマンドにより確認できるC:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>docker build -t myjavaapp .Sending build context to Docker daemon 110.8MBStep 1/4 : FROM openjdk:8-jdk-alpine---> cc2179b8f042Step 2/4 : COPY ./target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar---> Using cache---> e5d742024522Step 3/4 : EXPOSE 8080---> Using cache---> 9fa6489ab147Step 4/4 : CMD ["java", "-jar", "/app/ROOT.jar"]---> Using cache---> 137800a4d12cSuccessfully built 137800a4d12cSuccessfully tagged myjavaapp:latestSECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directoriesadded to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions forsensitive files and directories.C:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>コマンドラインC:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmyjavaapp latest 137800a4d12c 12 hours ago 170MBopenjdk 8-jdk-alpine cc2179b8f042 13 days ago 102MB作成されたイメージファイル• 無指定の場合、自動的に "latest" タグが付与される• このため、正式名は "myjavaapp:latest" となる](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-14-2048.jpg&f=jpg&w=240)
![p.15Docker for Windows の基本的な利用方法◼ 4. Docker コンテナの起動 docker コマンドラインツールを使って、Docker コンテナを起動◼ docker run --name <コンテナ名> -it -rm -p <ホスト側ポート番号>:<コンテナ側ポート番号> <イメージ名:タグ名> (上書きする実行コマンドライン)(参考) 主な Docker の起動オプションについて(株式会社ビヨンド様の blog)https://beyondjapan.com/blog/2016/08/docker-command-reverse-resolutionsオプション 概要 備考よく使うもの--name コンテナ名を付与する 無指定の場合は UUID 識別子 (68b89c08edda など)-it フォアグラウンド動作させ、コンソールへ出力する-p ホスト:コンテナ コンテナ内のポートをホスト側ポートにつないで公開--rm コンテナ終了時にファイルシステムを消す デバッグしたい場合には消さずに残すとよい-e "key=value" 環境変数を設定する必要に応じて使うもの-d デタッチドモードで動作させる フォアグラウウンドで動作しない = Ctrl + C で止められない-c, -m など CPU やメモリの利用に制限をかける-v ホスト:コンテナ 共有ファイルシステムを利用する--restart=always コンテナが終了した際に、自動的にコンテナを再起動C:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>docker run --name myjavaapp1 -it -p 5000:8080 myjavaapp:latest java -jar/app/ROOT.jar. ____ _ __ _ _/¥¥ / ___'_ __ _ _(_)_ __ __ _ ¥ ¥ ¥ ¥( ( )¥___ | '_ | '_| | '_ ¥/ _` | ¥ ¥ ¥ ¥¥¥/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_¥__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.0.0.RELEASE)2018-06-27 02:28:19.971 INFO 1 --- [ main] a.s.SpringBootSystemApplication : StartingSpringBootSystemApplication v0.0.1-SNAPSHOT on 68b89c08edda with PID 1 (/app/ROOT.jar started by root in /)コマンドライン特によく使う](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-15-2048.jpg&f=jpg&w=240)










![p.26Dockerfile の作り方◼ ① ホストマシンでコンパイルし、その結果だけをコンテナイメージ内にコピーする 最もオーソドックスな方法、通常はこの方法を利用すればよい 理由) Java や .NET の場合、コンパイルは Linux マシン上・Windows マシン上どちらであっても同じバイナリを出力するためコンテナユーザーイメージ実行ランタイムイメージホストマシンソースコードコンパイルバイナリパッケージファイル取り込みユーザーイメージ実行ランタイムイメージ出力Windows でコンパイル# OpenJDK をベースにイメージを構築# jar バイナリを実行するだけであるため、JRE のみのイメージを利用FROM openjdk:8-jre-alpine# すでに出来上がっている jar バイナリをホストマシンからからコンテナイメージに取り込みCOPY ./target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar# コンテナのポート 8080 を外に解放する予定であることを示すEXPOSE 8080# コンテナ起動時の実行コマンドを指定CMD ["java", "-jar", "/app/ROOT.jar"]# ビルド方法# C:¥Users¥nakama¥source¥repos¥AzRefArc.SpringBoot>docker build -t myjavaapp -f ./Dockerfile .# 実行方法# docker run --name myjavaapp1 -i -p 5000:8080 myjavaapp:latestDockerfile](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-26-2048.jpg&f=jpg&w=240)
![p.27Dockerfile の作り方◼ ② SDK を含むコンテナにソースコードを持ち込み、コンパイルして利用する ホストマシン側ではコンパイルできない場合や、ホストマシンとは異なる環境でコンパイルしたい場合に利用する ただし、この方法だとイメージが大きくなる → ③の方法を利用する# OpenJDK をベースにイメージを構築# ビルドまで行うために jdk を利用FROM openjdk:8-jdk-alpine# ホストマシンからコンテナにソースコードをコピーCOPY . /sourceWORKDIR /source# 改行コード修正と実行権限の修正RUN sed -i 's/¥r$//' mvnwRUN chmod 777 mvnw# ソースコードをビルドRUN ./mvnw clean package -DskipTestsRUN mkdir /appRUN mv /source/target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar# コンテナのポート 8080 を外に解放する予定であることを示すEXPOSE 8080# コンテナ起動時の実行コマンドを指定CMD ["java", "-jar", "/app/ROOT.jar"]DockerfileコンテナユーザーイメージSDKイメージホストマシンソースコードファイル取り込み出力コンパイルユーザーイメージSDKイメージ実行時には使わないLinux でコンパイルイメージが大きい](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-27-2048.jpg&f=jpg&w=240)
![p.28Dockerfile の作り方◼ ③ コンテナでコンパイルした後、実行用のコンテナイメージを別途作成する マルチステージビルドと呼ばれる手法 実行イメージに不要なソースを残す必要がなく、サイズも極小化できるユーザーイメージオフィシャルイメージコンテナユーザーイメージSDKイメージホストマシンソースコードファイル取り込みコンパイルコンテナユーザーイメージ実行ランタイムイメージファイル取り込み 出力イメージを極小化# ビルドを行うために jdk を利用FROM openjdk:8-jdk-alpine AS build# ソースコードをビルドCOPY . /sourceWORKDIR /source# 改行コード修正と実行権限の修正RUN sed -i 's/¥r$//' mvnwRUN chmod 777 mvnwRUN ./mvnw clean package -DskipTests# 最終イメージを作成FROM openjdk:8-jre-alpineRUN mkdir /appWORKDIR /appCOPY --from=build /source/target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar# コンテナのポート 8080 を外に解放する予定であることを示すEXPOSE 8080# コンテナ起動時の実行コマンドを指定CMD ["java", "-jar", "/app/ROOT.jar"]DockerfileLinux でコンパイルJDK を利用JRE を利用ビルド用コンテナからコンパイル結果をコピー](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-28-2048.jpg&f=jpg&w=240)


![p.31Dockerfile の作り方◼ その他の Dockerfile の作成例 参考) ASP.NET Core Web アプリケーションの場合◼ Web アプリプロジェクト内に Dockerfile ファイルを作成◼ マルチステージビルドを利用◼ 発行(publish)されたファイルのみをイメージに取り込んで利用するFROM microsoft/aspnetcore:2.0 AS baseWORKDIR /appEXPOSE 80FROM microsoft/aspnetcore-build:2.0 AS buildWORKDIR /srcCOPY . /srcRUN dotnet build . -c Release -o /appFROM build AS publishRUN dotnet publish . -c Release -o /appFROM base AS finalWORKDIR /appCOPY --from=publish /app .# ENTRYPOINT ではなく CMD で書いておく(コマンドラインでの上書きができる)CMD ["dotnet", "AzRefArc.AspNetCore.WebApp.dll"]# イメージビルド# C:¥Users¥nakama¥source¥repos¥AzRefArc.AspNetCore¥AzRefArc.AspNetCore.WebApp>docker build -t azrefarcaspnetcore .# イメージデバッグ コンテナ内ポート 80 をホスト側の 8080 へ接続# docker run --name azrefarcaspnetcore1 -it -p:8080:80 azrefarcaspnetcoreDockerfile](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-31-2048.jpg&f=jpg&w=240)


















![p.50VSTS ビルドによる Docker イメージのビルド◼ ① Windows マシンで自動ビルドマシンを構築する方法(続き) 利用する Dockerfile について◼ 下記のような Dockerfile を利用する◼ ソースコードの一部として Dockerfile を管理しておく# jar バイナリを実行するだけであるため、JRE のみのイメージを利用FROM openjdk:8-jre-alpine# すでに出来上がっている jar バイナリをホストマシンからからコンテナ# イメージに取り込みCOPY ./target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jar# コンテナのポート 8080 を外に解放する予定であることを示すEXPOSE 8080# コンテナ起動時の実行コマンドを指定CMD ["java", "-jar", "/app/ROOT.jar"]Dockerfile](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-50-2048.jpg&f=jpg&w=240)


![p.53VSTS ビルドによる Docker イメージのビルド◼ ③ (参考) Windows マシンで自動ビルドマシンを構築するが、コンパイルはLinux Docker 上で行う方式 (Java などであれば問題ないが)Linux 上にしかコンパイラがないような場合に便利 マルチステージビルドを行う Dockerfile を作り、Docker コンテナ内でコンパイルも行うユーザーイメージオフィシャルイメージコンテナユーザーイメージSDKイメージビルドマシンソースコードファイル取り込みコンパイルコンテナユーザーイメージ実行ランタイムイメージファイル取り込み 出力Dockerfileコンパイルイメージ作成Linux でコンパイルイメージ発行コンテナレジストリACRプッシュFROM openjdk:8-jdk-alpine AS buildCOPY . /sourceWORKDIR /sourceRUN sed -i 's/¥r$//' mvnwRUN chmod 777 mvnwRUN ./mvnw clean package -DskipTestsFROM openjdk:8-jre-alpineRUN mkdir /appWORKDIR /appCOPY --from=build /source/target/azrefarc-springboot-0.0.1-SNAPSHOT.jar /app/ROOT.jarEXPOSE 8080CMD ["java", "-jar", "/app/ROOT.jar"]Dockerfileコンパイルイメージを極小化イメージ作成イメージ作成イメージ作成イメージ発行](/image.pl?url=https%3a%2f%2fimage.slidesharecdn.com%2fdockerforwindowsv0-180927001416%2f75%2fDocker-for-Windows-Web-Apps-for-Containers-53-2048.jpg&f=jpg&w=240)







