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

solenovex發表於2018-11-30

第一篇:把程式碼連線到容器 

第二篇:定製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這個映象無法刪除是因為我還有其它容器使用該映象。

相關文章