Docker容器依賴link連接按順序啟動方式
Docker 中的容器一般都會遇到相互之間服務(wù)依賴的問題,通過 --link 指定一個(gè)或多個(gè)依賴容器服務(wù),但啟動的時(shí)候卻因?yàn)槿萜鲀?nèi)的服務(wù)啟動的延時(shí)不確定,并不能保證所有容器都能成功啟動,于是需要強(qiáng)制按容器內(nèi)的服務(wù)順序來啟動容器。
需要一個(gè)工具
先下載這個(gè)腳本, 然后根據(jù)項(xiàng)目中容器的服務(wù)依賴順序配置就可以了, 唯一的問題就是服務(wù)都需要有可訪問的端口.
舉個(gè)栗子
nginx
依賴 php-fpm
依賴 redis
| mysql
那么就倒序啟動, web_up.sh
wait_for_it=/zzstore/my-tools/wait-for-it/wait-for-it.sh docker container start my-mysql-8.0 && \ $wait_for_it -s -t 15 localhost:16033 -- echo 'mysql is up ~' && docker container start redis-6.2-19736 && \ $wait_for_it -s -t 15 localhost:19736 -- echo 'redis-19736 is up ~' && docker container start redis-6.2-19740 && \ $wait_for_it -s -t 15 localhost:19740 -- echo 'redis-19740 is up ~' && docker container start my-php-8.0-fpm && \ $wait_for_it -s -t 15 localhost:9080 -- echo 'php-fpm is up ~' && docker container start my-nginx-1.20 && \ $wait_for_it -s -t 15 localhost:80 -- echo 'nginx is up ~'
-s
: 表示嚴(yán)格模式, 若檢測的服務(wù)在-t
: xx秒 內(nèi)沒有啟動, 則終止后續(xù)所有命令.
這個(gè)腳本是在宿主機(jī)上運(yùn)行的, 監(jiān)聽的端口也都是宿主機(jī)上的端口, 如: 16033 映射 mysql
容器內(nèi) 3306
也可以用來監(jiān)聽 Docker 服務(wù)的啟動狀態(tài):
wait_for_it=/zzstore/my-tools/wait-for-it/wait-for-it.sh $wait_for_it -s -t 60 localhost:2375 -- echo 'docker is up ~' && docker container start my-mysql-8.0 && \ $wait_for_it -s -t 15 localhost:16033 -- echo 'mysql is up ~' && docker container start redis-6.2-19736 && \ $wait_for_it -s -t 15 localhost:19736 -- echo 'redis-19736 is up ~' && docker container start redis-6.2-19740 && \ $wait_for_it -s -t 15 localhost:19740 -- echo 'redis-19740 is up ~' && docker container start my-php-8.0-fpm && \ $wait_for_it -s -t 15 localhost:9080 -- echo 'php-fpm is up ~' && docker container start my-nginx-1.20 && \ $wait_for_it -s -t 15 localhost:80 -- echo 'nginx is up ~'
等 Dockerd 服務(wù)啟動后自動按服務(wù)順序啟動所有容器.
至于 -t
參數(shù)的時(shí)長可以在服務(wù)器上先測試一下根據(jù)實(shí)際情況再調(diào)整下.
全部正常成功啟動的效果圖
上面的啟動命令每個(gè) --
后的所有命令都是一個(gè)整體, 前面沒有執(zhí)行成功后面都不會觸發(fā).
再來測試下啟動失敗的情況
當(dāng)前容器全部已啟動的狀態(tài), 我們關(guān)閉其中一個(gè)依賴的服務(wù) redis-6.2-19740
然后再執(zhí)行腳本.
docker container stop redis-6.2-19740
wait_for_it=/zzstore/my-tools/wait-for-it/wait-for-it.sh $wait_for_it -s -t 60 localhost:2375 -- echo 'docker is up ~' && docker container start my-mysql-8.0 && \ $wait_for_it -s -t 15 localhost:16033 -- echo 'mysql is up ~' && docker container start redis-6.2-19736 && \ #$wait_for_it -s -t 15 localhost:19736 -- echo 'redis-19736 is up ~' && docker container start redis-6.2-19740 && \ $wait_for_it -s -t 15 localhost:19740 -- echo 'redis-19740 is up ~' && docker container start my-php-8.0-fpm && \ $wait_for_it -s -t 15 localhost:9080 -- echo 'php-fpm is up ~' && docker container start my-nginx-1.20 && \ $wait_for_it -s -t 15 localhost:80 -- echo 'nginx is up ~'
wait-for-it.sh: timeout occurred after waiting 15 seconds for localhost:19740 wait-for-it.sh: strict mode, refusing to execute subprocess
由于 redis-6.2-19740
沒有啟動, 而且使用了 -s
的 strict mode
因此后續(xù)存在依賴的命令全都不會執(zhí)行了.
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker、Podman 和 Containerd 三者區(qū)別解析
Docker、Podman 和 Containerd 是三種流行的容器工具,它們都用于容器的創(chuàng)建、管理和運(yùn)行,但它們在設(shè)計(jì)理念、功能和使用場景上有一些差異,這篇文章主要介紹了Docker、Podman 和 Containerd 三者區(qū)別,需要的朋友可以參考下2025-02-02通過Docker創(chuàng)建CentOS容器的實(shí)現(xiàn)步驟
本文主要介紹了Docker創(chuàng)建CentOS容器,使用文內(nèi)的腳本可以快速創(chuàng)建CentOS 7.8虛擬系統(tǒng)集群,并通過SSH(Secure Shell)遠(yuǎn)程工具連接,感興趣的可以了解一下2021-11-11手工制作docker鏡像-包含多個(gè)服務(wù)ssh+nginx
這篇文章主要介紹了手工制作docker鏡像-包含多個(gè)服務(wù)ssh+nginx,需要的朋友可以參考下2024-07-07docker-compose安裝RabbitMQ及插件操作步驟
這篇文章主要為大家介紹了docker-compose安裝RabbitMQ及插件操作步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01docker搭建php+nginx+swoole+mysql+redis環(huán)境的方法
這篇文章主要介紹了docker搭建php+nginx+swoole+mysql+redis環(huán)境的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03docker 實(shí)現(xiàn)容器與宿主機(jī)無縫調(diào)用shell命令
這篇文章主要介紹了docker 實(shí)現(xiàn)容器與宿主機(jī)無縫調(diào)用shell命令的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨想過來看看吧2021-03-03Docker綁定端口后仍無法遠(yuǎn)程直接訪問的解決方法
在Docker中,如果容器的端口綁定錯(cuò)誤或只綁定到了容器的內(nèi)部IP地址,將導(dǎo)致外部主機(jī)無法訪問該端口,所以本文小編給大家介紹了Docker綁定端口后仍無法遠(yuǎn)程直接訪問的解決方法,需要的朋友可以參考下2024-09-09