1. 程式人生 > >.NET Core中使用Docker

.NET Core中使用Docker

配置 平臺 too ade docker鏡像 access pull pan name

原文:.NET Core中使用Docker

一、Docker簡介

Docker是基於Linux容器技術(LXC),使用Go語言實現的開源項目,誕生於2013年,遵循Apache2.0協議。Docker自開源後,受到廣泛的關註和討論。

Docker在開發和運維中的優勢:

(1)更快的交付和部署。

使用Docker,開發人員可以使用鏡像來快速構建一套標準的開發環境,開發完後,測試和運維人員可以直接使用完全相同的環境來部署代碼,實現了生產環境的無縫運行。

(2)更高效的資源利用。

Docker容器的運行不需要額外的虛擬化管理程序支持,它是內核級的虛擬化 ,可以實現更高的性能,同時對資源的額外需求很低。

(3)更輕松的遷移和擴展。

Docker容器幾乎可以在任意的平臺上運行,支持主流的操作系統發行版本。這種兼容性讓用戶可以在不同平臺之間輕松地遷移應用。

(4)更簡單的更新管理。

使用Dockerfile,只需要修改一點點配置,就可以替代以往大量的更新工作。並且所有的修改都以增量的方式被分布和更新,從而實現自動化且高效的容器管理。

首先需要知道以下幾個概念:

(1)Docker鏡像

Docker鏡像類似於虛擬機鏡像,可以將它理解為一個只讀的模板。鏡像是創建Docker容器的基礎。通過版本管理和增量的文件系統,Docker提供了一套十分簡單的機制和創建和更新現有的鏡像,用戶可以直接從網上下載一個已經做好的應用鏡像,並直接使用。

(2)Docker容器

Docker容器類似於一個輕量級的沙箱,Docker利用容器來運行和隔離應用。容器是從鏡像創建的應用運行實例。可以將其啟動、開始、停止、刪除,而這些容器都是彼此相互隔離的,互不可見的。

可以把容器看做一個簡易版的Linux系統環境(包括root用戶權限、進程空間、用戶空間和網絡空間)以及運行在其中的應用程序打包而成的盒子。

(3)Docker倉庫

Docker倉庫類似於代碼倉庫,它是Docker集中存放鏡像文件的場所。它的設計理念與Git類似。Docker鏡像庫分公開倉庫和私有倉庫。最大的公開倉庫是官方提供的Docker Hub。當然,如果不想公開鏡像,可以搭建自己的私有倉庫。

(4)Dockerfile

一般介紹完以上三個概念就結束了,但我在這裏要介紹下Dockerfile,因為鏡像的好壞很大程度取決於Dockerfile。Dockerfile是一個文本格式的配置文件,用戶可以使用Dockerfile來快速創建自定義的鏡像。


二、介紹Visual Studio Tools for Docker使用

安裝Docker for Windows,系統需求:Windows 10 64bit: Pro, Enterprise or Education

Visual Studio2017 v15.6或以上

(1)新建一個Web API程序

技術分享圖片

(2)添加Docker支持

右鍵項目->添加->Docker支持

技術分享圖片

選擇Linux目標操作系統(Windows目標平臺的鏡像只能在Windows平臺運行,而Linux目標平臺的鏡像既能在Linux平臺下運行,也能在新版Win10下運行,因為新版Win10帶Linux系統)

技術分享圖片

之後VS會自動生成一個Dockerfile文件,暫先不討論它的優劣。

技術分享圖片

(3)添加容器程序支持

右鍵項目->添加->容器業務流程協調程序支持

技術分享圖片

Visual Studio Tools for Docker 通過以下文件向解決方案添加 docker-compose 項目:

.dockerignore列出在生成上下文時要排除的文件和目錄類型。

docker-compose.yml基本 Docker Compose 文件,用於分別定義通過 docker-compose build 和 docker-compose run 生成和運行的映像集合。

docker compose.override.yml一個可選文件,通過 Docker Compose 讀取,包含服務的配置替代。 Visual Studio 執行 docker-compose -f "docker-compose.yml" -f "docker-compose.override.yml" 以合並這些文件。

可以看到輸出,在Debug模式下,Visual Studio Tools for Docker已經幫我們新建鏡像myapi:dev,dev是鏡像的標簽。而在Release模式下運行,會生成myapi:latest鏡像。

技術分享圖片

在命令行中輸入:docker images

可以看大此鏡像。TAG是鏡像的標簽,IMAGE ID是鏡像的唯一標識,CREATED是鏡像創建時間,SIZE為鏡像大小,優秀的鏡像往往體積都較小。

技術分享圖片

(4)在Debug模式下運行程序,成功返回["value1","value2"]

我們來看它的容器,輸入指令:docker ps -a

技術分享圖片

可以看到容器狀態STATUS為UP,已經啟動了12分鐘。狀態為Exited為停止狀態。

(5)然後換成Release模式,重新生成項目,成功生成myapi:latest鏡像。

技術分享圖片

這步操作可以改成cmd進入Dockerfile所在目錄,輸入指令:docker-compose build

然後輸入指令:docker run -it -p 52333:80 myapi:latest

-i:保持標準輸入打開,默認為false

-t:是否分配虛擬終端,默認為false

-p:映射到本地主機的臨時端口

技術分享圖片

成功運行鏡像,瀏覽器打開:http://localhost:52333/api/values

可獲得返回值,可以看出,新版Win10是可以運行目標平臺為Linux的鏡像。


三、把鏡像推送到Docker Hub上

首先需要註冊Docker Hub賬號,我註冊時候是有坑的,註冊系統需要做人機檢測,需要FQ才能完成。官網地址:https://hub.docker.com/

(1)先把鏡像打上標簽

輸入:docker tag ed159c1011fd zhubingjian/myapi:1.0.0

其中ed159c1011fd為myapi:latest的IMAGE ID。

可以看到,多了一個zhubingjian/myapi:1.0.0鏡像,它的IMAGE ID和myapi:latest的相同。

技術分享圖片

(2)推送鏡像到Docker Hub

輸入指令:docker login

一般需要輸入賬號和密碼,由於我的Docker是登錄狀態,所以不用輸入

技術分享圖片

輸入指令:docker push zhubingjian/myapi:1.0.0

技術分享圖片

然後登錄自己的Docker Hub,查看網站上的鏡像。

技術分享圖片

(3)打開Ubuntu,獲取鏡像並運行。

輸入指令:docker pull zhubingjian/myapi:1.0.0

這個鏡像是公開的,其他人也可按這個方式獲取

技術分享圖片

輸入指令,運行鏡像:docker run –it –p 52998:80 zhubingjian/myapi:1.0.0

技術分享圖片

新開一個終端,輸入指令,測試獲取返回值:curl http://localhost:52998/api/values

技術分享圖片


四、Nginx配置反向代理

最後在Nginx的配置文件中加一段配置,註意端口52998要對應上一步的

server {
        listen        52999;
        server_name   服務器IP;            
      #  access_log    /var/log/nginx/rap_access.log;
      #  charset           utf-8;
      #  autoindex off;

        location /{
            proxy_pass   http://localhost:52998;

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }
}

在本地的瀏覽器訪問:http://localhost:52999/api/values

就可以獲取返回值了。

換成Release 模式後重新生成鏡像遇到的問題:

技術分享圖片

1.重啟Docker

2.網絡問題

.NET Core中使用Docker