您好,登錄后才能下訂單哦!
今天小編給大家分享一下.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
開始安裝: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(""),在瀏覽器中訪問如下圖:
下一步我們就將該目錄下的源碼項目通過掛載的方式共享到容器中去
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.
3、卸載 docker ce
a、卸載docker包
> yum remove docker-ce
b、主機上的images, containers, volumes或自定義配置文件不會自動刪除。 刪除所有mages, containers, volumes命令
> rm -rf /var/lib/docker
六、額外知識普及
1、docker官方鏡像庫地址
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 鏡像十分緩慢,我們可以配置加速器來解決,我使用的是網易的鏡像地址:。
新版的 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,需要登陸自己的阿里云賬戶獲取自己的鏡像地址************
以上就是“.NETCore Docker如何實現容器化與私有鏡像倉庫管理”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。