利用docker-compose搭建AspNetCore開發(fā)環(huán)境
使用docker-compose搭建AspNetCore開發(fā)環(huán)境
1 使用docker-compose搭建開發(fā)環(huán)境
我們的目標很簡單:使用docker-compose把若干個docker容器組合起來就成了。
首先使用Nginx代理所有的Web程序,這樣只需要在主機上監(jiān)聽一個端口就可以了,不污染主機。再組合各Web程序、Redis/Memcached、SqlServerOnLinux。
新建一個目錄sites,所有和集群相關的都放在這里,目錄結構如下所示
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項目的Dockerfile所在的目錄 restart: always volumes: - ~/identity/src/Web/bin/Debug/netcoreapp1.1/publish:/app #把編譯好的序集添加到數(shù)據(jù)卷中 links: - 'ucenter:api.ucenter.com' #因為identity項目依賴ucenter項目,identity目內部通過url:api.ucenter.com調用ucenter的webapi,所以這里要給設置一個和ur一樣的別名,這樣identity項目訪問`api.ucenter.com`就會被轉發(fā)到ucenter容器。 - redis extra_hosts: - "dbserver:192.168.199.143" #之前搭建了一個sqlserver容器,那個是單獨放在個Linux機器里面,所以這里就直接通過地址調用,注意要開啟遠程訪問。 container_name: identity logging: driver: "json-file" options: max-size: "50k" #因為隨著程序的運行,日志會越來越多,導致每次加載時間越越長,所以規(guī)定日志文件大小,節(jié)省時間 max-file: "10" ucenter: build: ~/UCenter/src/WebAPI #ucenter項目的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)聽主機的80端口,或者其它的端口都可以 links: - identity - ucenter volumes: - ./nginx/sites-enabled:/etc/nginx/sites-enabled #nginx的配置文件放在據(jù)卷中,以后需要改動的時候,重啟nginx就可以了,不用重新build - /WebCommon:/www/data #各個項目共用的靜態(tài)文件,一般走cdn的,在開發(fā)環(huán)境里就nginx代理 container_name: nginx-host logging: driver: "json-file" options: max-size: "50k" max-file: "10"
上面在集群中配置了4個服務,一個nginx負責監(jiān)聽主機的80端口,并轉發(fā)到相應的服務中去。
identity是我開發(fā)的項目,依賴于ucenter項目
項目中都依賴redis緩存,還有通過host解析的數(shù)據(jù)庫服務dbserver。
2 下面先搭建nginx服務
在sites->nginx目錄下面,新建sites-enabled目錄,再新建一個名為default的配置文件
server { listen 80; server_name account.xxx.com; #identity項目的域名 location / { proxy_pass http://identity; #轉發(fā)到identity服務處理 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項目的域名 location / { proxy_pass http://ucenter; #轉發(fā)到ucenter服務處理 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)文件打包成一個服務,替代cdn root /www/data; location / { } }
這個是nginx的配置文件,主要配置Nginx的代理方式。下面編寫生成Nginx的Dockerfile,sites->nginx下面新建Dockerfile
FROM tutum/nginx VOLUME /etc/nginx/sites-enabled
通過這個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, 復制粘貼redis的配置,這是redis的官方默認配置。
4).docker build -t mac-redis .我給它起了個名字叫mac-redis
5).鏡像創(chuàng)建好之后,先測試一下能不能用,docker run -d --name mac-redis mac-redis。這時候mac-redis的容器已經在后臺跑起來了,我們再用redis-cli測試這個redis服務,docker run -it --link mac-redis:redis --rm redis redis-cli -h redis -p 6379使用--rm參數(shù),用完就清除這個容器。測試如下:
redis:6379> set key1 value1 OK redis:6379> get key1 "value1"
看來redis服務沒問題,exit退出。再把測試用的redis服務容器也刪除掉docker rm -f mac-redis。
4 使用docker跑aspnetcore程序
這個是最簡單的了,根據(jù)微軟的鏡像來就行了,園子里也有大量的教程。
在這里我把它們放在集群中,只要在docker-compose.yml中配置各個aspnetcore程序的Dockerfile所在的路徑即可,在我們的yml文件中有
build: ~/identity/src/Web/ #identity項目的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"]
如果有多個Dockerfile,可以在yml中指定Dockerfile的名稱。
另外一個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就是容器的名稱)就生效了。
使用chrome瀏覽器訪問
最后進入sites目錄,docker-compose up啟動集群,由于nginx監(jiān)聽的是主機的80端口,所以需要把綁定的url指向主機的80端口,一種方法是直接在hosts中加解析,但是不推薦這樣做,因為如果要訪問線上的項目的話,又要改hosts。為了不污染主機環(huán)境,推薦使用chrome瀏覽器,chrome有多用戶功能,因此新建一個用戶,使用SwitchyOmega插件,將所需要的URl代理到主機的80端口,這樣以后開發(fā)的時候用這個chrome的這個用戶就可以了,完全不影響主機環(huán)境。
在開發(fā)環(huán)節(jié)中,debug是必不可少的需求,所以下篇介紹如何用VSCode在Docker中debug。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Asp.Net MVC 分頁、檢索、排序整體實現(xiàn)代碼
很多時候需要這樣的功能,對表格進行分頁、排序和檢索。本篇文章主要介紹了Asp.Net MVC 分頁、檢索、排序整體實現(xiàn),有興趣的可以了解一下。2017-01-01淺談對Jquery+JSON+WebService的使用小結
本篇文章介紹了對Jquery+JSON+WebService的使用小結。需要的朋友參考下2013-04-04.NET集成DeveloperSharp實現(xiàn)高效分頁與無主鍵分頁
DeveloperSharp系列近期又被制造業(yè)ERP、民航飛行App、建筑BIM、電力掌上營業(yè)廳、等多家大型采用,站在巨人的肩膀上你能走的更遠,這篇文章主要介紹了.NET集成DeveloperSharp實現(xiàn)高效分頁與無主鍵分頁,需要的朋友可以參考下2024-06-06動態(tài)指定任意類型的ObjectDataSource對象的查詢參數(shù)
我在使用ObjectDataSource控件在ASP.NET中實現(xiàn)Ajax真分頁 一文中詳細介紹過如何使用ObjectDataSource和ListView實現(xiàn)數(shù)據(jù)綁定和分頁功能。事實上,采用ObjectDataSource和ListView相結合,可以減少我們很多的開發(fā)任務。2009-11-11.Net?Core授權認證方案JWT(JSON?Web?Token)初探
這篇文章介紹了.Net?Core授權認證方案JWT,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06