Docker Compose 中的 links 和 depends_on 的區別
一、概述
Docker 容器在我們的系統中作為獨立進程運行。然而,我們通常希望他們相互交流和傳遞信息。
在本教程中,我們將通過一些使用 Docker Compose 的實際示例來了解 Docker links
和depends_on
之間的區別。
2. Docker Compose depends_on
depends_on
是一個 Docker Compose 關鍵字,用於設置服務必須啟動和停止的順序。
例如,假設我們希望我們將構建為web-app
映像的 Web 應用程序在 Postgres 容器之後啟動。讓我們看一下docker-compose.yml
文件:
services:
db:
image: postgres:latest
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- 5432:5432
web-app:
image: web-app:latest
ports:
- 8080:8080
depends_on:
- db
Docker 將根據給定的依賴關係拉取圖像並運行容器。因此,在這種情況下,Postgres 容器是隊列中第一個運行的容器。
但是,有一些限制,因為depends_on
沒有明確地等待依賴項準備好。
假設我們的 Web 應用程序需要在啟動時運行一些遷移腳本。如果數據庫不接受連接,儘管 Postgres 服務已正確啟動,但我們無法執行任何腳本。
但是,如果我們使用特定工具或我們自己的託管腳本來控制啟動或關閉順序,我們可以避免這種情況。
3. Docker Compose links
links
指示 Docker 通過網絡鏈接容器。當我們鏈接容器時,Docker 會創建環境變量並將容器添加到已知主機列表中,以便它們可以發現彼此。
我們將查看一個運行 Postgres 容器的簡單 Docker 示例並將其鏈接到我們的 Web 應用程序。
首先,讓我們運行我們的 Postgres 容器:
docker run -d --name db -p 5342:5342 postgres:latest
然後,我們將其鏈接到我們的 Web 應用程序:
docker run -d -p 8080:8080 --name web-app --link db
讓我們將示例轉換為 Docker Compose:
services:
db:
image: postgres:latest
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- 5432:5432
web-app:
images: web-app:latest
ports:
- 8080:8080
links:
- db
4. Docker Compose network
我們可以找到仍在使用的 Docker links
。但是,由於引入了[network](https://docs.docker.com/network/)
,Docker Compose 從第 2 版開始就棄用了它。
通過這種方式,我們可以將應用程序與復雜的網絡連接起來,例如覆蓋網絡。
但是,在獨立應用程序中,當我們不指定網絡時,我們通常可以默認使用網橋。
讓我們刪除links
並將其替換為network
,同時為數據庫添加捲和環境變量:
services:
db:
image: postgres:latest
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- 5432:5432
volumes:
- db:/var/lib/postgresql/data
networks:
- mynet
web-app:
image:web-app:latest
depends_on:
- db
networks:
- mynet
ports:
- 8080:8080
environment:
DB_HOST: db
DB_PORT: 5432
DB_USER: postgres
DB_PASSWORD: postgres
DB_NAME: postgres
networks:
mynet:
driver: bridge
volumes:
db:
driver: local
5. Docker links
和depends_on
雖然它們涉及表達依賴關係,但 Docker links
和depends_on
具有不同的含義。
depends_on
表示服務必須啟動和停止的順序,而links
關鍵字處理容器在網絡上的通信。
此外, depends_on
是 Docker Compose 關鍵字,而我們可以類似地使用links
作為 Docker 的遺留功能。
六,結論
在本文中,我們通過 Docker Compose 示例了解了 Docker links
和depends_on
之間的區別.
depends_on
告訴 Docker 運行容器的順序,而links,
或較新版本的 Docker Compose 中的network
通過網絡為容器設置連接。
與往常一樣,我們可以在 GitHub 上找到示例的源docker-compose.yml
文件。