Docker中控制服務(wù)啟動(dòng)順序的操作方法
一、Docker概述
Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于 Go 語(yǔ)言 并遵從 Apache2.0 協(xié)議開(kāi)源。
Docker 可以讓開(kāi)發(fā)者打包他們的應(yīng)用以及依賴(lài)包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。
容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類(lèi)似 iPhone 的 app),更重要的是容器性能開(kāi)銷(xiāo)極低。
Docker的應(yīng)用場(chǎng)景
- Web 應(yīng)用的自動(dòng)化打包和發(fā)布。
- 自動(dòng)化測(cè)試和持續(xù)集成、發(fā)布。
- 在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫(kù)或其他的后臺(tái)應(yīng)用。
- 從頭編譯或者擴(kuò)展現(xiàn)有的 OpenShift 或 Cloud Foundry 平臺(tái)來(lái)搭建自己的 PaaS 環(huán)境。
二、Docker三劍客
compose、machine 和 swarm
是docker 原生提供的三大編排工具。
1. Compose
在實(shí)際生產(chǎn)環(huán)境中,一個(gè)應(yīng)用往往由許多服務(wù)構(gòu)成,而 docker 的最佳實(shí)踐是一個(gè)容器只運(yùn)行一個(gè)進(jìn)程,因此運(yùn)行多個(gè)微服務(wù)就要運(yùn)行多個(gè)容器。多個(gè)容器協(xié)同工作需要一個(gè)有效的工具來(lái)管理他們,定義這些容器如何相互關(guān)聯(lián)。compose 應(yīng)運(yùn)而生。
compose 是用來(lái)定義和運(yùn)行一個(gè)或多個(gè)容器(通常都是多個(gè))運(yùn)行和應(yīng)用的工具。使用 compose 可以簡(jiǎn)化容器鏡像的構(gòu)建以及容器的運(yùn)行。
compose 使用 YAML 文件來(lái)定義多容器之間的關(guān)系。一個(gè) docker-compose up 就可以把完整的應(yīng)用跑起來(lái)。
2. Machine
Docker Machine 是一個(gè)簡(jiǎn)化Docker 安裝的命令行工具。通過(guò)一個(gè)簡(jiǎn)單的命令行即可在相應(yīng)的平臺(tái)上安裝 Docker,為用戶提供了靈活的功能,使得用戶可以在任一主機(jī)上運(yùn)行 Docker 容器。簡(jiǎn)單說(shuō),一個(gè) Docker Machine 就是一個(gè) Docker host 主機(jī)和經(jīng)過(guò)配置的 Docker client 的結(jié)合體。
3. Swarm
Swarm 是 Docker 社區(qū)提供的原生支持 Docker 集群的工具。 它可以把多個(gè) Docker 主機(jī)組成的系統(tǒng)轉(zhuǎn)換成為單一的虛擬 Docker 主機(jī)。Swarm 對(duì)外提供兩種 API。一種是標(biāo)準(zhǔn)的 Docker API,例如 Dokku、Compose、Krane、Flynn、Deis、Jenkins等;另一種是 Swarm 的集群管理 API,用于集群的管理。
Swarm工具本身不是很成熟,不建議用在生產(chǎn)環(huán)境。
而 Google 開(kāi)源的Kubernetes
是目前容器生態(tài)圈中最受歡迎的編排部署工具。
三、簡(jiǎn)要需求
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. 代碼模塊
模塊 | 功能 | 說(shuō)明 |
---|---|---|
microservice-eureka | 注冊(cè)中心 | - |
microservice-front | 前端工程 | 后臺(tái)訪問(wèn)網(wǎng)關(guān)接口 |
microservice-gateway | 網(wǎng)關(guān) | 路由、聚合接口文檔 |
microservice-movie | 微服務(wù)1 | - |
microservice-user | 微服務(wù)2 | - |
3. 調(diào)用方向
前端工程front
服務(wù)網(wǎng)關(guān)gateway
微服務(wù)movie
微服務(wù)user
服務(wù)注冊(cè)中心1
服務(wù)注冊(cè)中心2
4. 期望啟動(dòng)順序
① eureka --> ②user --> ③ movie --> ④ gateway --> ⑤front
四、思路分析
1.各走各路
簡(jiǎn)單來(lái)說(shuō)就是: 分組啟動(dòng),必須保證服務(wù)在同一網(wǎng)絡(luò)內(nèi)
1.)docker-compose -f
指定不同配置文件
springboot有一核心原則:約定大于配置
,在compose也類(lèi)似,我們知道docker-compose中默認(rèn)的配置文件為docker-compose.yml
,這并不意味著我們只能使用此配置文件,實(shí)際上我們可以通過(guò)類(lèi)似 docker-compose -f xxx.yml
來(lái)指定。
具體文件見(jiàn):https://gitee.com/00fly/microservice-all-in-one/tree/master/micro-service/docker/compose-network-step-by-step
將此目錄上傳到安裝了docker的lunix服務(wù)器目錄,依次執(zhí)行0-4 sh,鏡像已經(jīng)上傳到阿里,發(fā)現(xiàn)容器啟動(dòng)成功。
2.)docker-compose up -d service-name
指定服務(wù)名
具體文件見(jiàn):https://gitee.com/00fly/microservice-all-in-one/tree/master/micro-service/docker/compose-step-by-step
全部的服務(wù)均在docker-compose.yml
中指定,服務(wù)均位于同一網(wǎng)絡(luò)內(nèi)
。
3.)兩種方式比較
指定不同配置文件
優(yōu)點(diǎn):步驟清晰,服務(wù)劃分一目了然
缺點(diǎn):需要提前指定網(wǎng)絡(luò),后期調(diào)整服務(wù)啟動(dòng)順序,需要修改yml文件,稍顯麻煩,維護(hù)不便。
指定服務(wù)名
優(yōu)點(diǎn):統(tǒng)一使用默認(rèn)compose配置文件,后期調(diào)整服務(wù)啟動(dòng)順序方便。
2. 等等我
借助wait-for.sh實(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 {檢測(cè)地址:{檢測(cè)端口} -- {檢測(cè)成功后執(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é)果
啟動(dòng)eureka
啟動(dòng)user
啟動(dòng)movie
啟動(dòng)gateway
啟動(dòng)front
我們也可以查看日志
Operation timed out就是wait-for.sh打印的等待日志信息。
五、關(guān)于depends_on
有同學(xué)已經(jīng)注意到,在docker-compose.yml中, 可以使用depends_on
以下是一些關(guān)于 depends_on 的詳解:
- 啟動(dòng)順序:
通過(guò)在服務(wù)的配置中使用 depends_on,您可以告訴 Docker Compose 在啟動(dòng)容器時(shí)按照指定的順序啟動(dòng)服務(wù)。例如,如果服務(wù) A 依賴(lài)于服務(wù) B 和服務(wù) C,則在啟動(dòng)時(shí),Docker Compose 會(huì)先啟動(dòng)服務(wù) B 和服務(wù) C,然后才會(huì)啟動(dòng)服務(wù) A。
- 僅表示依賴(lài)關(guān)系:
depends_on 只表示依賴(lài)關(guān)系,而不會(huì)等待依賴(lài)的服務(wù)完全可用。它只確保在依賴(lài)的服務(wù)啟動(dòng)后再啟動(dòng)當(dāng)前服務(wù)。因此,依賴(lài)的服務(wù)可能仍在進(jìn)行初始化或準(zhǔn)備階段,而不一定已經(jīng)完全可用。如果需要等待服務(wù)完全可用,可以結(jié)合使用其他工具或技術(shù),例如健康檢查或等待腳本。
- 無(wú)法保證健康狀態(tài):
depends_on 并不能保證依賴(lài)的服務(wù)在啟動(dòng)后處于健康狀態(tài)。它只負(fù)責(zé)在啟動(dòng)時(shí)按照指定順序啟動(dòng)服務(wù),但并不檢查服務(wù)的健康狀態(tài)或等待服務(wù)變?yōu)榭捎脿顟B(tài)。對(duì)于檢查服務(wù)健康狀態(tài),可以使用其他機(jī)制,例如使用健康檢查命令或工具。
- 并行啟動(dòng):
默認(rèn)情況下,Docker Compose 會(huì)盡可能并行啟動(dòng)服務(wù),而不是完全按照 depends_on 指定的依賴(lài)關(guān)系順序啟動(dòng)。這是因?yàn)?Docker Compose 會(huì)嘗試最大化容器的并發(fā)啟動(dòng),以提高啟動(dòng)效率。如果需要強(qiáng)制按照依賴(lài)關(guān)系順序啟動(dòng),請(qǐng)使用 depends_on 結(jié)合 restart 關(guān)鍵字的 condition: [“service_started”] 選項(xiàng)。
綜上所述,depends_on 關(guān)鍵字允許您定義 Docker Compose 服務(wù)之間的依賴(lài)關(guān)系,但它并不能保證服務(wù)的可用性或健康狀態(tài)
。
到此這篇關(guān)于Docker中如何控制服務(wù)啟動(dòng)順序的文章就介紹到這了,更多相關(guān)Docker控制服務(wù)啟動(dòng)順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker安裝MongoDB的過(guò)程(mongo.latest)
MongoDB是一種高性能、靈活的數(shù)據(jù)庫(kù),特別適合處理大量非結(jié)構(gòu)化數(shù)據(jù),它采用文檔數(shù)據(jù)模型,支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),提供類(lèi)似面向?qū)ο蟮牟樵?xún)語(yǔ)言,本文給大家介紹Docker安裝MongoDB的過(guò)程(mongo.latest),感興趣的朋友一起看看吧2024-11-11Ubuntu15.10安裝docker和docker-compose教程
這篇文章主要介紹了Ubuntu15.10安裝docker和docker-compose的教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03如何使用docker極簡(jiǎn)打包java.jar鏡像并啟動(dòng)
這篇文章主要介紹了如何使用docker極簡(jiǎn)打包java.jar鏡像并啟動(dòng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08CentOS 7.2 下安裝 Docker 1.12.3 版的詳細(xì)方法
這篇文章主要介紹了CentOS 7.2 安裝 Docker 1.12.3 版的相關(guān)資料,本文分步驟給大家介紹了CentOS 7.2 下安裝 Docker 1.12.3 版的詳細(xì)方法,需要的朋友可以參考下2016-11-11Docker容器通過(guò)獨(dú)立IP暴露給局域網(wǎng)的方法
這篇文章主要介紹了Docker容器通過(guò)獨(dú)立IP暴露給局域網(wǎng)的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-04-04在vscode中使用ssh運(yùn)行docker:從下載到運(yùn)行全流程
首先在本機(jī)或者服務(wù)器上下載docker并運(yùn)行,本文目的旨在本機(jī)下載docker并打包,然后在服務(wù)器上進(jìn)行加載,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-08-08如何在Docker容器內(nèi)外互相拷貝數(shù)據(jù)
本篇文章主要介紹了如何在Docker容器內(nèi)外互相拷貝數(shù)據(jù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Docker簡(jiǎn)單安裝與應(yīng)用入門(mén)教程
這篇文章主要介紹了Docker簡(jiǎn)單安裝與應(yīng)用,結(jié)合實(shí)例形式分析了Docker常見(jiàn)的安裝、應(yīng)用構(gòu)建、終端訪問(wèn)等操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2018-06-06詳解Docker Compose 中可用的環(huán)境變量問(wèn)題
Compose 的多個(gè)部分在某種情況下處理環(huán)境變量。這篇文章主要介紹了Docker Compose 中可用的環(huán)境變量問(wèn)題,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12Idea+docker通過(guò)dockerFile往華為云發(fā)布項(xiàng)目實(shí)踐
本文介紹了使用IntelliJ IDEA和Docker將Spring Boot項(xiàng)目部署到華為云上,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01