本文主要介紹下運用docker虛擬技術打包Asp.net core應用。 Docker作為一個開源的應用容器引擎,近幾年得到廣泛的應用,使用Docker我們可以輕鬆實現應用的持續集成部署,一次打包,到處運行。 ...
本文主要介紹下運用docker虛擬技術打包Asp.net core應用。 Docker作為一個開源的應用容器引擎,近幾年得到廣泛的應用,使用Docker我們可以輕鬆實現應用的持續集成部署,一次打包,到處運行。
開篇借用百科上對docker的介紹。
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
方便大家學習:
http://www.docker.org.cn/(中文站)
https://www.docker.com/(英文站)
docker鏡像站:https://hub.docker.com/
【搭建環境】
系統:CentOS 7.0 容器:Docker 1.12.6 .Net Core版本: .NET Core 1.1
工具:putty、winScp
一、首先,我們先介紹下關於docker容器的安裝。
直接用黃狗安裝工具安裝docker。
#安裝Docker $ yum install docker $ #啟動docker服務 $ systemctl start docker.service $ #配置開機啟動 $ systemctl enable docker.service
安裝併成功啟動docker服務後,可以通過以下命令查看docker版本信息
docker version Client: Version: 1.12.6 API version: 1.24 Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64 Go version: go1.7.4 Git commit: 88a4867/1.12.6 Built: Mon Jul 3 16:02:02 2017 OS/Arch: linux/amd64 Server: Version: 1.12.6 API version: 1.24 Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64 Go version: go1.7.4 Git commit: 88a4867/1.12.6 Built: Mon Jul 3 16:02:02 2017 OS/Arch: linux/amd64
docker客戶端、服務端版本信息都展示出來了。
二、安裝Docker加速器。
我目前使用的阿裡開發者提供的docker加速服務。
有阿裡雲賬號直接登錄,https://dev.aliyun.com/search.html
如何使用Docker加速器
針對Docker客戶端版本大於1.10的用戶
您可以通過修改daemon配置文件/etc/docker/daemon.json
來使用加速器:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://ihllojuv.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
為什麼要安裝Docker加速器?
摘自網友的話:眾所周知的原因,要想流暢地使用Docker,需要配置Docker加速器,否則你會覺得回到了撥號上網的時代 。
三、發佈Asp.Net Core程式。
我這裡是新建了也給Asp.Net Core web程式。
紅色圈住部分,是後來手動添加進去的,dockerfile是你的應用部署到docker上所必須的配置信息,只是個不帶擴展名的純文本文件而已。hosting.json需要是配置服務啟動時,監聽信息。使用配置文件,需要手動修改Program.cs中的入口程式。
/// <summary> /// /// </summary> /// <param name="args"></param> public static void Main(string[] args) { //實例化一個配置生成器 var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("hosting.json", optional: true)//添加配置文件hosting.json .Build(); var host = new WebHostBuilder() .UseKestrel() .UseConfiguration(config)//使用配置信息 .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .UseApplicationInsights() .Build(); host.Run(); }
完成以上操作後,我們發佈這個demo程式,解決方案,右鍵發佈。
發佈成功後,預設在bin/release/publishOutPut文件夾下。
然後,我把publishOutPut重命名為publish後,通過WinScp工具把文件傳到root/docker/下。
另外,我們在網站根目錄下,創建的Dockerfile文件,排上用場了,我們編輯修改文件。
FROM microsoft/aspnetcore:1.1 COPY . /publish WORKDIR /publish EXPOSE 80 CMD ["dotnet", "demo.dll"]
指定容器對外暴露埠80。註意,COPY .後面有空格,表示是當前位置,意思是從當前位置複製文件到/publish目錄下。網上有篇博客,少了個.,導致copy requires at least one argument這樣的錯誤。
四、打包鏡像
首先,我們進入/docker/publish目錄
執行以下命令:
docker build -t demo-netcore .
意思是生成一個名為demo-netcore的鏡像。(註意:最後空格後面有一個.)。
這個命令會,根據當前目錄下dockerfile配置文件,進行打包。
[root@localhost publish]# docker build -t demo-netcore . Sending build context to Docker daemon 17.84 MB Step 1 : FROM microsoft/aspnetcore:1.1 ---> 983c2fe9cbef Step 2 : COPY . /publish ---> ae9533f162da Removing intermediate container d8bdd1cb7061 Step 3 : WORKDIR /publish ---> Running in 06a5fbef40ea ---> c63de53ebe20 Removing intermediate container 06a5fbef40ea Step 4 : EXPOSE 80 ---> Running in 8d0eaa657905 ---> 228e30d1bf74 Removing intermediate container 8d0eaa657905 Step 5 : EXPOSE 8080 ---> Running in a38fd6c59d4a ---> ab126ceac6ae Removing intermediate container a38fd6c59d4a Step 6 : CMD dotnet demo.dll ---> Running in 7dc71cdf0f87 ---> 96ef55dd9fc9 Removing intermediate container 7dc71cdf0f87 Successfully built 96ef55dd9fc9
打包成功。
接下來,看看我們打包好的鏡像。
[root@localhost publish]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE demo-netcore latest 96ef55dd9fc9 About a minute ago 322.8 MB docker.io/microsoft/aspnetcore 1.1 983c2fe9cbef 23 hours ago 305.1 MB [root@localhost publish]#
因為,剛打包的鏡像demo-netcore是基於docker.io/microsoft/aspnetcore鏡像的,所以在打包demo-netcore的過程中,會優先從鏡像庫中拉取docker.io/microsoft/aspnetcore鏡像。至此,我們的第一個docker鏡像就打包成功了。接下來,在容器中運行鏡像。
五、運行docker容器
docker run --name demo -p 8080:80 demo-netcore:late
其中,demo是制定容器的名稱,-p是進行宿主和容器之間埠的映射,(-p 宿主埠:容器埠),
執行完以上命令後,正常情況下,會出現如下內容:
Hosting environment: Production Content root path: /publish Now listening on: http://+:80 Application started. Press Ctrl+C to shut down.
這表明,你的asp.net core程式已經成功在docker容器中運行,監聽埠為80。這個80指的是容器的埠,以上信息都是在容器中執行的結果輸出。它會提示,按Ctrl+C終止當前應用程式。如果在執行docker run的時候,加上 -d命令,這樣容器就會一直運行,即使關掉終端視窗。於是,我們想讓docker程式一直運行,以上命令可以修改為:
docker run --name demo -d -p 808
檢驗docker容器是否運行成功,執行如下命令:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1abf4952db5b demo-netcore:latest "dotnet demo.dll" About a minute ago
以上信息可以看到,容器ID,容器名稱,命令,鏡像名稱,
由於,我再dockerfier文件中,配置宿主的埠為8080,那麼我們訪問容器中的asp.net core程式時,需要通過8080埠訪問,完成以上步驟,接下來讓我們看下結果吧!瀏覽器打開http://localhost:8080或者執行
wget http://localhost:8080
第一個asp.net core docker應用運行起來了!
以下,是在本次操作中,常用的幾個docker命令。
#生成鏡像 docker build -t demo-netcore . #運行容器 docker run --name demo -p 8080:80 demo-netcore:latest #刪除所有容器進程 docker rm $(docker ps -a -q) #刪除一個鏡像 docker rmi 鏡像ID #查看所有鏡像 docker images
關於怎樣把本地鏡像推送到hub.docker.com,請訪問我的另一篇博客《推送docker 鏡像到hub.docker.com》