上一篇我透過jenkins完成自動build、publish相關NetCore application(MyAPI),
同時也自動建立相對應kestrel web,這篇來看看如何使用docker來取代。
我所接觸的產業,架構上,到現在還沒看過只用一台(超強)web(application) server,
幾乎都超過3台以上server並搭配LB來handle所有client的http requests,
我為了讓整合測試環境更貼近生產環境,而且也需符合快速建立或刪除相對應web server效率,
所以我選擇使用docker來實現,架構修改後如下圖
Note:如果要建立nginx container,須在nginx.conf設定daemon off,
像這種無狀態服務,docker啟動完後就會自行關閉該process。
我將使用Dockerfile快速建立base image with aspnetcore,並使用docker-compose.yml參照Dockerfile快速建立三台web server,
而這一切都將透過jenkins來幫我自動完成,同時也會更新nginx.conf來符合LB機制。
另外,我這裡只是簡單示範(請勿直接服用),實務上,我會參考專案中的json設定檔案,
並透過replace string方法來建立各種環境,當然還有更多細節。
Dockerfile
# docker build -f Dockerfile -t rico/myapi .
# Build runtime image
FROM microsoft/aspnetcore
MAINTAINER RiCo
WORKDIR /app
COPY ./AssemblyOutput /app
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
ENV ASPNETCORE_ENVIRONMENT docker
ENTRYPOINT ["dotnet", "MyAPI.dll"]
Docker-compose.yml
version: '3'
services:
app:
container_name: 'coreapp'
image: 'coreapp'
networks:
mynet:
ipv4_address: 172.28.1.2
build:
context: .
dockerfile: Dockerfile
volumes:
- ./log:/app/log
app2:
container_name: 'coreapp2'
image: 'coreapp'
networks:
mynet:
ipv4_address: 172.28.1.3
build:
context: .
dockerfile: Dockerfile
volumes:
- ./log:/app/log
app3:
container_name: 'coreapp3'
image: 'coreapp'
networks:
mynet:
ipv4_address: 172.28.1.4
build:
context: .
dockerfile: Dockerfile
volumes:
- ./log:/app/log
networks:
mynet:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
Nginx.conf
Upstream輸入三台container ip,這是LB route,proxy_pass需對應我們所設定的service name。
@Run a job on Jenkins
Build scripts大同小異,可參考我之前文章
結果
我大約只花47秒就完成以下項目,同時我也把相關infrastructure上了版控(IaC(Infrastructure as Code)),
就像我之前曾說過,接觸過CI/CD就回不去原始時代了。
pull code from github
build and run unitTest
publish MyAPI
setting LB for our netcore application
create three containers of web server
Container’s status
Check LB working
Server IP:172.28.1.3。
Server IP:172.28.1.4。
Server IP:172.28.1.2。
參考
Advanced Docker Compose Configuration
Quickstart: Compose and ASP.NET Core with SQL Server
Attribute Routing in ASP.NET Web API 2
Create a web API with ASP.NET Core and Visual Studio for Windows