iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 28
0
Software Development

.Net微服務輕旅行30天系列 第 28

Day 28: 微服務的封裝 Docker -- dockerfile自製image

更多的指令補充

  • docker run --name [container的名字] :方便管理跟記憶container
  • docker stats :container用掉的資源
  • docker logs [container] :查看Container的log
  • docker run -v [外部位置]:[Container內部位址]: 利用外部位置來取代Container內部的位置,可以為資料夾或是檔案。正常會使用在Database的container,避免刪除container後,資料消失。應該也可以用來log,將各容器輸出的log都放在同一個外部資料夾,方便查看。或是外部想要複寫container內部程式的設定,也可以指定外部設定檔取代容器內部的設定檔。
  • Docker volume: 跟上一個幾乎是同一個作用,差別在於是使用docker建立起外部位址,相較於直接指定主機上儲存位址的作法,Docker volume較沒有權限的問題。
    用法是
    docker volume create [data volume名稱]
    docker -run -v [data volume名稱]:[Container內部位址]

自製image

現在程式寫好了,要怎麼包裝image呢

  • 一種是在runtime container加入編譯好的dll或檔案,然後然後利用docker commit做成新的image
  • 另一種是在專案裡面設置好dockerfile,藉由docker build來產生image

建議使用第二種方式,不論是自動化的程度跟要share的話都是較好的選擇。

給docker build的設定檔:Dockerfile

docke build在開始執行的時候會找到當前目錄下的Dockerfile,然後按照Dockerfile執行, 本質上Dockerfile類似script或是bat檔,我們可以在裡面做一些copy, log...的動作

https://docs.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images
以官網的範例來看一下Dockerfile

FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

首先這段code可以分成兩段(文件裡面是寫build stage),以From為起頭
第一段是build-env,回復專案的package,編譯後發行。
第二段是沒有as的From,將前一段build-env的內容copy到runtime的image下,在build成新的image

在這個Dockerfile裡面使用的指令

Docker指令

  • From [image名稱:tag] as 別名: 指定要用哪個image做後續的動作
  • WORKDIR /工作名錄名稱 當前的工作目錄名稱,若是不存在則會新建該目錄,需要注意的是copy跟run的指令都是以WORKDIR為當前目錄下去跑的,運用的時候需要注意相對位置。
  • COPY [外部資料位置] [Container內部的資料位置] : 把檔案copy進去image/container
  • RUN: 執行指令,每一次的run都會產生暫時的image檔
  • COPY --from=[前面執行過的image別名] [現在這個image的資料位置]將[image別名]產生的資料copy到現在image中的指定位置
  • ENTRYPOINT ["要執行的指令", "選項1","選項2".....]

Dotnet指令

  • dotnet restore: 下載nuget package
  • dotnet publish -c [組態: debug 或release] -o [輸出的目錄名稱]: 將程式碼編譯後發行成dll
  • dotnet "dll'檔名": 執行dll

dockerfile執行起來的生命週期

可以注意一下下圖編譯中途失敗的結果
會有 images殘留,另外值得注意的是每個Run會啟動一個container然後產生一個image,但是在每個from階段最終只會產生一個暫時的image。

https://ithelp.ithome.com.tw/upload/images/20180116/2010786728fbVrzJ8q.png

如果撰寫dockerfile失敗可以朝workdir的相對路徑跟dockerfile的生命週期下去思考。


上一篇
Day 27: 微服務的封裝 Docker -- 基本操作
下一篇
Day 29: 微服務的封裝 Docker -- 容器們的啟動與互動docker-compose
系列文
.Net微服務輕旅行30天30

尚未有邦友留言

立即登入留言