1. 程式人生 > >Docker結合.Net Core初步使用

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直接訪問我本機容器內的介面了,方便了大家除錯呼叫。

 以上學習內容有不足的地方,歡迎大家多多交流。<