.NET Core容器化之多容器应用部署@Docker-Compose
1.引言
緊接上篇.NET Core容器化@Docker,這一節我們先來介紹如何使用Nginx來完成.NET Core應用的反向代理,然后再介紹多容器應用的部署問題。
2. Why Need Nginx
.NET Core中默認的Web Server為Kestrel。
Kestrel is great for serving dynamic content from ASP.NET, however the web serving parts aren’t as feature rich as full-featured servers like IIS, Apache or Nginx. A reverse proxy-server can allow you to offload work like serving static content, caching requests, compressing requests, and SSL termination from the HTTP server.
Kestrel可以很好的用來為ASP.NET提供動態內容,然而在Web服務方面沒有IIS、Apache、Nginx這些全功能的服務器完善。我們可以借助一個反向代理服務器接收來自互聯網的HTTP請求并在經過一些初步處理(比如請求的緩存和壓縮、提供靜態內容、SSL Termination)后將其轉發給Kestrel。
借助反向代理服務器(本文使用Nginx),不僅可以給我們的Web網站提供了一個可選的附加層配置和防御,而且可以簡化負載均衡和SSL設置。而更重要的是,反向代理服務器可以很好的與現有的基礎設施進行整合。
3. Hello Nginx
同樣我們還是基于Docker來試玩一下Nginx。
//拉取Nginx鏡像$ docker pull nginx//啟動Nginx容器$ docker run -d -p 8080:80 --name hellonginx nginx上面我們以后臺運行的方式啟動了一個命名為hellonginx的nginx容器,其端口映射到宿主機的8080端口,我們現在可以通過瀏覽器直接訪問http://<ip address>:8080即可看到nginx的歡迎界面。
至此,一個Nginx容器就啟動完畢了。那如何進行反向代理呢?別急,我們一步一步來。
4. 反向代理.NET Core MVC
4.1. 啟動Web容器
還記得我們上一篇本地打包MVC項目創建的hellodocker.web的鏡像嗎?這里我們再啟動該鏡像創建一個容器:
//啟動一個helodocker.web的鏡像并命名容器為hellodocker.web.nginx# ?docker run -d -p 5000:5000 --name hellodocker.web.nginx hellodocker.web160166b3556358502a366d1002567972e242f0c8be3a751da0a525f86c124933 //嘗試訪問剛剛運行的容器 [root@iZ288a3qazlZ ~]# curl -I http://localhost:5000HTTP/1.1 200 OKDate: Sun, 24 Dec 2017 02:48:16 GMTContent-Type: text/html; charset=utf-8Server: KestrelTransfer-Encoding: chunkedOK,我們開放了宿主機的5000端口用來映射我們啟動的MVC容器。
4.2. 配置反向代理
下面我們就來配置Nginx來反向代理我們剛啟動的Web容器。
要想Nginx成功代理指定的容器內運行的Web網站,首先我們得知道容器對應的IPAddress。使用docker inspect <container id/name>即可查到。
從上面可以看到我的Web容器運行在宿主機的192.168.0.5:5000。下面我們配置Nginx轉發請求到192.168.0.5:5000即可完成反向代理。
Nginx配置反向代理的配置文件路徑為:/etc/nginx/conf.d/default.conf。
我們可以通過本地創建一個配置文件掛載到Nginx的容器內部進行反向代理配置。
上面我們通過指定listen配置nginx去監聽80端口,指定proxy_pass為我們Web容器的IP和端口完成反向代理文件的配置。
接下來就是啟動一個新的Nginx容器并通過掛載的方式將配置文件共享到容器內部。
$ docker run -d -p 8080:80 \ > -v $HOME/demo/nginx/my_nginx.conf:/etc/nginx/conf.d/default.conf \ > nginx95381aa56a336f65b6d01ff9964ae3364f37d25e5080673347c1878b3a5bb514/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint elated_mccarthy (5a576d5991dd164db69b1c568c94c15e47ec7c67e43a3dd6982a2e9b83b60e08): Bind for 0.0.0.0:8080 failed: port is already allocated.我們發現容器啟動失敗,原因是8080端口被我們剛剛第一次啟動的nginx容器占用了。怎么辦?兩個方法:第一種就是將剛才創建的nginx容器干掉;第二種就是映射到新的端口。這里選擇第一種。
$ docker ps1bd630b60019 ? ? ? ?nginx ? ? ? ? ? ? ? ? ? ? ? ? ?"nginx -g 'daemon off" ? 59 minutes ago ? ? ?Up 59 minutes ? ? ? 0.0.0.0:8080->80/tcp ? ? ? ? ? ? hellonginx//使用docker rm <container id>刪除容器,指定-f進行強制刪除$ docker rm 1bd630b60019 -f//重新啟動Nginx容器$ docker run -d -p 8080:80 \ > -v $HOME/demo/nginx/my_nginx.conf:/etc/nginx/conf.d/default.conf \ > nginx793d4c62ec8ac4658d75ea0ab4273a0b1f0a9a68f9708d2f85929872888b121d啟動成功后,我們再在瀏覽器中訪問http://<ipaddress>:8080,發現返回的不再是Nginx的默認歡迎頁,而是我們啟動的Web容器中運行的MVC的首頁,說明反向代理配置成功!
5. Docker Compose讓一切更簡單
上面的步驟雖然簡單,但要分兩步進行:第一個就是我們的Web和Nginx要分兩次部署,第二個就是我們必須知道Web容器的IP和端口號,以完成反向代理文件的配置。
對于需要多個容器(比如需要Nginx、SqlServer、Redis、RabbitMQ等)協調運行的復雜應用中,使用以上方式進行部署時,很顯然會很麻煩,而且還要為各個容器之間的網絡連接而苦惱。
還好,Docker體貼的為我們想到了這一點。借助Compose模塊,我們可以編寫一個docker-compose.yml文件,使用聲明性語法啟動一系列相互連接的容器,即可一步完成上面的任務。
Docker Compose是一個用來定義和運行復雜應用的Docker工具。使用Compose,你可以在一個文件中定義一個多容器應用,然后使用一條命令來啟動你的應用,完成一切準備工作。
5.1. 安裝Docker Compose
依次執行以下命令:
$ sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose $ docker-compose --version docker-compose version 1.18.0, build 1719ceb5.2. 編寫第一個docker-compose.yml
dockers-compose.yml文件要定義在我們項目的文件夾下,我們的項目文件夾位于$HOME/demo/HelloDocker.Web。
$ cd $HOMEHelloDocker.Web $ touch docker-compose.yml $ vi docker-compose.ymlversion: '2'services:hellodocker-web: ? ? ? ?container_name: hellodocker.web.compose ? ? ? ?build: .reverse-proxy: ? ? ? ?container_name: reverse-proxy ? ? ? ?image: nginx ? ? ? ?ports:- "9090:8080" ? ? ? ?volumes:- ./proxy.conf:nginx/conf.d/default.conf簡單介紹下上面的配置文件,其中定義了兩個服務:一個是hellodocker-web,即以我們當前項目目錄來構建鏡像并啟動一個叫hellodocker.web.compose的容器。一個是reverse-proxy,用來使用nginx鏡像進行反向代理,其中又通過指定volumes來使用掛載的方式進行配置。
$ touch proxy.conf $ vi proxy.conf server { ? ?listen 8080;location / {proxy_pass http://hellodocker-web:5000;} } $ ls [root@iZ288a3qazlZ HelloDocker.Web]# lsappsettings.Development.json ?Controllers ? ? ? ? ? ? Models ? ? ?Startup.cs appsettings.json ? ? ? ? ? ? ?docker-compose.yml ? ? ?obj ? ? ? ? Views bin ? ? ? ? ? ? ? ? ? ? ? ? ? Dockerfile ? ? ? ? ? ? ?Program.cs ?wwwroot bundleconfig.json ? ? ? ? ? ? HelloDocker.Web.csproj ?proxy.conf [root@iZ288a3qazlZ HelloDocker.Web]#其中要注意反向代理的配置:proxy_pass http://hellodocker-web:5000;,其中ip部分直接指定的是docker-compose.yml中定義的第一個服務的名稱hellodocker-web。
下面我們就來啟動Compose:
可以看到,通過執行curl -I http://localhost:9090驗證代理服務器配置成功,我們再通過瀏覽器訪問http://<ip address>:9090發現正確返回了我們MVC項目的默認首頁。
// 查看當前運行的容器$ docker psCONTAINER ID ? ? ? ?IMAGE ? ? ? ? ? ? ? ? ? ? ? ? ? ?COMMAND ? ? ? ? ? ? ? ? ?CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? ?PORTS ? ? ? ? ? ? ? ? ? ? ? ? ? ?NAMESa52830499cff ? ? ? ?hellodockerweb_hellodocker-web ? "dotnet run" ? ? ? ? ? ? 7 minutes ago ? ? ? Up 7 minutes ? ? ? ?5000/tcp ? ? ? ? ? ? ? ? ? ? ? ? hellodocker.web.compose e1fe109e10bc ? ? ? ?nginx ? ? ? ? ? ? ? ? ? ? ? ? ? ?"nginx -g 'daemon off" ? 11 minutes ago ? ? ?Up 4 minutes ? ? ? ?80/tcp, 0.0.0.0:9090->8080/tcp ? reverse-proxy我們同時也發現通過docker-compose正確的創建了兩個容器hellodocker.web.compose和reverse-proxy。
6. 最后
經過以上的練習,我們對Nginx有了一定的了解,且知道如何進行配置。同時了解了如何借助docker-compose打包運行需要多容器的復雜應用。
本篇就先講到這里,下一篇我們介紹如何在Linux上玩耍MySql并打通Nginx+Web+MySql的容器化部署。
原文地址:https://www.cnblogs.com/sheng-jie/p/8116276.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的.NET Core容器化之多容器应用部署@Docker-Compose的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IdentityServer4 第三方快
- 下一篇: 采用Opserver来监控你的ASP.N