本文首發自“Docker公司”公眾號(ID:docker-cn)
編譯丨小東
每周一、三、五 與您不見不散!
Docker Compose 在開發人員中非常流行,它用來描述應用程序。目前,GitHub 上有超過30萬個 Docker Compose 文件。通過在 docker-compose.yml 文件中對一組服務進行描述,就可以在 Docker 上用一條命令輕松的啟動一個復雜的多服務應用程序(或簡單的單服務應用程序)。這種易用性使得 Docker Compose 非常適合開發團隊快速開展項目。
隨著時間的推移,Compose 不斷發展并添加了許多功能可以在將相同的應用程序部署到生產環境時提供幫助,例如,指定大量副本、內存資源限制或自定義系統日志服務器。但這些屬性可能會跟您自己的環境有所差異。有許多不同的策略來解決這個問題,但是最常見的就是依賴于復制和粘貼。例如,為在不同環境中運行的同一應用程序維護多個 Compose 文件是相當常見的,但這會導致了兩個問題:
- 我們一直都在分享 Docker 鏡像,但卻沒有一個很好的方法來共享使用它們的多服務應用程序;
- 開發人員和運維人員很難圍繞 Compose 文件進行協作。這淡化了在代碼中描述應用程序的其中一項關鍵優勢 —— 即開發人員和操作人員使用同一個 Compose 文件的機會,并在產品投入生產之前捕獲配置問題;
介紹 docker-app
解決這個問題的一種方法是通過構建一個與 Compose 相輔相成的工具來使它更容易用于共享和協作。請注意,這是實驗性的,還有很多工作正在進行中,但我們希望獲得早期采用者的反饋和意見,這會:
- 使基于Compose 的應用程序可以共享在 Docker Hub 和 DTR 上;
- 支持在應用程序描述和每個環境設置之間更緊密的關注點分離;
該實現包含一些額外的元數據文件和一個小型命令行工具。讓我們來舉個簡單的例子。
使用下面的 Compose 文件。它啟動一個HTTP服務器,當觸發配置的端口時,它會顯示出指定的文本。
version: '3.6'services:hello:image: hashicorp/http-echocommand: ["-text", "hello world"]ports:- 5678:5678
用 docker-app 命令安裝,讓我們基于這個 Compose 文件創建一個應用程序包:
$ docker-app init --single-file hello$ lsdocker-compose.ymlhello.dockerapp
這個應用程序包只是一個文本文件(或者是一個目錄),在這個例子中叫做 hello.dockerapp。它包含三個YAML文檔:
- 一些元數據
- Compose 文件
- 應用程序的一些設置
它應該是這樣的:
# This section contains your application metadata.version: 0.1.0name: hellodescription: ""maintainers:- name: yourusernameemail: ""targets:swarm: truekubernetes: true--# This section contains the Compose file that describes your application services.version: '3.6'services:hello:image: hashicorp/http-echocommand: ["-text", "hello world"]ports:- 5678:5678--# This section contains the default values for your application settings.{}
讓我們編輯設置部分(替換 {})并為我們的應用程序添加以下默認值:
port: 5678text: hello developmentversion: latest
然后修改 Compose 文件部分,添加一些變量:
version: '3.6'services:hello:image: hashicorp/http-echo:${version}command: ["-text", "${text}"]ports:- ${port}:5678
最后,您可以通過使用所提供的默認值渲染 Compose 文件來進行測試。
$ docker-app renderversion: "3.6"services:hello:command:- -text- hello developmentimage: hashicorp/http-echo:latestports:- mode: ingresstarget: 5678published: 5678protocol: tcp
請注意,這些變量已經被設置值替換。之后,您可以像使用其他 Compose 文件一樣來使用該 Compose 文件了。您可以將其保存到磁盤或 Docker 應用棧中亦或是使用 docker-compose 命令來啟動應用程序。
$ docker-app render | docker-compose -f – up
這就是它有趣的地方。我們可以在運行時使用 --set 選項來覆蓋這些設置。讓我們指定不同的選項并再次運行渲染:
$ docker-app render --set version=0.2.3 --set port=4567 --set text="hello production"version: "3.6"services:hello:command:- -text- hello productionimage: hashicorp/http-echo:0.2.3ports:- mode: ingresstarget: 5678published: 4567protocol: tcp
請注意在生成的 Compose 文件中對端口和版本進行更改。
如果你愿意,你可以創建一個獨立的配置文件來存儲這些設置。 讓我們用以下內容創建prod.yml
:
version: 0.2.3text: hello productionport: 4567
然后,您可以使用該配置文件顯示 Compose 文件,如下所示:
$ docker-app render -f prod.yml
這樣就可以很容易地為不同的環境單獨的設置文件了,從而減少了復制整個 Compose 文件的需要。
如果您想要超越hello world,我們還準備了一些更高級的例子。
您可以在 Docker Compose 中使用環境變量支持來實現與上述類似的內容,但需要您自己編寫工具來提供一個不錯的用戶界面。有了上述慣例,我們可以在上面創建更有趣的東西。 例如,我們可以構建相當有趣的自省工具,就像下面所示的那樣,我們計劃將簡單的變量替換轉換為更復雜的模板。
檢查和部署應用程序包
docker-app 命令不僅提供了用不同設置來渲染 Compose 文件的方法。它還提供了一些實用工具來與它們進行交互。例如,如果有人給你一個 .dockerapp,這時你可以很容易地了解它的信息,特別是在運行時發現哪些設置是可用的,而不需要讀取任何包代碼。
$ docker-app inspecthello 0.1.0Maintained by: garethA hello world example of a Docker application package.Setting Default------- -------port 8080text hello worldversion latest
一旦準備好部署應用程序的一個版本,您就可以使用子命令進行部署了。它的工作方式與 docker 應用棧的部署命令完全相同,因此您應該很熟悉這一點。例如,如果您使用的是Docker Desktop 或 Docker EE,那么您就可以將應用程序部署到 Kubernetes,同時覆蓋一些暴露的設置。
$ docker-app deploy --set port=4567 --orchestrator=kubernetes
docker-app 還有很多實用的工具,你可以在內置的幫助信息中找到,或者等待后續的文章推送。
感興趣嗎?
如果您感興趣的話,可以瀏覽 https://github.com/docker/app 來訪問 GitHub 倉庫。您將會看到基本的文檔和幾個示例,以及下載最新版本(針對Windows、macOS或Linux)和應用程序源代碼的說明。如果您在有任何問題、想法都可以在這個鏡像倉庫中提交給我們。