Docker & ASP.NET Core (5):Docker Compose

来源:https://www.cnblogs.com/cgzl/archive/2018/11/30/10040590.html
-Advertisement-
Play Games

第一篇:把代碼連接到容器 第二篇:定製Docker鏡像 第三篇:發佈鏡像 第四篇:容器間的連接 Docker Compose簡介 Compose是一個用來定義和運行多容器Docker應用的工具。使用Compose的時候,你可以使用一個YAML文件來配置你應用的服務。然後根據配置,使用一個命令即可創建 ...


第一篇:把代碼連接到容器 

第二篇:定製Docker鏡像

第三篇:發佈鏡像

第四篇:容器間的連接

 

Docker Compose簡介

Compose是一個用來定義和運行多容器Docker應用的工具。使用Compose的時候,你可以使用一個YAML文件來配置你應用的服務。然後根據配置,使用一個命令即可創建並運行所有的服務。

使用Compose的時候通常分三步:

  1. 使用Dockerfile定義你的環境
  2. 在docker-compose.yml文件里定義你的服務,這樣就可以讓他們在隔離的環境中一起運行了。
  3. 運行docker-compose up 命令,來啟動和運行整個應用。

 

Docker Compose的特點

Docker Compose可以做很多事情,但是如果只考慮在開發環境里,它可以做下麵這些事情:

  • 管理整個應用的生命周期:啟動、停止、重構建服務,而服務呢,其實就是運行的容器而已。
  • 查看在運行的服務的狀態,包括輸出日誌。
  • 可以在單個容器上運行一次性命令。

 

為什麼要使用Docker Compose

通常來說,如果你的應用稍微有點規模,例如你的Web應用需要使用Web伺服器,緩存伺服器,資料庫伺服器。。。如果你手動管理這樣的docker應用,就很繁瑣,也很容易出錯。

而如果使用Docker Compose的話,它可以定義一個docker-compose.yml文件,在這個文件里,你可以定義所有的這些服務,以及它們之間的關係。

 

docker-compose.yml文件

docker-compose.yml文件就是用來配置服務的,這裡有一個官網給出的例子:

 

這個文件寫好之後,就可以開始Docker Compose的構建過程了。

這個構建的過程實際上會生成鏡像,然後使用這些鏡像就可以創建容器了。

然後再使用一個簡單的命令,就可以讓這些服務啟動並運行了。

 

下麵簡單講一下這個docker-compose.yml文件:

第一行是版本。

下麵services,就是服務。

在services里,可以定義當構建docker-compose.yml文件時想要運行的服務,然後把這些鏡像以容器運行。這裡可以定義ASP.NET Core,node,資料庫,緩存等等。

看一下服務里的東西:

  • build,裡面可以定義構建的上下文,例如在哪個文件見來進行構建;還可以指定使用的dockerfile。
  • 在這裡也可以定義環境變數。
  • image,定義鏡像。
  • networks,可以把服務和定義好的網路聯繫起來。
  • ports,定義埠。
  • volumes,定義捲。

也可以在裡面定義networks等等。

 

Docker Compose的命令

  • docker-compose build 把服務構建成鏡像。
  • docker-compose up,一旦鏡像準備好了,那就就執行該命令,啟動那些鏡像,使之成為容器運行。
  • docker-compose down,可以使用該命令停止、刪除由up命令建立的一切東西。

此外還有這些常用形式的命令:

  • docker-compose logs
  • docker-compose ps
  • docker-compose stop
  • docker-compose start
  • docker-compose rm

 

docker-compose build

這個命令會構建/重新構建定義在docker-compose.yml文件里的所有的服務,使用這一個命令就會一次性把所有服務需要的鏡像都創建好。

 

此外還可以構建單獨的服務,例如: docker-compose build mongo。有時候你不想把所有的東西都重新構建一遍,你只想構建其中的一個服務。

 

docker-compose up

一切都構建好之後,就可以啟動並運行了。這時就會使用docker-compose up這個命令。

它會自動創建容器,並運行這些容器。

 

該命令還可以加一些參數,例如 docker-compose up --no-deps node,它表示重新構建node鏡像,停止、銷毀重新創建node,但不重新創建node所依賴的服務。

 

docker-compose down

該命令會停止所有的容器,然後刪除它們。

如果只想停止容器,並不刪除,那麼應該使用docker-compose stop。

 

此外如果你還想同時刪除所有的鏡像和volumes,你可以:

docker-compose down --rmi all --volumes

 

Docker Compose 實例

前面文章里,我通過手動輸入命令實現了一套ASP.NET Core 和 PostgreSQL的docker 應用。儘管該應用很簡單,只有兩部分組成,但當時還是輸入了不少命令,也遇到了幾次錯誤,相對還是繁瑣一些。

現在我把這兩個容器刪掉(包括相應的鏡像和網路都刪掉吧),然後使用docker-compose來實現。

 

建立docker-compose.yml文件

註意,我還沒寫完。

這裡我指定了版本為‘3’,當前也就是這個版本。

然後在services里,我定義了coreweb服務(ASP.NET Core Web應用),它的構建的上下文環境 context是.,也就是當前目錄;使用的dockerfile是標準的Dockerfile;埠是映射到8080,內部埠是5000;使用的網路是aspcore-network。

最後邊定義了網路,名為aspcore-network,類型是bridge橋接網路。

 

然後繼續寫:

這裡又添加了postgres-server這個服務,它是直接使用的官方鏡像postgres,網路還是同一個網路,但是這裡設置了一個環境變數,是資料庫的密碼。

 

執行docker-compose build

定義好docker-compose.yml之後,就可以進行構建了,執行docker-compose build

很快就完成了。

 

然後看一下鏡像列表:

第一個就是我建立的coreweb,其實我們可以自定義它的名稱。

而postgres這個鏡像我早就下載下來了,所以它的創建時間比較早。

 

執行docker-compose up

docker-compose up:

這裡出現了一些問題:這是我第一次運行該項目,運行項目的同時,代碼里會做資料庫的自動遷移,但是ASP.NET Core Web應用先跑起來了,它開始做遷移,然後發現資料庫服務還沒跑起來呢,所以ASP.NET Core項目就報錯了,它的容器就停掉了。而過了一會postgres的服務才啟動完成。。。

 

這也很好辦,現在postgres的服務起來了,那麼,我再手動啟動一下ASP.NET Core Web的容器就可以了。docker-compose start coreweb:

 

然後訪問http://localhost:8080:

網站就可以正常訪問了。

 

現在這種操作還有一點瑕疵,因為docker-compose up之後,終端里都是log,我們處在log模式下,無法做其它操作。需要再打開一個終端來執行其它命令:

 

執行docker-compose down

所以我想重新搞一下,先把這套東西拆了:docker-compose down

 

試驗其它命令

為了避免上述問題,這次我們使用daemon mode 守護進程模式,docker-compose up -d

 

然後我們這次使用這個命令來看進程,docker-compose ps

可以看到這兩個容器,然後Web應用又發生前面的問題了,我在單獨跑一下它:

這次就OK了。

 

再次訪問網站:

還是可以正常運行的。

 

下麵看一下log,docker-compose logs

 

最後銷毀這套東西,這次我把相應的鏡像也刪掉 docker-compose down --rmi all

能刪的都刪除了,但這裡postgres這個鏡像無法刪除是因為我還有其它容器使用該鏡像。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、input()函數 在 Python 中,使用內置函數 input()可以接收用戶的鍵盤輸入。 input()函數的基本用法如 下: 其中,variable 為保存輸入結果的變數,雙引號內的文字用於提示要輸入的內容。 二、print()函數預設的情況下,在Python中,使用內置的print() ...
  • 一:EL表達式 1.概述:在jsp開發中,為了獲取Servlet域對象中存儲的數據,經常要寫很多java代碼,這樣的做法會使JSP頁面混亂,難以維護,為此,在JSP2.0規範中提供了EL表達式。它是Expression Language的縮寫。 2.語法:${表達式} 2.1內置對象: 2.1.1獲 ...
  • 一、引言 官網文檔:http://www.mybatis.org/generator/index.html 通過使用官方提供的mapper自動生成工具,mybatis-generator-core-1.3.2來自動生成po類和mapper映射文件。 作用:mybatis官方提供逆向工程,可以使用它通 ...
  • 1. 什麼是列表 定義: 能裝對象的對象 在python中使用 [] 來描述列表, 內部元素用逗號隔開. 對數據類型沒有要求 列表存在索引和切片. 和字元串是一樣的. 2. 相關的增刪改查操作 添加: 1. append() 追加 2. insert(位置, 元素) 插入指定元素到指定位置 刪除: ...
  • 題意 "題目鏈接" Sol 神仙題Orzzzz 題目可以轉化為從$\leqslant M$的質數中選出$N$個$xor$和為$0$的方案數 這樣就好做多了 設$f(x) = [x \text{是質數}]$ $n$次異或FWT即可 快速冪優化一下,中間不用IFWT,最後轉一次就行(~~然而並不知道為什 ...
  • 1.進程同步/串列(鎖) 進程之間數據不共用,但共用同一套文件系統,所以訪問同一個文件,或同一個列印終端,沒有問題,但共用帶來的是競爭容易錯亂,如搶票時。這就需讓進程一個個的進去保證數據安全,也就是加鎖處理,Lock 併發,效率高,但是競爭同一個文件時,導致數據混亂 加鎖,由併發改成了串列,犧牲了運 ...
  • 最後來看看前面一直說的 Engine(工作引擎) ,工作引擎介面是 在`ServiceProvider IServiceProviderEngine`介面和其實現類的整體結構 IServiceProviderEngine類型繼承關係 繼承了 介面,也就是說工作引擎也具有 GetService() 方 ...
  • ​這篇文章還是回到實際的基礎封裝過程實現層面,用一個小東西來演示如何在常見業務代碼中梳理職責 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...