docker構建.net core運行的鏡像


  在docker很火的今天,越來越多的應用現在都在往docker上遷移,.net core怎么能落后?

  項目要運行在docker上,我們需要先制作鏡像,可以基於centos來制作,當然也可以基於Ubuntu,這里以centos為例。

  首先,拉取centos的鏡像:  

    sudo docker pull centos
   #如果是Ubuntu,則拉取ubuntu的鏡像
   sudo docker pull ubuntu

  接着下載.net core的SDK,或者是.net core的runtime包,地址:https://dotnet.microsoft.com/download/dotnet-core,這里我選擇的.net core 3.1的SDK。

  新建一個目錄,比如叫dotnetcore,將SDK放在這個目錄下,然后復制你本機的 /usr/share/zoneinfo/Asia/Shanghai 文件到dotnetcore目錄(也可以是 /usr/share/zoneinfo/Asia/Chongqing ),然后創建一個名稱是Dockerfile的文件,目錄展示如下:

  

   說明一下,Shanghai這個文件一個時區標識,無論是centos還是ubuntu,默認采用的都是UTC時間,而在國內我們習慣於用北京時間

   Dockerfile是鏡像的構建說明文件,注意,默認文件名就是Dockerfile,大小寫要一致,如果不是這個文件名,那么在docker build時需要使用 -f 參數指定的構建文件

   Dockerfile的內容如下:  

  FROM centos:latest

  WORKDIR .

  ADD dotnet-sdk-3.1.302-linux-x64.tar.gz /opt
  COPY Shanghai /usr/share/zoneinfo/Asia/Shanghai

  RUN ln -s /opt/dotnet /usr/local/bin/dotnet && \
      rm -f /etc/localtime && \
      ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
      yum update -y && \
      yum install epel-release -y && \
      yum update -y && \
      yum install libgdiplus-devel -y && \
      yum install glibc -y && \
      yum install curl -y && \
      yum install icu -y

  ARG user=root
  USER $user

  CMD [ "/bin/bash" ]

  如果采用的是其他的dotnet的SDK或runtime包,這需要將上面的ADD部分改成對應的包就可以了

  RUN命令執行創建了一些軟連接以及修改時區配置,同時安裝了一些常用的依賴包(其中 libgdiplus-devel是.net core 繪圖所需的依賴包),如果還有其它依賴包,可以參照上面的例子添加。

  盡量不要安裝沒用的包,避免生成的鏡像過大,最好是根據自己的項目去定制

    開始構建  

  sudo docker build -t dotnetcore:v3.1 .

  注意,這個命令是在Dockerfile文件所在目錄下執行的,如果構建說明文件名不是Dockerfile,需要使用 -f 參數進行執行。-t 參數指定生成鏡像的名稱及版本,兩者使用冒號(:)隔開,這里是 dotnetcore:v3.1

  另外,命令最后面有一個點號, 它是構建執行的上下文路徑,docker build時會將這個路徑所有內容打包,上面的Dockerfile中的ADD和COPY命令相對的目錄也就是這個上下文目錄。

    執行后稍等片刻,輸出類似下面的內容則表示已經構建成功了

  

    現在可以使用下面的命令查看生成的鏡像:  

    sudo docker images

  使用鏡像運行一個.net core應用

   創建一個.net core應用,比如我創建一個叫DemoApi的webapi應用,然后publish得到發布后的文件,放到一個demo目錄下:

  

    執行下面的命令即可創建一個容器了  

    sudo docker run -d -w /publish -v /home/feng/temp/demo/publish:/publish --expose 5000 -p 5000:5000 dotnetcore:v3.1 dotnet DemoApi.dll --urls http://*:5000

  說明:

  docker run:使用指定的鏡像創建一個容器,然后啟動容器,等於docker create + docker start

  -d:在后台啟動容器

  -w:容器的工作目錄,容器啟動會,會切換到這個目錄下

  -v:數據卷,可以理解為容器路徑與主機路徑的一個映射,比如上面的命令中,將主機的 /home/feng/temp/demo/publish 與容器的 /publish 路徑建立映射,那么進入容器的 /publish 路徑就可以看到主機 /home/feng/temp/demo/publish 下的文件了

  --expose:容器對外(主機或者其他容器)暴露的端口,一般就是應用的所綁定的端口

  -p:端口綁定,將容器的端口與主機的端口做一個綁定,如果訪問主機的這個端口會被轉發到容器的對應端口,格式:主機端口:容器端口

  dotnetcore:v3.1:所使用的的鏡像及版本

  dotnet DemoApi.dll --urls http://*:5000:應用啟動命令

  上面的命令執行后,使用下面的命令可以查看命令是否啟動:  

    sudo docker ps -a

  

     其中STATUS下面的UP就表示已經啟動了,如果是Exited,表示容器掛了。

   容器運行起來了,訪問主機的5000端口,就會被轉發到容器的5000端口去了。

   比如我的linux主機IP是:192.168.209.132,而我的DemoApi項目有個/Home地址的路由,於是我訪問http://192.168.209.132:5000/Home 就可以了

  構建應用鏡像

  雖然上面我們已經使用自己構造的.net core的鏡像將項目運行起來了,它使用了數據卷將容器路徑與主機路徑耦合起來了,這對容器遷移其它主機造成了不利。

  我們可以將應用所需的所有文件打包到鏡像中,構建一個應用程序的鏡像,這樣容器就與主機徹底沒有耦合了。

  上面的例子中,我們將DemoApi的發布文件放在demo目錄下,然后我們在demo目錄下執行打包  

    tar -cf publish.tar publish
   #tar包生成之后,可以執行 rm -rm publish/ 刪除原來的文件目錄

  執行完成之后會生成一個tar包,然后同樣的創建一個Dockerfile文件,內容如下:  

  FROM dotnetcore:v3.1

  ADD publish.tar /app/

  EXPOSE 5000

  HEALTHCHECK --interval=5m --timeout=3s --retries=3 \
      CMD curl -f http:/localhost:5000/Home || exit 1

  WORKDIR /app/publish

  CMD [ "dotnet", "DemoApi.dll", "--urls", "http://*:5000" ]

  其中HEALTHCHECK是健康檢查,會定時的去執行CMD后的命令,具體效果可以看后面的截圖

  最后結構如下:

  

    執行下面的命令構建應用鏡像:  

    sudo docker build -t demo:v1 .

  注意,上面的命令后面有一個點號,它是上下文路徑,點號表示當前目錄

  當提示類似下面的內容,表示構建成功了

  

  可以執行 下面的命令查看生成的鏡像:  

    sudo docker images

  

   運行鏡像只需執行下面的命令即可:  

    sudo docker run -d -p 5000:5000 demo:v1

  這就比上面的例子啟動簡單多了,而且,我們只需要將這個鏡像push & pull,在任何一個安裝有docker的主機上都可以運行了

  

    提示,上圖的STATUS欄下面有個(health: starting)的顯示,這是因為我們的Dockerfile中添加了HEALTHCHECK,它是健康檢查的意思,它的CMD命令是訪問本地的一個url,容器會定時去訪問這個地址,如果這個url不可訪問,就會顯示(unhealthy)

  其實,上面的Dockerfile類似於執行下面的命令啟動容器:

    sudo docker run -id -w /publish -v /home/feng/temp/demo/publish:/publish --expose 5000 -p 5000:5000 \
--health-cmd "curl -f http:/localhost:5000/Home || exit 1" --health-interval 5m --health-retries 3 --health-timeout 3s \
dotnetcore:v1 dotnet DemoApi.dll --urls http://*:5000

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM