標籤:date ado 行遷移 art 三劍客 err 快速 mod runtime
目錄
- Docker Compose
- WebApi 項目
- Web MVC 項目
- 編寫 docker-compose.yml檔案
- 運行項目
- 原始碼
- 參考
本文類比一個比較完整的項目,包括前端(MVC), 後端(WebApi)和資料庫(mssql-server-linux)。通過Docker Compose 定義,組合并執行它們。涉及到 Docker Compose 安裝,命令,docker-compose.yml檔案編寫,WebApi 和 MVC 項目編寫,Dockfile編寫等
Docker Compose簡介
Docker Compose是Docker三劍客之一,用於定義和運行多個Docker容器應用,負責實現對 Docker 容器叢集的快速編排。
我們可以通過Dockerfile定義一個單獨的應用程式容器。然而在日常工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個 Web 項目,除了 Web 服務容器本身,往往還需要再加上後端的資料庫服務容器等。
Compose 恰好滿足了這樣的需求。它允許使用者通過一個單獨的 docker-compose.yml 配置板檔案(YAML 格式)來定義一組相相關 App容器。然後使用使用單個命令,就可以根據配置中建立並啟動所有服務。
安裝
- curl 下載 Docker Compose
sudo curl -L https://github.com/docker/compose/releases/download/{{site.compose_version}}/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
替換{{site.compose_version}}為最新的版本號碼
- 賦執行許可權
sudo chmod +x /usr/local/bin/docker-compose
- 測試是否安裝成功
docker-compose --version
WebApi 項目建立項目
參考微軟樣本Create a Web API 建立一個基於 net core 2.1的WebApi項目,命名為Todo.Api. 參照樣本添加 model 和 database context。
在 ConfigureServices 裡註冊 database context.
services.AddDbContext<TodoContext>(options => options.UseSqlServer(Configuration["ConnectionString"]));
- 參考微軟樣本Work with SQL Server LocalDB 添加 Seed 類並在Program.cs裡面添加 seed initializer等。
public static void Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { var context = services.GetRequiredService<TodoContext>(); if (context.Database.GetPendingMigrations().Any()) { context.Database.Migrate(); SeedData.Initialize(services); } } catch (Exception ex) { var logger = services.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "An error occurred seeding the DB."); } } host.Run(); }
只需要運行Add-Migration命令產生遷移。無需執行Update-Database命令,因為程式運行起來時候會通過context.Database.Migrate()來執行遷移。
編寫Dockfile
FROM microsoft/dotnet:2.1-aspnetcore-runtimeWORKDIR /appEXPOSE 80/tcpENTRYPOINT ["dotnet", "Todo.Api.dll"]
Web MVC 項目建立項目
建立一個基於 net core 2.1的Web MVC項目,命名為webMVC.
添加 Service 去調用 WebApi 開放的介面。
public class TodoService : ITodoService { private readonly HttpClient _apiClient; private readonly IOptions<ApiConfig> _setting; public TodoService(HttpClient httpClient, IOptions<ApiConfig> settings) { _apiClient = httpClient; _setting = settings; } public async Task<IEnumerable<TodoViewModel>> GetTodos() { var url = $"{_setting.Value.TodoApiUrl}/api/todo"; var dataString = await _apiClient.GetStringAsync(url); return JsonConvert.DeserializeObject<IEnumerable<TodoViewModel>>(dataString); } public async Task<IEnumerable<string>> GetMachineNames() { var url = $"{_setting.Value.TodoApiUrl}/api/machine"; var dataString = await _apiClient.GetStringAsync(url); return JsonConvert.DeserializeObject<IEnumerable<string>>(dataString); } }
編寫Dockfile
FROM microsoft/dotnet:2.1-aspnetcore-runtimeWORKDIR /appEXPOSE 80/tcpENTRYPOINT ["dotnet", "WebMVC.dll"]
編寫 docker-compose.yml檔案
version: "3"services: webmvc: image: webmvc environment: - ASPNETCORE_URLS=http://0.0.0.0:80 build: context: ./WebMVC dockerfile: Dockerfile ports: - "8080:80" volumes: - ./WebMVC/bin/pub/:/app container_name: webmvc depends_on: - todo.api todo.api: image: todo.api environment: - ASPNETCORE_URLS=http://0.0.0.0:80 - ConnectionString=Server=sql.data;User=sa;[email protected];Database=WebAPI_SQL_Docker_Demo; build: context: ./Todo.Api dockerfile: Dockerfile ports: - "8081:80" volumes: - ./Todo.Api/bin/pub/:/app container_name: todo.api depends_on: - sql.data sql.data: image: microsoft/mssql-server-linux:2017-latest environment: - [email protected] - ACCEPT_EULA=Y ports: - "1433:1433"
image: 指定鏡像或構建產生鏡像的名字
build:構建產生鏡像。context 指令指定 Dockerfile 所在檔案夾的路徑,dockerfile 指令指定 Dockerfile 檔案名稱
environment:設定環境變數
ports:暴露連接埠資訊。使用宿主連接埠:容器連接埠 (HOST:CONTAINER) 格式
volumes:資料卷所掛載路徑設定。可以設定宿主機路徑 (HOST:CONTAINER)
container_name:指定容器名稱。預設將會使用 項目名稱_服務名稱_序號 這樣的格式
depends_on:解決容器的依賴、啟動先後的問題
詳細請參考 Compose file version 3 reference
運行項目
- 在docker-compose.yml檔案通目錄下執行
docker-compose build
構建項目中的服務容器.
docker-compose build
- 通過
docker-compose up
建立,關聯並啟動服務.
docker-compose up
-d 在後台運行服務容器。
--scale SERVICE=NUM 建立服務的N個執行個體。
詳細請參考 Compose (docker-compose) CLI reference
原始碼
參考
- compose gitHub
- Quickstart: Compose and ASP.NET Core with SQL Server
- Get Started Building Microservices with ASP.NET Core and Docker in Visual Studio Code
- Docker Compose 項目
通過 Docker Compose 組合 ASP NET Core 和 SQL Server