Docker最全教程——從理論到實戰(四)

雪雁發表於2018-12-05

往期內容連結

https://www.cnblogs.com/codelove/p/10030439.html

https://www.cnblogs.com/codelove/p/10036608.html

https://www.cnblogs.com/codelove/p/10056866.html

 

在筆者參加騰訊容器服務技術交流會時,我們瞭解到了藏區牧民的目前的生活艱辛狀況,因此除了在同事朋友之間推薦其土特產之外,我們也在此進行初步分享,希望略盡綿薄之力,能夠幫助到他們:

貨真價實、確保都是3700米海拔以上的超風乾犛牛肉,115元一斤包郵(貨真價實、低於淘寶京東、我們不賺差價),有香辣、五香兩種口味,三斤犛牛肉才能做出一斤超風乾牛肉!希望這個冬天,我們能夠給他們一點點溫暖!有購買意向的朋友可以聯絡博主。

 

 

建立自定義 Docker 映象

 

建立了Dockerfile之後,需為應用程式中的每項服務建立一個相關映象。如果應用程式由單個服務或 Web 應用程式組成,則只需建立一個映象。

我們可以使用docker build命令來建立映象,例如:

docker build ./ -t {映象名稱}

映象打包好後,我們使用docker image ls命令即可檢視當前映象:

注意:Docker映象使用分層儲存的架構,也就是說映象實際是由多層檔案系統聯合組成。映象構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。因為分層儲存的特徵,使得映象的複用、定製變的更為容易。甚至可以用之前構建好的映象作為基礎層,然後進一步新增新的層,以定製自己所需的內容,構建新的映象。所以,當我們使用Docker images命令,會列出這麼多的映象,我們可以定期清理那些無用的映象。

如果使用 Visual Studio 建立帶 Docker 支援的專案時,不會顯式建立映象。我們按下 F5 並執行時,VS就會自動建立映象,不會出現明顯的過程(在輸出皮膚可以瞭解整個過程,如下圖所示),但我們需要了解其原理,否則出現問題將無從下手。

 

在 docker-compose.yml中定義服務

 

關於Compose

Compose是一個用於定義和執行多Docker應用程式的工具。使用Compose,我們可以使用YAML檔案來配置應用程式的服務。然後,使用單個命令,我們就可以從配置中建立並啟動所有服務。

Compose適用於所有環境:生產環境、模擬(演示)環境、開發環境和測試環境以及CI工作流程。

主要功能和特性:

  • 單個主機上的多個隔離環境

    Compose使用專案名稱來隔離環境,因此可以根據不同的環境要求來進行定義。

  • 建立容器時保留卷資料

    Compose會保留服務使用的所有卷和資料。當使用docker-compose up命令執行時,如果發現該服務之前執行過,它會將進行增量操作,可確保在卷中建立的資料都不會丟失。

  • 僅重新建立已更改的容器

    Compose存在快取,可用於建立容器。當重新啟動未更改的服務時,Compose將重用現有容器。

  • 可以定義變數,而且可以根據不同環境不同使用者之間進行組合使用

    Compose支援Compose檔案的變數定義,我們可以使用這些變數為不同環境或不同使用者進行自定義組合。

另外,Compose能夠通過命令管理應用程式的整個生命週期,通過命令可以:

  • 啟動,停止和重建服務等

  • 檢視正在執行的服務的狀態

  • 通過流輸出正在執行的服務的日誌

  • 對某個服務執行命令

注意:Docker for Windows安裝包括:安裝提供 Docker Engine,Docker CLI客戶端,Docker Compose,Docker Machine和 Kitematic。也就是如果是使用Docker for Windows的使用者,無需再獨立安裝Docker Compose。

我們可以通過執行以下命令來確認我們本地的環境:

docker-compose -v

 

常見場景

  • 開發或本地環境執行多個服務

    在開發過程時,在隔離環境中執行應用程式並與之互動的能力至關重要。Compose命令列工具可用於建立環境並與之互動。比如通過Compose檔案,配置所有應用程式的服務依賴(資料庫,訊息佇列,快取記憶體,Web服務的API,等等),然後使用單個命令(docker-compose up)為每個依賴項建立和啟動一個或多個容器,使整個程式能夠正常執行起來。

  • 自動化測試環境

    任何持續部署或持續整合過程的一個重要部分是自動化測試套件。自動化端到端測試需要一個執行測試的環境。Compose提供了一種方便的方法來建立和銷燬隔離的測試環境。我們只需要通過在Compose檔案,即可定義完整環境,並且可以在幾個命令中建立和銷燬這些環境,如下所示:

  • 單主機部署

 

使用Compose

使用Compose有以下三個步驟:

  1. 使用Dockerfile定義應用環境,以便在任意地方進行復制

  2. 在 docker-compose.yml 中定義組合應用,以便它們可以在隔離的環境中一起執行

  3. 最後,執行docker-compose up命令,Compose 將啟動並執行整個應用程式。

由此可見,第二步決定了Compose的執行,一個簡單的docker-compose.yml檔案如下所示:

其定義了web和redis兩個應用。接下來,我們一起來了解docker-compose.yml 檔案。

 

瞭解docker-compose.yml

藉助 docker-compose.yml 檔案,我們可以定義一組相關服務,通過部署命令將其部署為組合應用程式。簡單的說,我們可以通過docker-compose.yml來定義多個服務,以便一次執行。

這裡筆者以Magicodes.Admin為例,基礎框架提供了後臺介面服務以及後臺前端應用兩個,那麼我們可以定義docker-compose.yml 檔案以便部署為組合應用程式,也就是說,一個命令託管和執行多個服務:

以上是一個簡化的配置,定義了兩個服務以及環境變數和埠。值得說明的是,在docker中我們無法訪問localDb,這時我們建議訪問獨立的資料庫服務或者使用資料庫映象,例如:

sql.data:

image: mssql-server-linux:latest

environment:

- SA_PASSWORD=Pass@word

- ACCEPT_EULA=Y

ports:

- "5433:1433"

注意:SQL Server也提供了Docker映象,並且支援Linux容器。在上面的配置中,通過環境變數設定了sa賬號的密碼。值得注意的是,我們並不推薦在生產環境中使用資料庫的容器映象來託管資料,這點我們後續再來詳聊。

 

瞭解YAML語言

很多教程並不會講述這點,但是筆者認為這點也非常重要,因為了解YAML的語法和規範,可以在開發調測的過程中避免很多錯誤,也便於我們更好的配置基於YAML語法的檔案——比如docker-compose.yml檔案。

 

什麼是YAML?

YAML 是一種簡潔的非標記語言。YAML以資料為中心,使用空白,縮排,分行組織資料,從而使得表示更加簡潔易讀。

這裡提供一個YAML語法驗證網站:http://nodeca.github.io/js-yaml/

基本規則

  1. 大小寫敏感

  2. 使用縮排表示層級關係

  3. 禁止使用tab縮排,只能使用空格鍵

  4. 縮排長度沒有限制,只要元素對齊就表示這些元素屬於一個層級

  5. 使用#表示註釋

  6. 字串可以不用引號標註

YAML中允許表示三種格式,分別是常量值,物件和陣列,如下所示:

對於YAML的講解,我們就說到這裡,我們繼續本篇內容。

 

docker-compose.yml檔案配置項

docker-compose.yml 檔案不僅指定正在使用的容器,還指定如何單獨配置各容器。常用的配置項如下所示:

  • build:定義映象生成,可以指定Dockerfile檔案所在的目錄路徑,支援絕對路徑和相對路徑;

  • image:從指定的映象中啟動容器,可以是儲存倉庫、標籤以及映象 ID,如果映象不存在,Compose 會自動拉去映象;

  • environment:定義環境變數和配置;

  • ports:定義埠對映,比如上面配置中將容器上的公開埠 80 轉接到主機上的外部埠 9901和9902;

  • depends_on,定義依賴關係。此定義會讓當前服務處於等待狀態,直到這些依賴服務啟動。比如某個服務依賴資料庫服務,那麼通過此配置解決了服務的啟動順序的問題;

  • volumes,掛載一個目錄或者一個已存在的資料卷容器,可以直接使用 HOST:CONTAINER 這樣的格式,或者使用 HOST:CONTAINER:ro 這樣的格式,後者對於容器來說,資料卷是隻讀的,這樣可以有效保護宿主機的檔案系統;

  • context,指定Dockerfile 的檔案路徑,也可以是到連結到 git 倉庫的 url;

  • args,指定構建引數,這些引數只能在構建過程中訪問;

  • target,定義構建指定的階段Dockerfile,比如針對不同階段使用不同的dockerfile,開發階段使用支援編譯除錯的dockerfile,而生產環境,則使用輕量級的dockerfile;command,覆蓋預設命令;

  • container_name,指定自定義容器名稱,而不是生成的預設名稱。

由於篇幅有限,我們就不提供過多介紹和示例了。不過我們建議大家訪問此地址,來做一個全面的瞭解:

https://docs.docker.com/compose/compose-file/#reference-and-guidelines

最後,分享幾個小技巧:

  • 可以通過配置項depends_on來定義依賴關係,這點對於控制服務的執行順序尤為重要,比如先啟動資料庫然後再啟動web服務。

  • 如何使用JSON檔案進行配置?可以指定檔名稱,如下所示:

    docker-compose -f docker-compose.json up

  • 如何分階段構建?推薦使用target配置項。

 

Visual Studio和docker-compose

我們定義完docker-compose.yml之後,如果是使用Visual Studio進行開發,通過其Docker tool會讓開發調測變得非常簡單和易用。對於未啟用docker支援的專案,我們可以通過右鍵選單進行啟用:

啟用之後,會自動新增相關支援(包括生成dockerfile、docker-compose.yml以及.dockerignore等),然後通過其docker工具可以直接啟動執行並且支援除錯,如下圖所示:

點選工具欄的【Docker】按鈕或者按下【F5】均可直接執行並除錯,啟動後如下圖所示:

執行完成後,VS還會自動開啟相關服務的預設頁。

如果不依賴Visual Studio進行執行,我們在下節進行講述。

相關文章