[Jenkins] Automated Deploy with Docker

上一篇我透過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。

 

 

 

參考

docker build

Advanced Docker Compose Configuration

Quickstart: Compose and ASP.NET Core with SQL Server

Routing to Controller Actions

Attribute Routing in ASP.NET Web API 2

Create a web API with ASP.NET Core and Visual Studio for Windows

AspNetCoreRouteDebugger