1. 程式人生 > >.NETCore Docker實現容器化與私有映象倉庫管理

.NETCore Docker實現容器化與私有映象倉庫管理

一、Docker介紹



Docker是用Go語言編寫基於Linux作業系統的一些特性開發的,其提供了作業系統級別的抽象,是一種容器管理技術,它隔離了應用程式對基礎架構(作業系統等)的依賴。相較於虛擬機器而言,Docker共享的是宿主機的硬體資源,使用容器來提供獨立的執行環境來執行應用。虛擬機器則是基於Supervisor(虛擬機器管理程式)使用虛擬化技術來提供隔離的虛擬機器,在虛擬機器的作業系統上提供執行環境!雖然兩者都提供了很好的資源隔離,但很明顯Docker的虛擬化開銷更低!

Docker涉及了三個核心概念:Register、Image、Container。

1. Registry:倉庫。用來儲存Docker映象,比如Docker官方的Docker Hub就是一個公開的倉庫,在上面我們可以下載我們需要的映象。


2. Image:映象。開發人員建立一個應用程式或服務,並將它及其依賴關係打包到一個容器映象中。映象是應用程式的配置及其依賴關係的靜態形式。

3. Container:容器。Container是映象的執行例項,它是一個隔離的、資源受控的可移植的執行時環境,其中包含作業系統、需要執行的程式、執行程式的相關依賴、環境變數等。

它們三者的相互作用關係是:

當我們執行Docker pull或Docker run命令時,若本地無所需的映象,那麼將會從倉庫(一般為DockerHub)下載(pull)一個映象。Docker執行run方法得到一個容器,使用者在容器裡執行各種操作。Docker執行commit方法將一個容器轉化為映象。Docker利用login、push等命令將本地映象推送(push)到倉庫。其他機器或伺服器上就可以使用該映象去生成容器,進而執行相應的應用程式。


二、Docker安裝



1、使用yum源安裝, 由於國內訪問官方源慢,此處新增阿里的源

    > wget -P /etc/yum.repos.d/  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    > yum install -y docker-ce


2、啟動Docker

    //啟動 Docker CE
    > systemctl start docker
    > systemctl enable docker
    //檢視Docker狀態
    > systemctl status docker
    //檢視docker版本
    > docker -v


3、測試Docker是否正確安裝,執行命令:

> docker run hello-world


a、當執行 docker run hello-world 時,docker首先會從本地找 hello-world 的映象,如果本地沒有,它將會從預設的映象倉庫Docker Hub上拉取映象。映象拉取到本地後,就例項化映象得到容器,輸出Hello from Docker!。

b、Docker Engine提供了Docker的核心技術: 影象(images)和容器(containers). 在安裝教程的最後一步, 你運行了Engine命令docker run hello-world. 這一個命令,使Engine完成了Docker的核心任務, 該命令包含了三部分.


c、一個容器是一個精簡版的Linux作業系統, 一個映象是載入到這個容器的軟體, 當你執行這個命令後, Engine會做下面的事情:

    1.檢查是否存在hello-world這個軟體映象

    2.從Docker Hub下載映象(稍後瞭解Docker Hub)

    3.載入這個映象到容器中, 並執行它

三、.Netcore專案在Docker中執行



1、拉取microsoft/dotnet映象,等幾分鐘後即可安裝完畢,執行docker images可以看到本地已經包含microsoft/dotnet映象

> docker pull microsoft/dotnet


2、執行microsoft/dotnet映象, 使用docker run <image>可以啟動映象,通過指定引數-it以互動模式(進入容器內部)啟動。依次執行以下命令:

    > docker run -it microsoft/dotnet    //啟動一個dotnet映象
    > dotnet new mvc -n mvctest    //建立專案名為mvctest的.NET Core MVC專案
    > cd mvctest    //進入mvctest資料夾
    > dotnet run    //啟動.NET Core MVC專案


執行結果如下圖所示:


鍵盤按住Ctrl+C即可關閉應用,輸入exit即可退出當前容器

以上簡單的幾步就完成了一個.NET Core MVC專案的建立和執行,這個時候你可能會好奇,Linux宿主機上並沒有安裝.NET Core SDK啊,MVC專案是如何建立的呢?這就是Docker神奇的地方,我們從映象倉庫中拉取的dotnet映象,包含了建立、構建、執行.NET Core專案所需的一切依賴和執行時環境。

退出容器之後,執行find -name mvctest(查詢mvctest檔案),我們發現並沒有找到。這說明我們剛才建立的.NET Core MVC專案是在容器內部建立的,是與宿主機完全隔離的。這個時候你可能會想,每次都要在容器中安裝原始碼太不方便了,我們能不能讓容器執行我們宿主機的原始碼專案?嗯,這是個好問題。當然是可以實現的,下面我們就來解答這個問題。

 
四、 宿主機上建立.NET Core 專案



為了在宿主機上建立.NET Core 專案,這個時候我們就需要在Linux宿主機上安裝.NET Core SDK

1、宿主機安裝.NET Core SDK

新增yum源:sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm

開始安裝:yum install -y dotnet-sdk-2.1

檢測安裝版本,如下圖表示安裝正確


2、建立.NET Core專案

    > mkdir data
    > cd data
    > dotnet new mvc -n mvctest    //建立專案名為mvctest的.NET Core MVC專案
    > cd mvctest    //進入mvctest資料夾
    > dotnet run    //啟動.NET Core MVC專案


注:在Program.cs檔案中加入程式碼.UseUrls("http://*:5000"),在瀏覽器中訪問如下圖:


下一步我們就將該目錄下的原始碼專案通過掛載的方式共享到容器中去

 
3、掛載宿主機專案到容器中


在啟動Docker映象時,Docker允許我們通過使用-v引數掛載宿主機的檔案到容器的指定目錄下。換句話說,就相當於宿主機共享指定檔案供容器去訪問

    // 命令中的`\`結合`Enter`鍵構成換行符,允許我們換行輸入一個長命令。
    > docker run -it \
    > -v /data/mvctest/:/app \
    > microsoft/dotnet:latest


上面的命令就是把/data/mvctest/資料夾下的檔案掛載到容器的\app目錄下


從上面的執行結果來看,容器內部中的app目錄下包含了宿主機上的原始碼專案。

上面說到是以共享的形式,而不是容器擁有一份宿主機目錄的拷貝,意味著,在宿主機上對目錄的更改,會即時反應到容器中。但反過來,容器中對共享目錄的更改,不會反應到宿主機上,不然就打破了容器具有的隔離特性。

通過這樣一個簡單場景,聰明的你是否會聯想到這一場景在我們日常編碼的應用之處呢?是的,我們可以用來持續構建(CI)。基本思路是,通過git clone原始碼到宿主機上,然後將原始碼目錄掛載到容器中去進行構建

 
4、藉助Dockerfile檔案

下篇我們升級此操作,不需Dockerfile的依賴,操作一條命令搞定。

Dockerfile用來定義你將要在容器中執行的系列操作。我們來建立第一個Dockerfile

    > cd /data/mvctest/    //確保進入我們建立的MVC專案目錄中去
    > touch Dockerfile    //使用touch命令建立Dockerfile
    > vi Dockerfile    //使用vi命令編輯Dockerfile


進入VI編輯介面後,複製以下程式碼,使用shift + Ins命令即可貼上。然後按ESE退出編輯模式,按shift + :,輸入wq即可儲存並退出編輯介面

    FROM microsoft/dotnet:latest
    WORKDIR /app
    COPY .  /app
    RUN dotnet restore
    EXPOSE 5000
    ENV ASPNETCORE_URLS http://*:5000
    ENTRYPOINT ["dotnet","run"]


上面的命令我依次解釋一下:

    使用FROM指定容器使用的映象

    使用WORKDIR指定工作目錄

    使用COPY指令,複製當前目錄(其中.即代表當前目錄)到容器中的/app目錄下

    使用RUN命令指定容器中執行的命令

    使用EXPOSE指定容器暴露的埠號

    使用ENV指定環境引數,上面用來告訴.NETCore專案在所有網路介面上監聽5000埠

    使用ENTRYPOINT制定容器的入口點

Dockerfile就緒,我們就可以將我們當前專案打包成映象以分發部署。

使用docker build -t <name> <path>指令打包映象:

> docker build -t mvctest.web .


以上命令就是告訴docker將當前目錄打包成映象,並命名為hellodocker.web。命令執行完畢,輸入docker images即可看到我們新打包的映象

映象建立完畢我們就可以直接運行了:

> docker run -d -p 80:5000 mvctest.web


上面的指令就是執行我們新打包的映象,並通過-p引數對映容器的5000到宿主機的80埠,其中-d引數告訴docker以後臺任務形式執行映象。因為80是預設的web埠,所以我們通過瀏覽器直接訪問ip即可訪問到我們容器中執行的MVC網站


至此,我們藉助Docker就完美的完成了.NET Core專案的容器化部署,後續我們將映象部署在其它的機器上

五、推送映象到倉庫



請自行到Docker Hub註冊個賬號,然後我們把本地打包的映象放到自己賬號下的倉庫下

1、註冊完畢後,執行命令

> docker login

2、再執行命令

> docker push

推送失敗,提示我們的映象命名不符規範。原來在推送之前要把映象按<user>/<repo>格式來命名。那如何重新命名呢,我們用打標籤的方式重新命名


以上資訊表示推送成功了,檢視自己的倉庫,如下圖:


最後我們換一臺機器,我們直接執行以下命令,就完成了多重部署

> docker run -p 8081:5000 79522860/mvcdemo.web

 

以上自己的映象倉庫做好了,是不是很方便,如果結合業務,會發現需要的映象會比較多,分散式部署容器還要一個個啟動容器?不,其它我們還可以通過配置檔案來一鍵部署映象與容器,一下篇我們會講到


六、Docker常用命令



1、容器相關操作

    > docker ps    //檢視當前正在執行的容器
    > docker ps -a    //檢視所有容器的狀態
    > docker start/stop id/name    //啟動/停止某個容器
    > docker attach id    //進入某個容器(使用exit退出後容器也跟著停止執行)
    > docker rm id/name    //刪除某個容器,若正在執行,需要先停止
    > docker rm $(docker ps -a -q)    //刪除已經停止的容器
    > docker logs -f hello-world    //檢視指定容器的日誌記錄


> docker run -it --name hello_001 hello-world    //建立一個容器,並指定標籤


-i:允許我們對容器內的 (STDIN) 進行互動  

-t:在新容器內指定一個偽終端或終端  

--name:是給容器起一個名字,可省略,省略的話docker會隨機產生一個名字

 
2、映象相關操作

    > docker images    //檢視本地映象
    > docker rmi id/name    //刪除某個映象,如果不指定tag,預設刪除的是latest標籤
    > docker rmi $(docker images -q)    //刪除所有映象,小心
    > docker rmi $(docker images -f "dangling=true" -q)    //刪除所有無名稱映象(可能是構建過程中產生的中間映象)
    > docker start/stop id/name    //啟動/停止某個容器
    > docker attach id    //進入某個容器(使用exit退出後容器也跟著停止執行)


通過ID tag映象,下面是tag一個id為0e5574283393的本地映象到“fedora”儲存庫,tag名稱version1.0

> docker tag 0e5574283393 fedora/httpd:version1.0

通過名稱tag映象, 使用名稱“httpd” tag本地映象到儲存庫”fedora”,且其tag名為version1.0

> docker tag httpd fedora/httpd:version1.0

注意由於引用httpd的tag名稱沒有指定,預設引用httpd:latest

通過名稱和tag名稱 tag一個映象,為名稱為httpd和tag名稱為test的本地映象做標籤,其儲存庫為fedora,標籤名為version1.0.test

> docker tag httpd:test fedora/httpd:version1.0.test

tag一個映象到私有的儲存庫, 推送一個映象到一個私有的registry,而不是公共的docker registry,必須指定一個registry主機名和埠來tag此映象

> docker tag 0e5574283393 myregistryhost:5000/fedora/httpd:version1.0

 

3、解除安裝 Docker CE

a、解除安裝Docker包

> yum remove docker-ce

b、主機上的images, containers, volumes或自定義配置檔案不會自動刪除。 刪除所有mages, containers, volumes命令

>  rm -rf /var/lib/docker

 
六、額外知識普及



1、docker官方映象庫地址

https://hub.docker.com/r/microsoft/dotnet/

2、microsoft/dotnet 映象版本之間的區別

a、microsoft/dotnet:<version>-sdk(microsoft/dotnet:2.1-sdk)

此映像包含帶有 .NET Core 和命令列工具 (CLI) 的 .NET Core SDK。 此映像將對映到開發方案。 可使用此映像進行本地開發、除錯和單元測試。 此映像還可用於生成方案。 使用 microsoft/dotnet:sdk 始終都提供最新版本。

b、microsoft/dotnet:<version>-runtime(microsoft/dotnet:2.1-runtime)

此映像包含 .NET Core(執行時和庫),並且針對在生產環境中執行 .NET Core 應用進行了優化。

c、microsoft/dotnet:<version>-runtime-deps

runtime-deps 映像包括具有 .NET Core 所需的所有本機依賴項的作業系統。 此映像適用於獨立應用程式。


3、映象加速

鑑於國內網路問題,後續拉取 Docker 映象十分緩慢,我們可以配置加速器來解決,我使用的是網易的映象地址:http://hub-mirror.c.163.com。

新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 來配置 Daemon。

請在該配置檔案中加入(沒有該檔案的話,請先建一個):

{

"registry-mirrors": ["http://hub-mirror.c.163.com"]

}


#重新整理配置檔案並重啟docker

systemctl daemon-reload

systemctl restart docker

**********如果使用aliyun,需要登陸自己的阿里雲賬戶獲取自己的映象地址************

 

下篇文章我們會更簡單的來實現docker的安裝與部署以及每個容器自起動等操作。

比如不需要依賴dockerfile檔案,所有操作一條命令來搞定,是不是覺得很簡單,下篇我們來一點點的為您介紹。

 

作者:Dylan

公眾號:dotNET名人堂(sharecore)

微信:tangguo_9669

QQ:.NET Core 技術交流(18362376)

出處:https://www.cnblogs.com/hailang8/

本文文章版權歸作者和部落格園共有,未經作者同意不得隨意轉載,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。如有問題或建議,請與我聯絡。   &nbs