Docker的使用初探(二):Docker與.NET Core的結合
目錄
Docker的使用初探(二):Docker與.NET Core的結合
在二者的結合上,微軟官方給予了很大的支援,從官方釋出的一些文章和VS 2017在建立.NET Core專案時自帶的Docker選項都可以看出來,這也與Core的跨平臺特性有很大的關係,而Docker正是可以選擇以Linux或Windows環境部署
新增Dockefile
上一篇文章介紹瞭如何拉取Core的官方映象,但是我們終究要將Docker應用到我們的開發環境中,如何將我們自己的專案生成為映象並部署到Docker上呢?第一步就新增Dockerfile這個檔案,在VS2017中大致是三種方法,它們稍有區別,但最終也都是建立了一個Dockerfile檔案
1. 在建立專案時新增
在新建Core專案時,勾選“啟用Docker支援”選項,新建的專案會自動新增dockerfile檔案,檔案的具體內容在下文進行分析
2. 手動新增
已經在使用的專案可以通過“右鍵-新增-Docker支援”,這樣也可以新建Dockerfile檔案
3. 容器業務流程協調控制程式支援
這種方法相對於前兩種比較特殊,它不再是單單增加一個Dockerfile檔案,而是如名稱一般是一整條生產鏈,用於配合持續整合工具的開發-除錯-生成-釋出一條龍服務。新增的方式與第二種相同,右鍵專案新增就能看到這個拗口的名字
使用這種方式除了生成Dockerfile檔案還會在解決方案中新增一個名為Docker Compose的業務流程協調程式,在新建時可以選擇,但是預設自帶的只有這個。裡面包含兩個檔案,一個是 .dockerignore
這個和git類似,裡面記錄的檔案不會被打包成映象釋出,另一個是 docker-compose.yml
,用於配置這個業務流程的資訊,如映象名稱和Dockerfile檔案的路徑等
Dockefile語法
大概是有以下這些,挑幾個用到的說一下
FROM
MAINTAINER
RUN
CMD
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
VOLUME
USER
WORKDIR
ONBUILD
FROM
FROM <image>
說明使用的映象,如果本地沒有會自動拉取對應名稱的映象,沒有指定標籤的情況預設就是latest
FORM
指令是Dockerfile檔案的第一行,但可以不唯一,根據需要可以有多個
以預設的Core專案為例,這裡拉取的就是Core的官方映象,上篇文章也有用到,分別是執行時和SDK
WORKDIR
WORKDIR <工作目錄路徑>
顯而易見就是映象被安裝的路徑,如果路徑不存在,Docker會自動建立
COPY
COPY <源路徑> <目標路徑>
將檔案和目錄複製到容器的檔案系統。檔案和目錄需位於相對於 Dockerfile 的路徑中。
RUN
RUN <Shell/exec>
在當前映象上要執行的命令,可以使用shell或者exec的格式
EXPOSE
EXPOSE <埠>
服務端容器對外對映的本地埠
ENTRYPOINT
使用格式 RUN
一樣,但是這個命令是在容器啟動後執行的命令,不會被 RUN
命令覆蓋,一個Dockerfile裡面只能有一個,如果有多個則只執行最後一條
其餘的指令還沒怎麼用到,用法還不太清楚
Docker專案除錯
我們在前面提到了三種建立Dockerfile檔案的方法,實際上是兩種情況,針對這兩種情況,打包映象的方法也不同
僅新增檔案的方式
使用 docker build -t <name> <path>
指令。這種情況更加泛用,無論是不是用VS建立的都可以使用這種指令打包映象
進入Dockerfile檔案所在的路徑後執行命令即可
為了演示,我先刪除的core的官方sdk,由於在Dockerfile裡面我們寫入了使用了 FROM
命令,所以執行命令後我們發現Docker自動下載了映象,並且打包了我們的專案,但是最後有一句 image operating system "windows" cannot be used on this platform ,因為我這邊Docker使用的是Linux模式,這裡我們構建的是Windows的容器映象,所以需要切換一下,系統右下角托盤圖示右鍵“switch to ...”,
為了體現Dockerfile指令的效果,我們刪除之前建立的映象再執行一次Build指令,這次Docker沒有下載Core的sdk,因為之前已經下載過了。不過我在這裡遇到了網路問題,發現之前的映象拉取也失敗了,所以換了一個映象加速地址,然後簡化了一下dockerfile檔案,然後重複上面的操作就行了
FROM microsoft/dotnet:2.1-aspnetcore-runtime
WORKDIR /app
COPY . .
EXPOSE 80
ENTRYPOINT ["dotnet", "CoreDockerDemo1.dll"]
可以看到dockerfile裡面的指令被依次執行,完成之後我們使用 docker image ls
就可以看到我們構建的映象了,之後用上面的方法可以建立Docker即可
容器業務流程協調控制程式支援
使用這種方式就不需要自己手動構建了,只要在VS裡的除錯按鈕點一下即可。由於我們前面新增過這套協調控制程式,所以現在這個專案裡可以直接選擇docker進行除錯
在這之前要對 docker-compose.yml
檔案進行配置,基本上與dockerfile類似,而且更加直觀,對應輸入名稱等就好了
我在第一次生成時出現了“未啟用卷共享”的錯誤,這裡我們需要在Docker的設定中的Shared Drives標籤中把程式生成構建的磁碟選中,然後點選“Apply”按鈕應用設定,然後docker會自動重啟
設定完成後再點選VS中的執行,web應用就會自動編譯生成並建立映象和容器,然後啟動網站。第一次啟動時可能會詢問是否授權SSL證書,進行授權即可
基本上有了這些,就可以利用Docker給開發工作帶來一些便捷,如果後面還要繼續深入的話,就是將Docker與持續整合結合起來應用到網站伺服器環境上