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

第一篇:把代碼鏈接到容器 html

第二篇:定製Docker鏡像node

第三篇:發佈鏡像web

第四篇:容器間的鏈接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文件就是用來配置服務的,這裏有一個官網給出的例子:post

 

這個文件寫好以後,就能夠開始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這個鏡像沒法刪除是由於我還有其它容器使用該鏡像。

相關文章
相關標籤/搜索