文章目錄
- 基本概念
- 更新容器
- links
- 指定自定義網絡
- 配置預設網絡
- 使用已存在的網絡
基本概念
Docker Compose 的網絡特性适用于 Version 2 file format 以及更高版本中, Version 1 file format 不支援該特性。
預設情況下 Compose 會為應用建立一個預設的網絡,服務的每個容器都會加入該網絡中。這樣容器就可以被該網絡中的其他容器通路,不僅如此,該容器還能以服務名稱作為 hostname 被其他容器通路。
預設情況下,應用程式的網絡名稱基于 Compose 的工程名稱,為 工程_default 的格式。如需使用指定的工程名稱可使用
-p, --project-name NAME
來指定,例如:
docker-compose -p wkk up
。或 COMPOSE_PORJECT_NAME 環境變量。這裡的環境變量是系統的環境變量,比如我現在使用的是 windows 10 那麼就是 windows 10 的環境變量。還有如果是之前已經在一個目錄建構過了 Docker Compose 那麼再次建構,這個環境變量是不生效的。
使用
docker network ls
指令可以檢視所有的網絡:
其中 bridge , host , none 。是 Docker 預設給建立的網絡。target_default 是我們之前執行 Docker Compose 建立的網絡。使用
docker network rm 網絡ID
的方式可以删除指定的網絡。其中 DRIVER 是網絡驅動,bridge 是預設的網絡驅動。
在我的了解中,Docker 的網絡模式實際上就是網絡驅動, none 模式就可以了解成一個是沒有網絡驅動的網絡。我覺得如果抛去網絡模式的概念可能要容易了解很多。我一開始就被網絡,網絡模式,網絡驅動給繞的有點迷糊。個人見解,如果有不對的地方,歡迎指出。
Docker 網絡相關的官網位址:https://docs.docker.com/network/
舉個栗子,假如一個應用程式在 myapp 的目錄中,并且 docker-compose.yml如下所示:
version: '3'
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
預設情況下在 Docker Compose 中,容器之間可以使用服務名稱作為 hostname 互相通路,這一點有些和微服務中有點類似,在 Spring Cloud 中使用了 Rabbon 之後就可在微服務之間通過微服務名稱來互相通路。 這個 links 屬性就是給服務設定别名,用這個别名來作為 hostname 在容器之間互相通路。
栗子:
version: '3'
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
這樣 web 服務就給 db 服務設定了别名為 database 。并且可以通過 database 作為 hostname 通路 db 服務。
指定自定義網絡
如果預設的情況滿足不了我們的需求,可以使用 networks 指令來自定義網絡以及網絡驅動。networks 還可以連接配接 Docker Compose 外部的網絡。
栗子:
version: "3"
services:
proxy:
build: ./proxy
networks:
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
# 使用自定義的網絡驅動
driver: custom-driver-1
backend:
# 使用帶有特殊選項的自定義網絡驅動
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
這段示例就是從 Docker Compose 官方提供的。看起來也很好了解。首先定義了三個服務,proxy、app、db。以及定義了兩個網絡frontend、backend。frontend 使用的網絡驅動是自定義的 custom-driver-1 ,backend 使用的驅動是 custom-driver-2。
proxy 加入了 frontend 網絡, db 加入了 backend 網絡 ,app 則是兩個網絡都加入了。是以 proxy 和 db 之間有網絡隔離,不能互相通信,隻有 app 能同時和二者通信。
version: '3.5'
services:
eureka: # 指定服務名稱
build: . # Dockerfile 的路徑
networks:
- frontend
ports:
- "8761:8761"
networks:
frontend:
name: custom_frontend
在 3.5 版本之後可以使用 name 自定義網絡的名稱。如果不指定網絡名稱,那麼在上文中,網絡名稱就是:target_frontend 的格式。其中 target 是工程名稱,預設是 docker-compose.yml 所在檔案夾的名稱。
配置預設網絡
使用 networks 對預設網絡進行配置:
networks:
default:
name: mynetwork
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
配置都是一樣的,是以不做贅述
使用已存在的網絡
如果不需要建立網絡而是加入已存在的網絡,可以使用一下配置:
networks:
default:
external:
name: my-pre-existing-network
external 表示使用外部的網絡。name 指定外部網絡的名稱。