Docker中控制服務啟動順序的操作方法
一、Docker概述
Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協(xié)議開源。
Docker 可以讓開發(fā)者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上,也可以實現(xiàn)虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
Docker的應用場景
- Web 應用的自動化打包和發(fā)布。
- 自動化測試和持續(xù)集成、發(fā)布。
- 在服務型環(huán)境中部署和調(diào)整數(shù)據(jù)庫或其他的后臺應用。
- 從頭編譯或者擴展現(xiàn)有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環(huán)境。
二、Docker三劍客
compose、machine 和 swarm 是docker 原生提供的三大編排工具。
1. Compose
在實際生產(chǎn)環(huán)境中,一個應用往往由許多服務構(gòu)成,而 docker 的最佳實踐是一個容器只運行一個進程,因此運行多個微服務就要運行多個容器。多個容器協(xié)同工作需要一個有效的工具來管理他們,定義這些容器如何相互關聯(lián)。compose 應運而生。
compose 是用來定義和運行一個或多個容器(通常都是多個)運行和應用的工具。使用 compose 可以簡化容器鏡像的構(gòu)建以及容器的運行。
compose 使用 YAML 文件來定義多容器之間的關系。一個 docker-compose up 就可以把完整的應用跑起來。
2. Machine
Docker Machine 是一個簡化Docker 安裝的命令行工具。通過一個簡單的命令行即可在相應的平臺上安裝 Docker,為用戶提供了靈活的功能,使得用戶可以在任一主機上運行 Docker 容器。簡單說,一個 Docker Machine 就是一個 Docker host 主機和經(jīng)過配置的 Docker client 的結(jié)合體。
3. Swarm
Swarm 是 Docker 社區(qū)提供的原生支持 Docker 集群的工具。 它可以把多個 Docker 主機組成的系統(tǒng)轉(zhuǎn)換成為單一的虛擬 Docker 主機。Swarm 對外提供兩種 API。一種是標準的 Docker API,例如 Dokku、Compose、Krane、Flynn、Deis、Jenkins等;另一種是 Swarm 的集群管理 API,用于集群的管理。
Swarm工具本身不是很成熟,不建議用在生產(chǎn)環(huán)境。
而 Google 開源的Kubernetes 是目前容器生態(tài)圈中最受歡迎的編排部署工具。
三、簡要需求
1. 樣例工程
https://gitee.com/00fly/microservice-all-in-one/tree/master/micro-service
git clone https://gitee.com/00fly/microservice-all-in-one.git
2. 代碼模塊
| 模塊 | 功能 | 說明 |
|---|---|---|
| microservice-eureka | 注冊中心 | - |
| microservice-front | 前端工程 | 后臺訪問網(wǎng)關接口 |
| microservice-gateway | 網(wǎng)關 | 路由、聚合接口文檔 |
| microservice-movie | 微服務1 | - |
| microservice-user | 微服務2 | - |
3. 調(diào)用方向
前端工程front
服務網(wǎng)關gateway
微服務movie
微服務user
服務注冊中心1
服務注冊中心2
4. 期望啟動順序
① eureka --> ②user --> ③ movie --> ④ gateway --> ⑤front
四、思路分析
1.各走各路
簡單來說就是: 分組啟動,必須保證服務在同一網(wǎng)絡內(nèi)
1.)docker-compose -f指定不同配置文件
springboot有一核心原則:約定大于配置,在compose也類似,我們知道docker-compose中默認的配置文件為docker-compose.yml,這并不意味著我們只能使用此配置文件,實際上我們可以通過類似 docker-compose -f xxx.yml來指定。
具體文件見:https://gitee.com/00fly/microservice-all-in-one/tree/master/micro-service/docker/compose-network-step-by-step

將此目錄上傳到安裝了docker的lunix服務器目錄,依次執(zhí)行0-4 sh,鏡像已經(jīng)上傳到阿里,發(fā)現(xiàn)容器啟動成功。
2.)docker-compose up -d service-name指定服務名
全部的服務均在docker-compose.yml中指定,服務均位于同一網(wǎng)絡內(nèi)。

3.)兩種方式比較
指定不同配置文件
優(yōu)點:步驟清晰,服務劃分一目了然
缺點:需要提前指定網(wǎng)絡,后期調(diào)整服務啟動順序,需要修改yml文件,稍顯麻煩,維護不便。
指定服務名
優(yōu)點:統(tǒng)一使用默認compose配置文件,后期調(diào)整服務啟動順序方便。
2. 等等我
借助wait-for.sh實現(xiàn)
需要注意的是:此腳本需要提前打包到鏡像內(nèi)。
1.)腳本
wait-for.sh
#!/bin/sh
TIMEOUT=15
QUIET=0
echoerr() {
if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi
}
usage() {
exitcode="$1"
cat << USAGE >&2
Usage:
$cmdname host:port [-t timeout] [-- command args]
-q | --quiet Do not output any status messages
-t TIMEOUT | --timeout=timeout Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit "$exitcode"
}
wait_for() {
for i in `seq $TIMEOUT` ; do
nc -z "$HOST" "$PORT" > /dev/null 2>&1
result=$?
if [ $result -eq 0 ] ; then
if [ $# -gt 0 ] ; then
exec "$@"
fi
exit 0
fi
sleep 1
done
echo "Operation timed out" >&2
exit 1
}
while [ $# -gt 0 ]
do
case "$1" in
*:* )
HOST=$(printf "%s\n" "$1"| cut -d : -f 1)
PORT=$(printf "%s\n" "$1"| cut -d : -f 2)
shift 1
;;
-q | --quiet)
QUIET=1
shift 1
;;
-t)
TIMEOUT="$2"
if [ "$TIMEOUT" = "" ]; then break; fi
shift 2
;;
--timeout=*)
TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
break
;;
--help)
usage 0
;;
*)
echoerr "Unknown argument: $1"
usage 1
;;
esac
done
if [ "$HOST" = "" -o "$PORT" = "" ]; then
echoerr "Error: you need to provide a host and port to test."
usage 2
fi
wait_for "$@"2.)如何使用
用法sh wait-for.sh {檢測地址:{檢測端口} -- {檢測成功后執(zhí)行腳本}·
舉例如下
sh wait-for.sh www.baidu.com:80 -- echo "baidu is up"

執(zhí)行restart.sh
#!/bin/bash docker-compose down && docker-compose --compatibility up -d && docker stats
3.)執(zhí)行結(jié)果
啟動eureka

啟動user

啟動movie

啟動gateway

啟動front

我們也可以查看日志

Operation timed out就是wait-for.sh打印的等待日志信息。
五、關于depends_on
有同學已經(jīng)注意到,在docker-compose.yml中, 可以使用depends_on
以下是一些關于 depends_on 的詳解:
- 啟動順序:
通過在服務的配置中使用 depends_on,您可以告訴 Docker Compose 在啟動容器時按照指定的順序啟動服務。例如,如果服務 A 依賴于服務 B 和服務 C,則在啟動時,Docker Compose 會先啟動服務 B 和服務 C,然后才會啟動服務 A。
- 僅表示依賴關系:
depends_on 只表示依賴關系,而不會等待依賴的服務完全可用。它只確保在依賴的服務啟動后再啟動當前服務。因此,依賴的服務可能仍在進行初始化或準備階段,而不一定已經(jīng)完全可用。如果需要等待服務完全可用,可以結(jié)合使用其他工具或技術,例如健康檢查或等待腳本。
- 無法保證健康狀態(tài):
depends_on 并不能保證依賴的服務在啟動后處于健康狀態(tài)。它只負責在啟動時按照指定順序啟動服務,但并不檢查服務的健康狀態(tài)或等待服務變?yōu)榭捎脿顟B(tài)。對于檢查服務健康狀態(tài),可以使用其他機制,例如使用健康檢查命令或工具。
- 并行啟動:
默認情況下,Docker Compose 會盡可能并行啟動服務,而不是完全按照 depends_on 指定的依賴關系順序啟動。這是因為 Docker Compose 會嘗試最大化容器的并發(fā)啟動,以提高啟動效率。如果需要強制按照依賴關系順序啟動,請使用 depends_on 結(jié)合 restart 關鍵字的 condition: [“service_started”] 選項。
綜上所述,depends_on 關鍵字允許您定義 Docker Compose 服務之間的依賴關系,但它并不能保證服務的可用性或健康狀態(tài)。
到此這篇關于Docker中如何控制服務啟動順序的文章就介紹到這了,更多相關Docker控制服務啟動順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何給一個正在運行的Docker容器動態(tài)添加Volume
這篇文章主要介紹了如何給一個正在運行的Docker容器動態(tài)添加Volume,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03
docker內(nèi)網(wǎng)搭建dns使用域名訪問替代ip:port的操作
這篇文章主要介紹了docker內(nèi)網(wǎng)搭建dns使用域名訪問替代ip:port的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

