利用docker-compose搭建AspNetCore開(kāi)發(fā)環(huán)境
使用docker-compose搭建AspNetCore開(kāi)發(fā)環(huán)境
1 使用docker-compose搭建開(kāi)發(fā)環(huán)境
我們的目標(biāo)很簡(jiǎn)單:使用docker-compose把若干個(gè)docker容器組合起來(lái)就成了。
首先使用Nginx代理所有的Web程序,這樣只需要在主機(jī)上監(jiān)聽(tīng)一個(gè)端口就可以了,不污染主機(jī)。再組合各Web程序、Redis/Memcached、SqlServerOnLinux。
新建一個(gè)目錄sites,所有和集群相關(guān)的都放在這里,目錄結(jié)構(gòu)如下所示
sites
nginx
sites-enabled
default
Dockerfile
redis
Dockerfile
redis.conf
docker-compose.yml
新建docker-compose.yml
version: "2" services: redis: build: ./redis/ restart: always container_name: mac-redis identity: build: ~/identity/src/Web/ #identity項(xiàng)目的Dockerfile所在的目錄 restart: always volumes: - ~/identity/src/Web/bin/Debug/netcoreapp1.1/publish:/app #把編譯好的序集添加到數(shù)據(jù)卷中 links: - 'ucenter:api.ucenter.com' #因?yàn)閕dentity項(xiàng)目依賴(lài)ucenter項(xiàng)目,identity目?jī)?nèi)部通過(guò)url:api.ucenter.com調(diào)用ucenter的webapi,所以這里要給設(shè)置一個(gè)和ur一樣的別名,這樣identity項(xiàng)目訪問(wèn)`api.ucenter.com`就會(huì)被轉(zhuǎn)發(fā)到ucenter容器。 - redis extra_hosts: - "dbserver:192.168.199.143" #之前搭建了一個(gè)sqlserver容器,那個(gè)是單獨(dú)放在個(gè)Linux機(jī)器里面,所以這里就直接通過(guò)地址調(diào)用,注意要開(kāi)啟遠(yuǎn)程訪問(wèn)。 container_name: identity logging: driver: "json-file" options: max-size: "50k" #因?yàn)殡S著程序的運(yùn)行,日志會(huì)越來(lái)越多,導(dǎo)致每次加載時(shí)間越越長(zhǎng),所以規(guī)定日志文件大小,節(jié)省時(shí)間 max-file: "10" ucenter: build: ~/UCenter/src/WebAPI #ucenter項(xiàng)目的Dockerfile所在的目錄 restart: always volumes: - ~/UCenter/src/WebAPI/bin/Debug/netcoreapp1.1/publish:/app links: - redis extra_hosts: - "dbserver:192.168.199.143" container_name: ucenter nginx-host: build: ./nginx #nginx的Dockerfile所在的目錄 restart: always ports: - "80:80" #監(jiān)聽(tīng)主機(jī)的80端口,或者其它的端口都可以 links: - identity - ucenter volumes: - ./nginx/sites-enabled:/etc/nginx/sites-enabled #nginx的配置文件放在據(jù)卷中,以后需要改動(dòng)的時(shí)候,重啟nginx就可以了,不用重新build - /WebCommon:/www/data #各個(gè)項(xiàng)目共用的靜態(tài)文件,一般走cdn的,在開(kāi)發(fā)環(huán)境里就nginx代理 container_name: nginx-host logging: driver: "json-file" options: max-size: "50k" max-file: "10"
上面在集群中配置了4個(gè)服務(wù),一個(gè)nginx負(fù)責(zé)監(jiān)聽(tīng)主機(jī)的80端口,并轉(zhuǎn)發(fā)到相應(yīng)的服務(wù)中去。
identity是我開(kāi)發(fā)的項(xiàng)目,依賴(lài)于ucenter項(xiàng)目
項(xiàng)目中都依賴(lài)redis緩存,還有通過(guò)host解析的數(shù)據(jù)庫(kù)服務(wù)dbserver。
2 下面先搭建nginx服務(wù)
在sites->nginx目錄下面,新建sites-enabled目錄,再新建一個(gè)名為default的配置文件
server {
listen 80;
server_name account.xxx.com; #identity項(xiàng)目的域名
location / {
proxy_pass http://identity; #轉(zhuǎn)發(fā)到identity服務(wù)處理
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 8m;
client_body_buffer_size 128;
}
}
server {
listen 80;
server_name ucenter.xxx.com; #ucenter項(xiàng)目的域名
location / {
proxy_pass http://ucenter; #轉(zhuǎn)發(fā)到ucenter服務(wù)處理
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 8m;
client_body_buffer_size 128;
}
}
server {
listen 80;
server_name cdn.xxx.com; #這里把靜態(tài)文件打包成一個(gè)服務(wù),替代cdn
root /www/data;
location / {
}
}
這個(gè)是nginx的配置文件,主要配置Nginx的代理方式。下面編寫(xiě)生成Nginx的Dockerfile,sites->nginx下面新建Dockerfile
FROM tutum/nginx VOLUME /etc/nginx/sites-enabled
通過(guò)這個(gè)Dockerfile就可以創(chuàng)建Nginx了,
3 安裝redis
1).再sites下新建目錄:mkdir redis
2).vim Dockerfile
FROM redis COPY redis.conf /usr/local/etc/redis/redis.conf CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
3).vim redis.conf, 復(fù)制粘貼redis的配置,這是redis的官方默認(rèn)配置。
4).docker build -t mac-redis .我給它起了個(gè)名字叫mac-redis
5).鏡像創(chuàng)建好之后,先測(cè)試一下能不能用,docker run -d --name mac-redis mac-redis。這時(shí)候mac-redis的容器已經(jīng)在后臺(tái)跑起來(lái)了,我們?cè)儆?span style="color: #800000">redis-cli測(cè)試這個(gè)redis服務(wù),docker run -it --link mac-redis:redis --rm redis redis-cli -h redis -p 6379使用--rm參數(shù),用完就清除這個(gè)容器。測(cè)試如下:
redis:6379> set key1 value1 OK redis:6379> get key1 "value1"
看來(lái)redis服務(wù)沒(méi)問(wèn)題,exit退出。再把測(cè)試用的redis服務(wù)容器也刪除掉docker rm -f mac-redis。
4 使用docker跑aspnetcore程序
這個(gè)是最簡(jiǎn)單的了,根據(jù)微軟的鏡像來(lái)就行了,園子里也有大量的教程。
在這里我把它們放在集群中,只要在docker-compose.yml中配置各個(gè)aspnetcore程序的Dockerfile所在的路徑即可,在我們的yml文件中有
build: ~/identity/src/Web/ #identity項(xiàng)目的Dockerfile所在的目錄
identity的源代碼所在的目錄為~/identity/,Dockerfile在其中的src/web里面,如下:
FROM microsoft/aspnetcore:1.1.1 LABEL Name=identity Version=0.0.1 ENV ASPNETCORE_ENVIRONMENT Development ENTRYPOINT ["dotnet", "Identity.Web.dll"]
如果有多個(gè)Dockerfile,可以在yml中指定Dockerfile的名稱(chēng)。
另外一個(gè)ucenter的Dockerfile如下:
FROM microsoft/aspnetcore:1.1.1 LABEL Name=ucenter Version=0.0.1 ENTRYPOINT ["dotnet", "UCenter.WebAPI.dll"]
代碼修改了之后,dotnet publis && docker restart xxx(xxx就是容器的名稱(chēng))就生效了。
使用chrome瀏覽器訪問(wèn)
最后進(jìn)入sites目錄,docker-compose up啟動(dòng)集群,由于nginx監(jiān)聽(tīng)的是主機(jī)的80端口,所以需要把綁定的url指向主機(jī)的80端口,一種方法是直接在hosts中加解析,但是不推薦這樣做,因?yàn)槿绻L問(wèn)線上的項(xiàng)目的話,又要改hosts。為了不污染主機(jī)環(huán)境,推薦使用chrome瀏覽器,chrome有多用戶功能,因此新建一個(gè)用戶,使用SwitchyOmega插件,將所需要的URl代理到主機(jī)的80端口,這樣以后開(kāi)發(fā)的時(shí)候用這個(gè)chrome的這個(gè)用戶就可以了,完全不影響主機(jī)環(huán)境。

在開(kāi)發(fā)環(huán)節(jié)中,debug是必不可少的需求,所以下篇介紹如何用VSCode在Docker中debug。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net實(shí)現(xiàn)固定GridView標(biāo)題欄的方法(凍結(jié)列功能)
這篇文章主要介紹了asp.net實(shí)現(xiàn)固定GridView標(biāo)題欄的方法,即凍結(jié)列功能,涉及GridView結(jié)合前端js操作數(shù)據(jù)顯示的相關(guān)技巧,需要的朋友可以參考下2016-06-06
WEB上調(diào)用HttpWebRequest奇怪問(wèn)題的解決方法
WEB上調(diào)用HttpWebRequest奇怪問(wèn)題的解決方法...2007-04-04
asp.net用url重寫(xiě)URLReWriter實(shí)現(xiàn)任意二級(jí)域名 新
最近有個(gè)朋友要做url重寫(xiě)的東西,我?guī)退伺?回頭看當(dāng)年自己寫(xiě)的那個(gè)文章,當(dāng)時(shí)以為自己寫(xiě)的很容易理解.但現(xiàn)在再看卻覺(jué)得寫(xiě)的不好.而今天百度了一下urlrewriter發(fā)現(xiàn)我這個(gè)文章竟然排第二.為了方便更多朋友,我再寫(xiě)點(diǎn)東西補(bǔ)充下.2009-11-11
CZGL.ProcessMetrics處理監(jiān)控?cái)?shù)據(jù)的三種方式介紹
這篇文章介紹了CZGL.ProcessMetrics處理監(jiān)控?cái)?shù)據(jù)的三種方式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
擴(kuò)展方法ToJSON() and ParseJSON()
AJAX編程經(jīng)常需要Object<=>JSON之間轉(zhuǎn)換,寫(xiě)了二個(gè)擴(kuò)展方法: public static string ToJSON(this object obj) public static T ParseJSON<T>(this string str)2008-03-03
asp.net Datalist控件實(shí)現(xiàn)分頁(yè)功能
asp.net Datalist控件實(shí)現(xiàn)分頁(yè)功能代碼。大家可以參考下。2009-07-07
在?.NET?中使用?FixedTimeEquals?應(yīng)對(duì)計(jì)時(shí)攻擊的例子
在計(jì)算機(jī)安全中,計(jì)時(shí)攻擊(Timing attack)是旁道攻擊 (Side-channel attack) 的一種,而旁道攻擊是根據(jù)計(jì)算機(jī)處理過(guò)程發(fā)出的信息進(jìn)行分析,這篇文章主要介紹了在?.NET?中使用?FixedTimeEquals?應(yīng)對(duì)計(jì)時(shí)攻擊,需要的朋友可以參考下2022-06-06
解決 ASP.NET中目錄訪問(wèn)權(quán)限的問(wèn)題
解決 ASP.NET中目錄訪問(wèn)權(quán)限的問(wèn)題...2006-09-09
ASP.NET?Core使用EF為關(guān)系數(shù)據(jù)庫(kù)建模
這篇文章介紹了ASP.NET?Core使用EF為關(guān)系數(shù)據(jù)庫(kù)建模的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04

