開始使用DOCKER COMPOSE V2

夢哲 發表於 2022-06-03
Docker

Compose V2 專案啟動於2021年6月,直到2022年4月26號,釋出了GA版本。在釋出GA版本後,社群也宣佈對於Compose V1將不會再進行功能更新,將在6個月後結束生命週期(EOL),期間會進行關鍵的安全和錯誤修復。

V1與V2的相容對比

確保 V1 和 V2 之間的相容性對於日常工作流程至關重要,下面是V2中兩個關鍵的更改

更改潛在影響遷移
V2原生支援BuildKit,並且預設開啟開發者在V2中將預設使用BuildKit進行映象構建可通過設定環境變數不使用 DOCKER_BUILDKIT=0
容器名字中使用 - 替代了 _ 作為分隔符如果在指令碼中使用了容器名字,這可能會導致錯誤可以通過 "--compatibility" 標記來關閉此更改

關於更多的相容性更改,請檢視相容性文件

如何安裝Compose V2

Windows,MacOS和Linux上使用Docker Desktop,就自帶了Compose V2,可通過命令 docker compose 執行。也可以通過配置“Use Docker Compose V2“來設定 docker-compose 別名到 docker compose

desktop-compose-v2

如果沒有使用Docker Desktop for Linux,而是直接使用的Docker Engine,則需要額外安裝 docker-compose-plugin 或者獨立的二進位制包。

例如對於Ubuntu,可以通過Docker官方的APT源直接安裝

❯ sudo apt update
❯ sudo apt install docker-compose-plugin

其他Linux, 例如在我的 openSUSE 上,通過手動從Github下載二進位制檔案進行安裝(注意選擇版本和平臺架構)

❯ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
❯ mkdir -p $DOCKER_CONFIG/cli-plugins
❯ wget https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64
❯ mv docker-compose-linux-x86_64 $DOCKER_CONFIG/cli-plugins/docker-compose
❯ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

執行一下命令測試

❯ docker compose version
Docker Compose version 2.6.0

更多安裝方式,請檢視官方文件

Compose V2的優勢

在Docker CLI中快速交付新功能

  • 支援GPU主機 - 如果Docker主機有GPU裝置(顯示卡)並且Docker引擎進行了相關配置, 則Compose服務可以定義GPU裝置的預留。
  • 支援配置服務啟用(Profiles) - 通過選擇性伺服器啟用來為多種用途和環境啟動Compose應用模型,如下Compose檔案
version: "3.9"
services:
  frontend:
    image: frontend
    profiles: ["frontend"]

  phpmyadmin:
    image: phpmyadmin
    depends_on:
      - db
    profiles:
      - debug

  backend:
    image: backend

  db:
    image: mysql

預設執行 docker compose up 將只會啟動 backenddb 服務,要啟動相應配置的服務,需要使用 --profile 標記或者設定環境變數 COMPOSE_PROFILES,例如

❯ docker compose --profile debug --profile frontend up
❯ COMPOSE_PROFILES=frontend,debug docker compose up
  • 新增了 cp 命令 - 在服務容器和本地檔案系統直接拷貝檔案和目錄
  • 新增了 ls 命令 - 列出當前環境中的Compose專案(應用棧)

開發到生產的無縫轉換

通過雲整合專案,可以容易的使用Compose V2將多容器應用部署到AWS ECS或者Azure ACI環境。

具體示例可參考 Deploying WordPress to the Cloud

在Golang中建立一個同構的Docker生態系統

在Compose V2之前,V1是使用Python語言編寫的,不在Docker的語言生態系統裡。而V2使用Golang語言編寫,可以提供來自Moby、CLI或任何基於Golang的專案程式碼,減少了很多通過Python重寫新功能或缺陷的開發,容易從其他Docker工具(例如BuildKit)增加新功能到Compose中。

通過Golang,現在可以釋出一個靜態的二進位制執行檔案,相比Python,大大簡化了更新和依賴管理。

在沒有Compose檔案的情況下執行命令

Compose V2可以在以下情況下通過 --project-name|-p 選項來管理執行的Compose專案容器服務

  • 當前目錄不包含專案Compose檔案(不在Compose專案檔案目錄下)
  • 不通過 --file 標記指定Compose檔案
  • 不通過 --project-directory 標記指定Compose專案目錄

可執行的命令: psexec,startstoprestartdown

可以先通過 docker compose ls 列出當前環境的Compose專案

❯ docker compose ls
NAME                STATUS              CONFIG FILES
dbweb               running(1)          docker-compose.yml
monitor             running(1)          /home/mengz/dockerapp/monitor/docker-compose.yml
traefik             running(1)          /home/mengz/dockerapp/traefik/docker-compose.yml
truenas             running(1)          /home/mengz/dockerapp/truenas/docker-compose.yml

然後通過 -p <專案名> 命令 來管理專案服務

❯ docker compose -p dbweb ps
NAME                COMMAND             SERVICE             STATUS              PORTS
dbweb_pgadmin       "/entrypoint.sh"    pgadmin             running             443/tcp

❯ docker compose -p dbweb exec pgadmin sh
/pgadmin4 $ exit

總結

這裡簡單介紹了Docker Compose V2的一些特性和功能,隨著V1的逐漸淘汰,我們要擁抱V2,並且嘗試其提供的新功能。
關於詳細的Docker Docker,請參考官方文件

參考:

同時釋出在【Mengz's Blog