服務頂層元素

目錄

服務是應用程式中運算資源的抽象定義,可以獨立於其他組件進行擴展或替換。服務由一組容器支援,平台根據複本需求和放置限制運行這些容器。由於服務由容器支援,因此它們由 Docker 映像檔和一組執行時參數定義。服務中的所有容器都使用這些參數相同地建立。

Compose 檔案必須宣告一個名為 services 的頂層元素,它是一個映射 (map),其鍵 (key) 是服務名稱的字串表示,而其值 (value) 是服務定義。服務定義包含應用於每個服務容器的配置。

每個服務還可以包含一個 build 區段,該區段定義如何為服務創建 Docker 鏡像。Compose 支援使用此服務定義構建 Docker 鏡像。如果未使用,則 build 區段將被忽略,並且 Compose 檔案仍然被視為有效。構建支援是 Compose 規範的一個可選方面,在 Compose 構建規範 文件中有詳細說明。

每個服務都定義了運行其容器的運行時約束和要求。deploy 區段將這些約束分組,並允許平台調整部署策略,以使容器的需求與可用資源最佳匹配。部署支援是 Compose 規範的一個可選方面,在 Compose 部署規範 文件中有詳細說明。如果未實作,則 deploy 區段將被忽略,並且 Compose 檔案仍然被視為有效。

範例

簡單範例

以下範例示範如何使用 Docker Compose 定義兩個簡單的服務、設置其鏡像、映射埠和配置基本的環境變數。

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: example
      POSTGRES_DB: exampledb

進階範例

在以下範例中,proxy 服務使用 Nginx 鏡像,將本機 Nginx 配置檔案掛載到容器中,公開埠 80 並依賴於 backend 服務。

backend 服務從位於 backend 目錄中的 Dockerfile 構建一個鏡像,該鏡像設置為在 builder 階段構建。

services:
  proxy:
    image: nginx
    volumes:
      - type: bind
        source: ./proxy/nginx.conf
        target: /etc/nginx/conf.d/default.conf
        read_only: true
    ports:
      - 80:80
    depends_on:
      - backend

  backend:
    build:
      context: backend
      target: builder

更多 Compose 檔案範例,請瀏覽 Awesome Compose 範例屬性

annotations(註釋)

annotations 定義容器的註釋。annotations 可以使用陣列或映射。

annotations:
  com.example.foo: bar
annotations:
  - com.example.foo=bar

attach(附加)

Docker Compose 版本 2.20.0 中引入

attach 被定義並設置為 false 時,Compose 不會收集服務日誌,直到您明確要求它這樣做。

預設服務配置為 attach: true

build(建置)

build 指定從原始碼創建容器鏡像的構建配置,如 Compose 構建規範 中所定義。

blkio_config(區塊 I/O 設定)

blkio_config 定義一組配置選項,用於設置服務的區塊 IO 限制。

services:
  foo:
    image: busybox
    blkio_config:
       weight: 300
       weight_device:
         - path: /dev/sda
           weight: 400
       device_read_bps:
         - path: /dev/sdb
           rate: '12mb'
       device_read_iops:
         - path: /dev/sdb
           rate: 120
       device_write_bps:
         - path: /dev/sdb
           rate: '1024k'
       device_write_iops:
         - path: /dev/sdb
           rate: 30

device_read_bps, device_write_bps

設定給定設備上讀/寫操作的每秒位元組數限制。列表中的每個項目都必須包含兩個鍵

  • path:定義受影響設備的符號路徑。
  • rate:以表示位元組數的整數值或表示位元組值的字串表示。

device_read_iops, device_write_iops

設定給定設備上讀/寫操作的每秒操作數限制。列表中的每個項目都必須包含兩個鍵

  • path:定義受影響設備的符號路徑。
  • rate:表示允許的每秒操作數的整數值。

weight

修改分配給服務的頻寬比例,相對於其他服務。取值範圍為 10 到 1000 的整數,預設值為 500。

weight_device

微調按設備分配的頻寬。列表中的每個項目都必須包含兩個鍵

  • path:定義受影響設備的符號路徑。
  • weight:介於 10 到 1000 之間的整數值。

cpu_count(CPU 核心數)

cpu_count 定義服務容器可用的 CPU 數量。

cpu_percent(CPU 使用百分比)

cpu_percent 定義可用 CPU 的百分比。

cpu_shares(CPU 股份)

cpu_shares 以整數值定義服務容器相對於其他容器的相對 CPU 權重。

cpu_period(CPU 周期)

當平台基於 Linux 核心時,cpu_period 配置 CPU CFS(完全公平排程器)週期。

cpu_quota(CPU 配額)

當平台基於 Linux 核心時,cpu_quota 配置 CPU CFS(完全公平排程器)配額。

cpu_rt_runtime(CPU 即時執行時間)

cpu_rt_runtime 為支援即時排程器的平台配置 CPU 分配參數。它可以是使用微秒作單位的整數值,也可以是 持續時間

 cpu_rt_runtime: '400ms'
 cpu_rt_runtime: 95000`

cpu_rt_period(CPU 即時週期)

cpu_rt_period 為支援即時排程器的平台配置 CPU 分配參數。它可以是使用微秒作單位的整數值,也可以是 持續時間

 cpu_rt_period: '1400us'
 cpu_rt_period: 11000`

cpus(CPU 核心數)

cpus 定義要分配給服務容器的(可能是虛擬的)CPU 數量。這是一個分數。0.000 表示沒有限制。

設置時,cpus 必須與 部署規範 中的 cpus 屬性一致。

cpuset(CPU 親和性)

cpuset 定義允許執行的明確 CPU。可以是範圍 0-3 或列表 0,1

cap_add(新增功能)

cap_add 以字串形式指定額外的容器 權限

cap_drop(移除功能)

cap_drop 以字串形式指定要捨棄的容器 權限

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

cgroup(控制群組)

Docker Compose 版本 2.15.0 引進的功能

cgroup 指定要加入的 cgroup 命名空間。如果未設定,則由容器運行時決定要使用哪個 cgroup 命名空間(如果支援)。

cgroup_parent(父控制群組)

cgroup_parent 指定容器的選用父 cgroup

command(命令)

command 會覆寫容器映像檔宣告的預設指令,例如 Dockerfile 的 CMD

command: bundle exec thin -p 3000

該值也可以是一個列表,其方式類似於 Dockerfile

command: [ "bundle", "exec", "thin", "-p", "3000" ]

如果值為 null,則使用映像檔中的預設指令。

如果值為 [](空列表)或 ''(空字串),則忽略映像檔宣告的預設指令,即覆寫為空。

configs(設定)

設定檔允許服務在無需重建 Docker 映像檔的情況下調整其行為。服務只能在 configs 屬性明確授予的情況下存取設定檔。支援兩種不同的語法變體。

如果在平台上不存在 config 或未在 Compose 檔案的 configs 頂層元素 中定義,Compose 將會回報錯誤。

設定檔定義了兩種語法:簡短語法和完整語法。

您可以授予服務存取多個設定檔的權限,並且可以混合使用簡短語法和完整語法。

簡短語法

簡短語法變體僅指定設定檔名稱。這會授予容器存取設定檔的權限,並將其作為檔案掛載到服務容器的檔案系統中。容器內掛載點的位置在 Linux 容器中預設為 /<config_name>,在 Windows 容器中預設為 C:\<config-name>

以下範例使用簡短語法授予 redis 服務存取 my_configmy_other_config 設定檔的權限。my_config 的值設定為檔案 ./my_config.txt 的內容,而 my_other_config 定義為外部資源,這表示它已在平台中定義。如果外部設定檔不存在,則部署將會失敗。

services:
  redis:
    image: redis:latest
    configs:
      - my_config
      - my_other_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

完整語法

完整語法在如何在服務的任務容器中建立設定檔方面提供了更高的粒度。