往期內容鏈接
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有以下三個步驟:
-
使用Dockerfile定義應用環境,以便在任意地方進行復制
-
在 docker-compose.yml 中定義組合應用,以便它們可以在隔離的環境中一起運行
-
最后,執行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/
基本規則
-
大小寫敏感
-
使用縮進表示層級關系
-
禁止使用tab縮進,只能使用空格鍵
-
縮進長度沒有限制,只要元素對齊就表示這些元素屬於一個層級
-
使用#表示注釋
-
字符串可以不用引號標注
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進行運行,我們在下節進行講述。
