.NET Core容器化之多容器應用部署@Docker-Compose

.NET Core容器化@Docker
.NET Core容器化之多容器應用部署@Docker-Compose
.NET Core+MySql+Nginx 容器化部署

1.引言

緊接上篇.NET Core容器化@Docker墅冷,這一節(jié)我們先來介紹如何使用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提供動態(tài)內容豹悬,然而在Web服務方面沒有IIS、Apache液荸、Nginx這些全功能的服務器完善瞻佛。我們可以借助一個反向代理服務器接收來自互聯(lián)網(wǎng)的HTTP請求并在經(jīng)過一些初步處理(比如請求的緩存和壓縮、提供靜態(tài)內容娇钱、SSL Termination)后將其轉發(fā)給Kestrel伤柄。



借助反向代理服務器(本文使用Nginx),不僅可以給我們的Web網(wǎng)站提供了一個可選的附加層配置和防御文搂,而且可以簡化負載均衡和SSL設置响迂。而更重要的是,反向代理服務器可以很好的與現(xiàn)有的基礎設施進行整合细疚。

3. Hello Nginx

同樣我們還是基于Docker來試玩一下Nginx蔗彤。

//拉取Nginx鏡像
$ docker pull nginx
//啟動Nginx容器
$ docker run -d -p 8080:80 --name hellonginx nginx

上面我們以后臺運行的方式啟動了一個命名為hellonginx的nginx容器,其端口映射到宿主機的8080端口疯兼,我們現(xiàn)在可以通過瀏覽器直接訪問http://<ip address>:8080即可看到nginx的歡迎界面然遏。

Hello Nginx

至此,一個Nginx容器就啟動完畢了吧彪。那如何進行反向代理呢待侵?別急,我們一步一步來姨裸。

4. 反向代理.NET Core MVC

4.1. 啟動Web容器

還記得我們上一篇本地打包MVC項目創(chuàng)建的hellodocker.web的鏡像嗎秧倾?這里我們再啟動該鏡像創(chuàng)建一個容器:

//啟動一個helodocker.web的鏡像并命名容器為hellodocker.web.nginx
#  docker run -d -p 5000:5000 --name hellodocker.web.nginx hellodocker.web
160166b3556358502a366d1002567972e242f0c8be3a751da0a525f86c124933
//嘗試訪問剛剛運行的容器
[root@iZ288a3qazlZ ~]# curl -I http://localhost:5000
HTTP/1.1 200 OK
Date: Sun, 24 Dec 2017 02:48:16 GMT
Content-Type: text/html; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked

OK怨酝,我們開放了宿主機的5000端口用來映射我們啟動的MVC容器。

4.2. 配置反向代理

下面我們就來配置Nginx來反向代理我們剛啟動的Web容器那先。
要想Nginx成功代理指定的容器內運行的Web網(wǎng)站农猬,首先我們得知道容器對應的IPAddress。使用docker inspect <container id/name>即可查到售淡。

//查看正在運行的容器列表
$ docker ps 
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                            NAMES
d046b7b878a0        hellodocker.web                "dotnet run"             5 seconds ago       Up 3 seconds        0.0.0.0:5000->5000/tcp           hellodocker.web.nginx

//使用`|`管道操作符加上`grep`過濾操作符可以直接提取我們要查找的關鍵字
$ docker inspect hellodocker.web.nginx | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "192.168.0.5",
                    "IPAddress": "192.168.0.5",

從上面可以看到我的Web容器運行在宿主機的192.168.0.5:5000斤葱。下面我們配置Nginx轉發(fā)請求到192.168.0.5:5000即可完成反向代理。

Nginx配置反向代理的配置文件路徑為:/etc/nginx/conf.d/default.conf揖闸。
我們可以通過本地創(chuàng)建一個配置文件掛載到Nginx的容器內部進行反向代理配置揍堕。

$ cd demo
$ mkdir nginx
//創(chuàng)建my_nginx.conf文件
$ touch my_nginx.conf
$ vi my_nginx.conf
server {
  listen 80;

  location / {
    proxy_pass http://192.168.0.5:5000;
  }
}

上面我們通過指定listen配置nginx去監(jiān)聽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 \
> nginx
95381aa56a336f65b6d01ff9964ae3364f37d25e5080673347c1878b3a5bb514
/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.

我們發(fā)現(xiàn)容器啟動失敗,原因是8080端口被我們剛剛第一次啟動的nginx容器占用了贮泞。怎么辦递瑰?兩個方法:第一種就是將剛才創(chuàng)建的nginx容器干掉;第二種就是映射到新的端口隙畜。這里選擇第一種抖部。

$ docker ps
1bd630b60019        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 \
> nginx
793d4c62ec8ac4658d75ea0ab4273a0b1f0a9a68f9708d2f85929872888b121d

啟動成功后议惰,我們再在瀏覽器中訪問http://<ipaddress>:8080慎颗,發(fā)現(xiàn)返回的不再是Nginx的默認歡迎頁,而是我們啟動的Web容器中運行的MVC的首頁言询,說明反向代理配置成功俯萎!

5. Docker Compose讓一切更簡單

上面的步驟雖然簡單,但要分兩步進行:第一個就是我們的Web和Nginx要分兩次部署运杭,第二個就是我們必須知道Web容器的IP和端口號夫啊,以完成反向代理文件的配置。

對于需要多個容器(比如需要Nginx辆憔、SqlServer撇眯、Redis、RabbitMQ等)協(xié)調運行的復雜應用中虱咧,使用以上方式進行部署時熊榛,很顯然會很麻煩,而且還要為各個容器之間的網(wǎng)絡連接而苦惱腕巡。
還好玄坦,Docker體貼的為我們想到了這一點。借助Compose模塊,我們可以編寫一個docker-compose.yml文件煎楣,使用聲明性語法啟動一系列相互連接的容器豺总,即可一步完成上面的任務。

Docker Compose是一個用來定義和運行復雜應用的Docker工具择懂。使用Compose喻喳,你可以在一個文件中定義一個多容器應用,然后使用一條命令來啟動你的應用休蟹,完成一切準備工作沸枯。

5.1. 安裝Docker Compose

依次執(zhí)行以下命令:

$ 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 1719ceb

5.2. 編寫第一個docker-compose.yml

dockers-compose.yml文件要定義在我們項目的文件夾下日矫,我們的項目文件夾位于$HOME/demo/HelloDocker.Web赂弓。

$ cd $HOME/demo/HelloDocker.Web
$ touch docker-compose.yml
$ vi docker-compose.yml
version: '2'
services:
    hellodocker-web:
        container_name: hellodocker.web.compose
        build: .

    reverse-proxy:
        container_name: reverse-proxy
        image: nginx
        ports:
         - "9090:8080"
        volumes:
         - ./proxy.conf:/etc/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]# ls
appsettings.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:

$ docker-compose up -d
Building hellodocker-web
Step 1 : FROM microsoft/dotnet:latest
 ---> 7d4dc5c258eb
Step 2 : WORKDIR /app
 ---> Using cache
 ---> 98d48a4e278c
Step 3 : COPY . /app
 ---> 0cb9fc540afe
Removing intermediate container 9fecf088f03f
Step 4 : RUN dotnet restore
 ---> Running in 4bb7f34edbbe
  Restore completed in 597.13 ms for /app/HelloDocker.Web.csproj.
  Restoring packages for /app/HelloDocker.Web.csproj...
  Restore completed in 1.76 sec for /app/HelloDocker.Web.csproj.
 ---> 6869609ece23
Removing intermediate container 4bb7f34edbbe
Step 5 : EXPOSE 5000
 ---> Running in a97febf01e5a
 ---> 9b2639862a94
Removing intermediate container a97febf01e5a
Step 6 : ENV ASPNETCORE_URLS http://*:5000
 ---> Running in 4e2f4af28a8d
 ---> 0069661e891a
Removing intermediate container 4e2f4af28a8d
Step 7 : ENTRYPOINT dotnet run
 ---> Running in cbbf08d906f9
 ---> 0bbeef249b30
Removing intermediate container cbbf08d906f9
Successfully built 0bbeef249b30
WARNING: Image for service hellodocker-web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating hellodocker.web.compose ... done
Starting reverse-proxy ... done
//執(zhí)行docker-compose ps驗證啟動的服務
$ docker-compose ps
         Name                   Command          State               Ports
---------------------------------------------------------------------------------------
hellodocker.web.compose   dotnet run             Up      5000/tcp
reverse-proxy             nginx -g daemon off;   Up      80/tcp, 0.0.0.0:9090->8080/tcp
//使用curl指令驗證nginx的反向代理
$  curl -I http://localhost:9090
HTTP/1.1 200 OK
Server: nginx/1.13.7
Date: Sun, 24 Dec 2017 04:37:35 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive

可以看到珊膜,通過執(zhí)行curl -I http://localhost:9090驗證代理服務器配置成功,我們再通過瀏覽器訪問http://<ip address>:9090發(fā)現(xiàn)正確返回了我們MVC項目的默認首頁宣脉。

// 查看當前運行的容器
$ docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                            NAMES
a52830499cff        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

我們同時也發(fā)現(xiàn)通過docker-compose正確的創(chuàng)建了兩個容器hellodocker.web.composereverse-proxy车柠。

6. 最后

經(jīng)過以上的練習,我們對Nginx有了一定的了解塑猖,且知道如何進行配置竹祷。同時了解了如何借助docker-compose打包運行需要多容器的復雜應用。

本篇就先講到這里羊苟,下一篇我們介紹如何在Linux上玩耍MySql并打通Nginx+Web+MySql的容器化部署塑陵。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜡励,隨后出現(xiàn)的幾起案子令花,更是在濱河造成了極大的恐慌,老刑警劉巖凉倚,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彭则,死亡現(xiàn)場離奇詭異,居然都是意外死亡占遥,警方通過查閱死者的電腦和手機俯抖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓦胎,“玉大人芬萍,你說我怎么就攤上這事尤揣。” “怎么了柬祠?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵北戏,是天一觀的道長。 經(jīng)常有香客問我漫蛔,道長嗜愈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任莽龟,我火速辦了婚禮蠕嫁,結果婚禮上,老公的妹妹穿的比我還像新娘毯盈。我一直安慰自己剃毒,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布搂赋。 她就那樣靜靜地躺著赘阀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脑奠。 梳的紋絲不亂的頭發(fā)上基公,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音宋欺,去河邊找鬼轰豆。 笑死,一個胖子當著我的面吹牛迄靠,可吹牛的內容都是我干的秒咨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掌挚,長吁一口氣:“原來是場噩夢啊……” “哼雨席!你這毒婦竟也來了?” 一聲冷哼從身側響起吠式,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陡厘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后特占,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糙置,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年是目,在試婚紗的時候發(fā)現(xiàn)自己被綠了谤饭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖揉抵,靈堂內的尸體忽然破棺而出亡容,到底是詐尸還是另有隱情,我是刑警寧澤冤今,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布闺兢,位于F島的核電站,受9級特大地震影響戏罢,放射性物質發(fā)生泄漏屋谭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一龟糕、第九天 我趴在偏房一處隱蔽的房頂上張望桐磁。 院中可真熱鬧,春花似錦翩蘸、人聲如沸所意。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泄鹏,卻和暖如春郎任,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背备籽。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工舶治, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人车猬。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓霉猛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珠闰。 傳聞我的和親對象是個殘疾皇子惜浅,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)伏嗜,斷路器坛悉,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 以下原文轉載于(https://docs.docker.com/docker-for-mac/)(想找中文版的最新...
    Veekend閱讀 7,570評論 0 17
  • Docker從2013年發(fā)布第一個版本以來,已經(jīng)火遍全球承绸,技術迭代也比較頻繁裸影,其周邊產(chǎn)品和技術也越來越豐富。Doc...
    歸海聽雪閱讀 12,284評論 7 44
  • 首先军熏,祝各位新年快樂轩猩,萬事如意,雞年大吉。 這次要來說說一個和前端并不太相關的東西——docker compose...
    6ed7563919d4閱讀 4,224評論 0 21
  • 這兩天虛的不行均践,經(jīng)過鍛煉人也輕松了很多画饥,身體是自己的,該鍛煉還是要鍛煉的浊猾,沒有一成不變的體格抖甘,也沒有一蹴而就的成績...
    Irisapple閱讀 285評論 0 1