在 Docker Compose 中定義和管理網路

網路允許服務之間進行通訊。預設情況下,Compose 為您的應用程式設定一個單獨的網路。每個服務的容器都加入預設網路,並且該網路上的其他容器可以訪問,也可以透過服務的名稱發現。頂層 `networks` 元素允許您配置可在多個服務之間重用的命名網路。

要在多個服務中使用網路,您必須使用頂級 `services` 元素中的 networks 屬性顯式授予每個服務訪問許可權。 `networks` 頂級元素具有提供更精細控制的附加語法。

示例

基本示例

在以下示例中,在執行時建立了網路 `front-tier` 和 `back-tier`,並且 `frontend` 服務連線到 `front-tier` 和 `back-tier` 網路。

services:
  frontend:
    image: example/webapp
    networks:
      - front-tier
      - back-tier

networks:
  front-tier:
  back-tier:

高階示例

services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # Specify driver options
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
  backend:
    # Use a custom driver
    driver: custom-driver

此示例顯示了一個定義了兩個自定義網路的 Compose 檔案。`proxy` 服務與 `db` 服務隔離,因為它們沒有共享一個公共網路。只有 `app` 可以與兩者通訊。

預設網路

當 Compose 檔案未宣告顯式網路時,Compose 會使用隱式 `default` 網路。沒有顯式 networks 宣告的服務由 Compose 連線到此 `default` 網路。

services:
  some-service:
    image: foo

這個例子實際上等同於

services:
  some-service:
    image: foo
    networks:
      default: {}  
networks:
  default: {}      

您可以使用顯式宣告自定義 `default` 網路

networks:
  default: 
    name: a_network # Use a custom name
    driver_opts:    # pass options to driver for network creation
      com.docker.network.bridge.host_binding_ipv4: 127.0.0.1

有關選項,請參閱 Docker Engine 文件

屬性

可連線

如果 `attachable` 設定為 `true`,則除了服務之外,獨立容器也應該能夠連線到此網路。如果獨立容器連線到網路,它就可以與也連線到網路的服務和其他獨立容器進行通訊。

networks:
  mynet1:
    driver: overlay
    attachable: true

驅動程式

`driver` 指定此網路應使用的驅動程式。如果平臺中沒有可用的驅動程式,Compose 將返回錯誤。

networks:
  db-data:
    driver: bridge

有關驅動程式和可用選項的更多資訊,請參閱 網路驅動程式

driver_opts

`driver_opts` 指定要傳遞給驅動程式的鍵值對列表作為選項。這些選項取決於驅動程式。

networks:
  frontend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"

有關更多資訊,請查閱 網路驅動程式文件

啟用 IPv4

要求: Docker Compose 2.33.1 及更高版本

`enable_ipv4` 可用於停用 IPv4 地址分配。

  networks:
    ip6net:
      enable_ipv4: false
      enable_ipv6: true

啟用 IPv6

`enable_ipv6` 啟用 IPv6 地址分配。

  networks:
    ip6net:
      enable_ipv6: true

外部的

如果設定為 `true`

  • `external` 指定此網路的生命週期在應用程式的生命週期之外維護。Compose 不會嘗試建立這些網路,如果不存在則返回錯誤。
  • 除名稱以外的所有其他屬性均不相關。如果 Compose 檢測到任何其他屬性,它會將 Compose 檔案視為無效。

在以下示例中,`proxy` 是通往外部世界的閘道器。Compose 不會嘗試建立網路,而是向平臺查詢名為 `outside` 的現有網路,並將 `proxy` 服務的容器連線到該網路。

services:
  proxy:
    image: example/proxy
    networks:
      - outside
      - default
  app:
    image: example/app
    networks:
      - default

networks:
  outside:
    external: true

IPAM

`ipam` 指定自定義 IPAM 配置。這是一個具有多個屬性的物件,每個屬性都是可選的:

  • `driver`:自定義 IPAM 驅動程式,而不是預設驅動程式。
  • `config`:包含零個或多個配置元素的列表,每個元素包含一個
    • `subnet`:CIDR 格式的子網,表示一個網路段
    • `ip_range`:用於分配容器 IP 的 IP 範圍
    • `gateway`:主子網的 IPv4 或 IPv6 閘道器
    • `aux_addresses`:網路驅動程式使用的輔助 IPv4 或 IPv6 地址,以主機名到 IP 的對映形式
  • `options`:特定於驅動程式的選項,以鍵值對映形式。
networks:
  mynet1:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
          ip_range: 172.28.5.0/24
          gateway: 172.28.5.254
          aux_addresses:
            host1: 172.28.1.5
            host2: 172.28.1.6
            host3: 172.28.1.7
      options:
        foo: bar
        baz: "0"

內部的

預設情況下,Compose 提供對網路的外部連線。當 `internal` 設定為 `true` 時,您可以建立外部隔離的網路。

labels

使用 `labels` 為容器新增元資料。您可以使用陣列或字典。

建議您使用反向 DNS 符號,以防止標籤與其他軟體使用的標籤衝突。

networks:
  mynet1:
    labels:
      com.example.description: "Financial transaction network"
      com.example.department: "Finance"
      com.example.label-with-empty-value: ""
networks:
  mynet1:
    labels:
      - "com.example.description=Financial transaction network"
      - "com.example.department=Finance"
      - "com.example.label-with-empty-value"

Compose 設定 `com.docker.compose.project` 和 `com.docker.compose.network` 標籤。

name

`name` 設定網路的自定義名稱。 `name` 欄位可用於引用包含特殊字元的網路。名稱按原樣使用,不與專案名稱作用域。

networks:
  network1:
    name: my-app-net

它還可以與 `external` 屬性結合使用,以定義 Compose 應檢索的平臺網路,通常透過使用引數,這樣 Compose 檔案就不需要硬編碼執行時特定值。

networks:
  network1:
    external: true
    name: "${NETWORK_ID}"

其他資源

有關更多示例,請參見 Compose 中的網路