【Docker】Docker Compose服务依赖与健康检查

在这里插入图片描述

docker compose环境变量

为增加安全性,在前面的python例子中增加redis的密码校验,密码从环境变量中获取:

from flask import Flask
from redis import StrictRedis
import os
import socketapp = Flask(__name__)
redis = StrictRedis(host=os.environ.get('REDIS_HOST', '127.0.0.1'),port=6379, password=os.environ.get('REDIS_PASS'))@app.route('/')
def hello():redis.incr('hits')return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"

对前面的docker-compose.yml进行修改如下:

version: "3.3"services:flask-demo:build:context: .dockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOST=redis-server- REDIS_PASS=${REDIS_PASSWORD}networks:- demo-networkports:- 8080:5000redis-server:image: redis:latestcommand: redis-server --requirepass ${REDIS_PASSWORD}networks:- demo-networknetworks:demo-network:

在工程目录下新建.env文件,将环境变量配置好:

REDIS_PASS=abc

启动服务:

$ docker-compose up -d
Creating network "app3_demo-network" with the default driver
Creating app3_redis-server_1 ... done
Creating app3_flask-demo_1   ... done

参考文档:https://docs.docker.com/compose/environment-variables/

docker compose健康检查

Dockerfile healthcheck: https://docs.docker.com/engine/reference/builder/#healthcheck

docker compose:https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck

健康检查是容器运行状态的高级检查,主要是检查容器所运行的进程是否能正常的对外提供“服务”,比如一个数据库容器,我们不光需要这个容器是up的状态,我们还要求这个容器的数据库进程能够正常对外提供服务,这就是所谓的健康检查。

容器的健康检查

容器本身有一个健康检查的功能,但是需要在Dockerfile里定义,或者在执行docker container run的时候,通过下面的一些参数指定:

--health-cmd string              Command to run to check health
--health-interval duration       Time between running the check(ms|s|m|h) (default 0s)
--health-retries int             Consecutive failures needed toreport unhealthy
--health-start-period duration   Start period for the container toinitialize before startinghealth-retries countdown(ms|s|m|h) (default 0s)
--health-timeout duration        Maximum time to allow one check to

下面我们对前面的flask例子增加健康检查,主要是在Dockerfile中增加HEALTHCHECK指令:

FROM python:3.9.5-slimRUN pip install flask redis && \apt-get update && \apt-get install -y curl && \groupadd -r flask && useradd -r -g flask flask && \mkdir /src && \chown -R flask:flask /srcUSER flaskCOPY app.py /src/app.pyWORKDIR /srcENV FLASK_APP=app.py REDIS_HOST=redisEXPOSE 5000HEALTHCHECK --interval=30s --timeout=3s \CMD curl -f http://localhost:5000/ || exit 1CMD ["flask", "run", "-h", "0.0.0.0"]

上面Dockerfili里的HEALTHCHECK就是定义了一个健康检查。会每隔30秒检查一次,如果失败就会退出,退出代码是1。

构建flask-demo镜像,并启动容器:

$ docker build -t flask-demo .$ docker network create mynetwork
b3958a0cb961ddcc856c7e0458bc10489c456727f6061d1f9dc23e7e264741ae$ docker container run --rm -d --name flask-demo --network=mynetwork --env REDIS_PASS=abc --env REDIS_HOST=redis flask-demo
e761d19949b9e3284471864101ec196807fc6145431903f4041e04daf950fa86$ docker container ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS                            PORTS      NAMES
e761d19949b9   flask-demo   "flask run -h 0.0.0.0"   8 seconds ago   Up 8 seconds (health: starting)   5000/tcp   flask-demo

启动容器后查看容器状态未health: starting

因为此时没有启动redis服务,所以无法访问http://localhost:5000/,经过3次检查后发现一直是不通的,然后health的状态会从starting变为unhealthy:

$ docker container ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS                     PORTS      NAMES
e761d19949b9   flask-demo   "flask run -h 0.0.0.0"   2 minutes ago   Up 2 minutes (unhealthy)   5000/tcp   flask-demo

也可以通过docker container inspect查看其中有关health的详情:

"Health": {"Status": "unhealthy","FailingStreak": 4,"Log": [{"Start": "2023-10-09T14:17:51.7014803+08:00","End": "2023-10-09T14:17:54.7023591+08:00","ExitCode": -1,"Output": "Health check exceeded timeout (3s)"},{"Start": "2023-10-09T14:18:24.7095286+08:00","End": "2023-10-09T14:18:27.7099692+08:00","ExitCode": -1,"Output": "Health check exceeded timeout (3s)"},{"Start": "2023-10-09T14:18:57.7264309+08:00","End": "2023-10-09T14:19:00.7267289+08:00","ExitCode": -1,"Output": "Health check exceeded timeout (3s)"},{"Start": "2023-10-09T14:19:30.7443718+08:00","End": "2023-10-09T14:19:33.7444952+08:00","ExitCode": -1,"Output": "Health check exceeded timeout (3s)"}]
}

此时再启动redis服务,注意设置访问redis的密码:

$ docker container run --rm -d --network=mynetwork --name redis redis redis-server --requirepass abc
985cd32adbffd0d631a5a193c25903d704ddf08fb9a06f65a8e05af601a2ad77$ docker container ps
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS                   PORTS      NAMES
985cd32adbff   redis        "docker-entrypoint.s…"   About a minute ago   Up About a minute        6379/tcp   redis
e761d19949b9   flask-demo   "flask run -h 0.0.0.0"   8 minutes ago        Up 8 minutes (healthy)   5000/tcp   flask-demo

经过几秒钟,我们的flask-demo变成了healthy。

docker-compose健康检查

在上面的例子基础上删除Dockerfile中的心跳检测。

在docker-compose.yml中增加健康检查的配置:

version: "3.8"services:flask-demo:build:context: .dockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOST=redis-server- REDIS_PASS=${REDIS_PASS}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:5000"]interval: 30stimeout: 3sretries: 3start_period: 40snetworks:- demo-networkports:- 8080:5000redis-server:image: redis:latestcommand: redis-server --requirepass ${REDIS_PASS}networks:- demo-networknetworks:demo-network:

构建镜像并启动:

$ docker-compose up -d --build$ docker-compose psName                      Command                  State                        Ports
--------------------------------------------------------------------------------------------------------------
app5_flask-demo_1     flask run -h 0.0.0.0             Up (healthy)   0.0.0.0:8080->5000/tcp,:::8080->5000/tcp
app5_redis-server_1   docker-entrypoint.sh redis ...   Up             6379/tcp

可以通过修改docker-compose.yml文件中密码来测试容器状态为Up (unhealthy)的情况。

docker compose服务依赖

如果服务之间的启动有依赖顺序,可以使用depends_on来配置。

version: "3.8"services:flask-demo:build:context: .dockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOST=redis-server- REDIS_PASS=${REDIS_PASS}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:5000"]interval: 30stimeout: 3sretries: 3start_period: 40sdepends_on:- redis-servernetworks:- demo-networkports:- 8080:5000redis-server:image: redis:latestcommand: redis-server --requirepass ${REDIS_PASS}networks:- demo-networknetworks:demo-network:

上面的例子配置了flask-demo依赖redis-server,在启动的时候会先启动redis-server,然后在启动flask-demo

$ docker-compose up -d
Creating network "app6_demo-network" with the default driver
Creating app6_redis-server_1 ... done
Creating app6_flask-demo_1   ... done

服务依赖与健康检查的结合

这里再引入nginx来更好的演示服务依赖与健康检查的结合。

version: "3.8"services:flask-demo:build:context: .dockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOST=redis-server- REDIS_PASS=${REDIS_PASS}healthcheck:test: ["CMD", "curl", "-f", "http://localhost:5000"]interval: 30stimeout: 3sretries: 3start_period: 40sdepends_on:- redis-servernetworks:- backend- frontendredis-server:image: redis:latestcommand: redis-server --requirepass ${REDIS_PASS}networks:- backendnginx:image: nginx:stable-alpineports:- 8000:80depends_on:flask-demo:condition: service_healthyvolumes:- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro- ./log/nginx:/var/log/nginxnetworks:- frontendnetworks:backend:frontend:

nginx.conf文件的内容如下:

server {listen  80 default_server;location / {proxy_pass http://flask-demo:5000;}
}

启动服务,可以发现nginxflask-demo启动后并健康检查通过后才启动。

$ docker-compose up -d
Creating network "app7_backend" with the default driver
Creating network "app7_frontend" with the default driver
Creating app7_redis-server_1 ... done
Creating app7_flask-demo_1   ... done
Creating app7_nginx_1        ... done$ docker-compose psName                      Command                  State                      Ports
----------------------------------------------------------------------------------------------------------
app7_flask-demo_1     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app7_nginx_1          /docker-entrypoint.sh ngin ...   Up             0.0.0.0:8000->80/tcp,:::8000->80/tcp
app7_redis-server_1   docker-entrypoint.sh redis ...   Up             6379/tcp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/121401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统——内存扩容:覆盖技术、交换技术(王道视频p44)

1.对于覆盖技术 和 交换技术:(并不是重点)

React 核心与实战2023版

课程亮点: 完整的前后台项目(PC+移动;完成业务;)React 最新企业标准技术栈(React 18 + Redux + ReactRouter + AntD)React + TypeScript (为大型项目奠定了基础)课程内容安排: React 介绍 React 是什么? React 是由Meta公司研发,是一个用于 构建Web和原生交互界面…

nexus 快速搭建-本地私有仓库 -maven

场景: 需要上传打包starer本地、局域网内 jar包上传、下载搭建后本地有层代理,可节省代宽,无网可拉包等… 下载: https://help.sonatype.com/repomanager3/product-information/download 基本说明: proxy 用来代理远程…

01-初识VUE3

01.初识VUE3 1.创建VUE3项目 1).使用 vue-cli 创建 ## 查看vue/cli版本,确保vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的vue/cli npm install -g vue/cli ## 创建 vue create vue_test ## 启动 cd vue_test npm run serve2).使用 vite 创建 ## 创…

LLM系列 | 23:多模态大模型:浦语·灵笔InternLM-XComposer解读、实战和思考

引言 ​简介 模型解读 模型架构 训练 实战 环境准备 本地实测 服务部署 总结 引言 谁念西风独自凉,萧萧黄叶闭疏窗,沉思往事立残阳。 Created by DALLE 3 小伙伴们好,我是《小窗幽记机器学习》的小编:卖热干面的小女孩…

深入浅出排序算法之堆排序

目录 1. 算法介绍 2. 执行流程⭐⭐⭐⭐⭐✔ 3. 代码实现 4. 性能分析 1. 算法介绍 堆是一种数据结构,可以把堆看成一棵完全二叉树,这棵完全二叉树满足:任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小&#x…

【密评】商用密码应用安全性评估从业人员考核题库(十五)

商用密码应用安全性评估从业人员考核题库(十五) 国密局给的参考题库5000道只是基础题,后续更新完5000还会继续更其他高质量题库,持续学习,共同进步。 3501 单项选择题 根据GM/T 0115 《信息系统密码应用测评要求》&am…

如何用 JMeter 编写性能测试脚本?

Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本? 1. 编写 HTTP 性能测试脚本 STEP 1. 添加 HTTP 请求 img STEP 2. 了解配置信息 HTTP 请求各项信息说明(以 JMeter 5.1 为例)。 如下图所示:…

linux系统安装Googletest单元测试框架

环境信息 系统:ubuntn cmake版本:3.5.1 gcc版本:5.4.0 1、下载googletest git clone https://github.com/google/googletest.git注意!不选branch的话默认下载最新版本(需要编译器能够支持C14),…

Android framework服务命令行工具框架 - Android13

Android framework服务命令行工具框架 - Android13 1、framework服务命令行工具简介2、cmd 执行程序2.1 目录和Android.bp2.2 cmdMain 执行入口2.3 cmd命令 3、am命令工具,实质脚本执行cmd activity3.1 sh脚本3.2 activity服务注册3.3 onShellCommand执行 4、简易时…

javaEE -9(7000字详解TCP/IP协议)

一: IP 地址 IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物…

使用pycharm远程连接到Linux服务器进行开发

预计达到的效果 本地的 PyCharm 能达到和远程服务器之间的文件同步;本地的 PyCharm 能够使用远程服务器的开发环境; 环境配置 PyCharm:PyCharm 2021.3 (Professional Edition)Linux服务器:Ubuntu20.04 步骤 1.进入配置项 配…

Python 算法高级篇:桶排序与基数排序

Python 算法高级篇:桶排序与基数排序 引言什么是桶排序?桶排序的基本步骤桶排序的示例 什么是基数排序?基数排序的基本步骤基数排序的示例 桶排序与基数排序的应用桶排序的应用基数排序的应用 Python 示例代码总结 引言 在算法高级篇的课程中…

从设计、制造到封测,XSKY 智能存储助力半导体行业数字化转型

近日,ECS2023 第五届中国电子通信与半导体 CIO 峰会在深圳召开,峰会以“数字科技与业务重塑”为主题,汇聚了 300来自电子通信与半导体行业知名企业高管、CIO、信息化与数字化负责人,交流电子通信与半导体行业的创新的产品和解决方…

【排序】js简单实现前端数组排序,多字段数组对象排序,字符串排序,数字排序等

数组对象排序(多字段排序) 排序前: 排序后: data() {return {list: [{ks: 外科,child_ks: 泌尿外科,xz: 外科一组,doctor: 小明,num: 18,num2: 19,num3: 20},{ks: 中医科,child_ks: 中医男科,xz: 外科一组,doctor: 小红,num: …

Hadoop、Hive安装

一、 工具 Linux系统:Centos,版本7.0及以上 JDK:jdk1.8 Hadoop:3.1.3 Hive:3.1.2 虚拟机:VMware mysql:5.7.11 工具下载地址: https://pan.baidu.com/s/1JYtUVf2aYl5–i7xO6LOAQ 提取码: xavd…

ORACLE-递归查询、树操作

1. 数据准备 -- 测试数据准备 DROP TABLE untifa_test;CREATE TABLE untifa_test(child_id NUMBER(10) NOT NULL, --子idtitle VARCHAR2(50), --标题relation_type VARCHAR(10) --关系,parent_id NUMBER(10) --父id );insert into untifa_test (CHILD_ID, TITLE, RELATION_TYP…

SpringBoot整合Gateway 的Demo(附源码)

源码&#xff0c;可直接下载 Gateway模块 Gateway 的父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

vue核心面试题汇总【查缺补漏】

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 很喜欢‘万变不离其宗’这句话&#xff0c;希望在不断的思考和总结中找到Vue中的宗&#xff0c;来解答面试官抛出的…

2023MathorCup(妈妈杯) 数学建模挑战赛 解题思路

云顶数模最新解题思路免费分享~~ 2023妈妈杯数学建模A题B题思路&#xff0c;供大家参考~~ A题 B题