原文:http://www.itmuch.com/docker/24-docker-compose-network/ ,轉載請說明出處。
本節我們來詳細探討Compose的網絡設置。本節介紹的網絡特性僅適用於Version 2 file format,Version 1 file format不支持該特性。
基本概念
默認情況下,Compose會爲我們的應用創建一個網絡,服務的每個容器都會加入該網絡中。這樣,容器就可被該網絡中的其他容器訪問,不僅如此,該容器還能以服務名稱作爲hostname被其他容器訪問。
默認情況下,應用程序的網絡名稱基於Compose的工程名稱,而項目名稱基於docker-compose.yml所在目錄的名稱。如需修改工程名稱,可使用--project-name標識或COMPOSE_PORJECT_NAME環境變量。
舉個例子,假如一個應用程序在名爲myapp的目錄中,並且docker-compose.yml如下所示:
version: '2'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
當我們運行docker-compose up時,將會執行以下幾步:
- 創建一個名爲myapp_default的網絡;
- 使用web服務的配置創建容器,它以“web”這個名稱加入網絡myapp_default;
- 使用db服務的配置創建容器,它以“db”這個名稱加入網絡myapp_default。
容器間可使用服務名稱(web或db)作爲hostname相互訪問。例如,web這個服務可使用postgres://db:5432
訪問db容器。
更新容器
當服務的配置發生更改時,可使用docker-compose up命令更新配置。
此時,Compose會刪除舊容器並創建新容器。新容器會以不同的IP地址加入網絡,名稱保持不變。任何指向舊容器的連接都會被關閉,容器會重新找到新容器並連接上去。
links
前文講過,默認情況下,服務之間可使用服務名稱相互訪問。links允許我們定義一個別名,從而使用該別名訪問其他服務。舉個例子:
version: '2'
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
這樣web服務就可使用db或database作爲hostname訪問db服務了。
指定自定義網絡
一些場景下,默認的網絡配置滿足不了我們的需求,此時我們可使用networks命令自定義網絡。networks命令允許我們創建更加複雜的網絡拓撲並指定自定義網絡驅動和選項。不僅如此,我們還可使用networks將服務連接到不是由Compose管理的、外部創建的網絡。
如下,我們在其中定義了兩個自定義網絡。
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命令,即可方便實現服務間的網絡隔離與連接。
配置默認網絡
除自定義網絡外,我們也可爲默認網絡自定義配置。
version: '2'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
這樣,就可爲該應用指定自定義的網絡驅動。
使用已存在的網絡
一些場景下,我們並不需要創建新的網絡,而只需加入已存在的網絡,此時可使用external選項。示例:
networks:
default:
external:
name: my-pre-existing-network