概述
默認狀況下,Compose 會爲咱們的應用建立一個網絡,服務的每一個容器都會加入該網絡中。這樣,容器就可被該網絡中的其餘容器訪問,不只如此,該容器還能以服務名稱做爲 Hostname 被其餘容器訪問。web
默認狀況下,應用程序的網絡名稱基於 Compose 的工程名稱,而項目名稱基於 docker-compose.yml
所在目錄的名稱。如需修改工程名稱,可以使用 --project-name
標識或 COMPOSE_PORJECT_NAME
環境變量。docker
假如一個應用程序在名爲 myapp 的目錄中,而且 docker-compose.yml
以下所示:網絡
version: '2' services: web: build: . ports: - "8000:8000" db: image: postgres
當咱們運行 docker-compose up
時,將會執行如下幾步:app
- 建立一個名爲 myapp_default 的網絡
- 使用 web 服務的配置建立容器,它以 web 這個名稱加入網絡 myapp_default
- 使用 db 服務的配置建立容器,它以 db 這個名稱加入網絡 myapp_default
容器間可以使用服務名稱(web 或 db)做爲 Hostname 相互訪問。例如,web 這個服務可以使用 postgres://db:5432
訪問 db 容器。post
當服務的配置發生更改時,可以使用 docker-compose up
命令更新配置。此時,Compose 會刪除舊容器並建立新容器。新容器會以不一樣的 IP 地址加入網絡,名稱保持不變。任何指向舊容器的鏈接都會被關閉,容器會從新找到新容器並鏈接上去。ui
使用 links
默認狀況下,服務之間可以使用服務名稱相互訪問。links 容許咱們定義一個別名,從而使用該別名訪問其餘服務。spa
version: '2' services: web: build: . links: - "db:database" db: image: postgres
自定義網絡
一些場景下,默認的網絡配置知足不了咱們的需求,此時咱們可以使用 networks 命令自定義網絡。networks 命令容許咱們建立更加複雜的網絡拓撲並指定自定義網絡驅動和選項。不只如此,咱們還可以使用 networks 將服務鏈接到不是由 Compose 管理的、外部建立的網絡。code
version: '2' services: proxy: build: ./proxy networks: - front app: build: ./app networks: - front - back db: image: postgres networks: - back networks: front: # Use a custom driver driver: custom-driver-1 back: # Use a custom driver which takes special options driver: custom-driver-2 driver_opts: foo: "1" bar: "2"
其中,proxy 服務與 db 服務隔離,二者分別使用本身的網絡;app 服務可與二者通訊。使用 networks 命令,便可方便實現服務間的網絡隔離與鏈接。ci
配置默認網絡
version: '2' services: web: build: . ports: - "8000:8000" db: image: postgres networks: default: # Use a custom driver driver: custom-driver-1
這樣,就可爲該應用指定自定義的網絡驅動io
已存在的網絡
咱們能夠預先建立一個名爲 myapp 的網絡,讓 Compose 加入這個新建立的網絡,使全部 Compose 能夠通訊,此時使用 external 選項。
# 建立網絡 docker network create <Network Name> # 查看已存在的網絡 docker network list networks: default: external: name: myapp