Docker結合.Net Core初步使用
Docker是一項比較流行的容器化技術,可以讓開發者將應用以及應用依賴的環境,依賴包一起打包到容器中,然後部署容器到生產環境就可以了,解決了應用程式部署到不同伺服器環境帶來的問題(很多開發人員都遇到過應用程式在自己本地伺服器跑的好好的,部署到生產環境就執行不起來,各種奇葩的異常),實現了“一次構建,處處執行”。
官方為我們提供了針對不同系統的Docker版本,今天我們基於windows系統簡單介紹下如何使用。
Windows部署Docker
目前官方釋出的Docker桌面版,僅支援Windows 10 64-bit: Pro, Enterprise(企業版), Education(教育版),其他windows作業系統版本使用Docker需藉助官方釋出的Docker ToolBox工具。
1.首先,我們到Git上下載Docker ToolBox(https://github.com/docker/toolbox/releases)
注意點:1)需要windows 7及以上的64位作業系統
2)系統上的虛擬化(Hyper-V )功能啟用
2.下載完成之後,直接雙擊啟動DockerToolbox-19.03.1.exe 安裝程式。按著指示往下執行即可
3.安裝成功之後,桌面上會出現如下三個圖示:
- 1)Docker QuickStart shell - 這是一個已經配置好Docker的命令列環境,啟動docker。
- 2)Oracle VM Virtualbox - 虛擬機器,windows系統模擬了一個linux虛擬環境
- 3)Kitematic - 這是 Docker 的 GUI 版本,相較於以前的敲命令列,操作簡單了。
4.啟動docker
雙擊桌面上的Docker QuickStart shell的快捷方式,程式視窗顯示出“鯨魚”就表示啟動成功了。
這裡我們會看到啟動成功後,提供給我們一個IP地址:192.168.99.100。大家這裡需要注意,後面我會具體描述下。
Docker基礎使用
1.Image檔案
Docker容器將應用程式及其依賴,打包到image檔案中。然後,通過image檔案來生成Docker容器,image檔案可以當做是容器的模板,一個image檔案可以生成多個同時執行容器。
image操作:
1.列出所有image $ docker image ls
2.從倉庫拉取可用的image $ docker image pull (image檔案地址)
3.image檔案刪除 $ docker image rmi (image檔案ID)
我們可以自己製作image檔案,也可以直接從倉庫拉取別人上傳的image檔案。Docker Hub為我們提供了image檔案的上傳和下載,實現了檔案的共用。
2.容器Container
前面我們提到Docker容器是依靠image檔案生成的,但是Docker容器生成後確是區別於image檔案存在的。需要通過關鍵字“container”對容器進行操作。
# 列出正在執行的容器 $ docker container ls # 列出所有容器,包括終止執行的容器 $ docker container ls --all #終止容器執行 $ docker container kill (容器ID) #刪除容器 $ docker container rm (容器ID)
這裡我們需要注意下,在刪除image檔案時如果存在依賴image檔案生成的容器,我們需先刪除容器才能刪除image檔案。
3.Dockerfile檔案
前面我們介紹了image檔案和容器檔案,那麼image檔案和容器具體是怎麼生成的呢?實際專案中,image檔案的生成需要依賴dockerfilew檔案(一個不帶字尾的文字檔案),大家可以把dockerfile理解成是生成image檔案的一個配置檔案,我們這裡簡單介紹幾個常用的配置節點:
1)FROM:配置一個基礎映象,也就是後面你要生成的映象是基於此基礎來的。
2)WORKDIR:指定image檔案的工作目錄
3)COPY:格式:copy [源地址] [目標地址],將源地址檔案拷貝到image檔案中的目標地址。
4)EXPOSE:暴露出容器對外的埠
5)ENTRYPOINT:容器執行後預設執行的cmd命令。
樣例:
FROM microsoft/dotnet:2.2-aspnetcore-runtime WORKDIR /app #指定工作目錄為/app COPY . . #.表示當前目錄 將當前命令列執行程式所在目錄檔案都拷貝到image檔案的當前工作目錄下 EXPOSE 7000 #容器對外暴露7000埠 ENTRYPOINT ["dotnet", "NetCoreSqlSugar.dll"] #容器生成後,預設執行cmd命令:dotnet NetCoreSqlSugar.dll
4.生成image檔案和容器
有了dockerfile檔案之後,我們就可以通過如下cmd命令生成image檔案和容器。
1)首先cmd定位到dockerfile所在檔案目錄。
2)生成image檔案
$ docker image build -t myimage .
- -t 引數:指定image檔名稱。
- myimage是檔名稱。
- "."最後還有個符號,千萬不要忘記,這裡表示的是dockerfile檔案的路徑。
生成成功之後,我們通過命令 docker image ls 可以看到image檔案已存在了。
3)生成容器
$ docker container run -p 8001:7000 -it -d myimage
-p
引數:容器的 7000 埠對映到宿主機的 8001 埠。-it
引數:容器的 Shell 對映到當前的 Shell,然後你在本機視窗輸入的命令,就會傳入容器。myimage
:image 檔案的名字(如果有標籤,還需要提供標籤,預設是 latest 標籤)。-d引數
:容器啟動後,後臺執行。
容器生成之後,我們通過命令 docker container ls 可以看到正在執行的容器。
.NetCore WebApi部署docker
好了,前面我們簡單了介紹了一些Docker的一些簡單入門,下面我們結合.netcore webapi應用程式具體給大家說一說實際專案中如何使用Docker。
1.新建一個.NetCore WebApi專案,並啟用docker支援。
如果建立的專案忘記啟用docker,也不用擔心,我們可以右鍵專案,新增-->docker支援。
2.修改dockerfile檔案,如下:
FROM microsoft/dotnet:2.2-aspnetcore-runtime WORKDIR /app COPY . . EXPOSE 7000 ENTRYPOINT ["dotnet", "NetCoreSqlSugar.dll"]
dockerfile檔案右鍵--屬性,選擇始終複製,可以直接釋出到目錄。
3.修改應用程式埠號(Program.cs檔案)
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseUrls("http://*:7000") .UseStartup<Startup>();
我這裡用了最簡單的方式UseUrls方法定義了埠號,實際專案中並不推薦大家這麼使用。偷懶了。。。哈哈
4.釋出專案
釋出應用程式到執行目錄,我們會發現釋出目錄多了一個dockerfile檔案。
5.生成image檔案和容器
#生成image檔案 $ docker image build -t myimage . #建立容器並執行 $ docker container run -p 8001:7000 -it -d myimage
到了這裡,基本上我們任務都完成了。但是使用windows的同學會發現當我們使用http://localhost:8001/api/Values訪問API應用程式模板介面時,並不可行,那麼問題來了???
這裡我們回到docker啟動,docker啟動成功之後會提供我們一個IP地址:192.168.99.100。那麼這個IP到底是幹什麼用的呢?
我們知道Docker是執行在Linux上的,在Windows中執行docker,實際上還是在Windows下先安裝了一個Linux虛擬環境,然後再執行的docker。也就是說,應用程式中使用的localhost指的是這個Linux環境的地址,而不是我們的宿主環境Windows。這下大家也就恍然大悟了。我們在瀏覽器輸入:http://192.168.99.100:8001/api/Values 果然可以正常訪問。
Nginx實現區域網訪問
上面我們在本地雖然可以通過192.168.99.100這個IP訪問容器中的API介面,但是並不能被其他同事訪問。前端時間剛好接觸了Nginx,於是,這裡果斷搬了出來,通過Nginx的“反向代理”來解決這個問題。至於為什麼選擇這種方式,其實也是自己想重溫下Nginx的使用,小小自私一下。。。關於Nginx的使用我這裡就不贅述了,感興趣的同學可以去了解下。
Nginx配置
upstream serlist{ server 192.168.99.100:8001;#實際請求地址 } server { listen 8001; server_name 192.168.60.4;#本機地址 #charset koi8-r; #access_log logs/host.access.log main; location ~ { proxy_pass http://serlist; proxy_connect_timeout 10; #連線超時 預設為60秒 proxy_send_timeout 10; #讀取超時 預設為60秒 proxy_read_timeout 10; #傳送超時 預設為60秒 } }
有了如上配置之後,區域網內的同事就可以通過我Windows下的本機地址192.168.60.4:8001直接訪問我本機容器內的介面了,方便了大家除錯呼叫。
以上學習內容有不足的地方,歡迎大家多多交流。<