在使用docker-compose的过程中,很多程序都提供了健康检查(healthcheck)的方法,通过健康检查,应用程序能够在确保其依赖的程序都已经启动的前提下启动,减少各种错误的发生,同时,合理设计的健康检查也能够提供给外界关于应用程序状态的一些信息。

大多数docker镜像的详细说明中,会交代如何进行健康检查,.NET 6也提供了文档。也有其他人写了文章说了更细节的内容。

实践一下,现在docker-compose里面是这样:

version: '3.7'
services:
postgres:
container_name: postgres-container
image: postgres:13
volumes:
- ./postgres_data:/var/lib/postgresql/data/pgdata
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: "123456"
PGDATA: "/var/lib/postgresql/data/pgdata"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
networks:
- dotnet-network dotnet-service:
image: dotnet-service:latest
container_name: dotnet-service-container
ports:
- 5000:5000
build:
context: ./TestWeb/
dockerfile: ./TestWeb/Dockerfile
environment:
# - ASPNETCORE_ENVIRONMENT=Docker
- ASPNETCORE_URLS=http://*:5000
- App__SelfUrl=http://*:5000
restart: on-failure
depends_on:
postgres:
condition: service_healthy
networks:
- dotnet-network networks:
dotnet-network:
external: false

首先调整一下程序:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHealthChecks();

var app = builder.Build();

app.MapHealthChecks("/healthz");

app.Run();

如果直接运行的话,web访问/healthz节点,那么可以页面将直接返回Healthy。看上去没有问题,那我们按照要求调整一下Dockerfile

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
HEALTHCHECK CMD curl --fail http://localhost:5000/healthz || exit
ENTRYPOINT ["dotnet", "TestWeb.dll"]

然后调整docker-compose.yml文件,让postgres启动依赖dotnet-service:

version: '3.7'
services:
postgres:
container_name: postgres-container
image: postgres:13
volumes:
- ./postgres_data:/var/lib/postgresql/data/pgdata
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: "123456"
PGDATA: "/var/lib/postgresql/data/pgdata"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
depends_on:
dotnet-service:
condition: service_healthy
networks:
- dotnet-network dotnet-service:
image: dotnet-service:latest
container_name: dotnet-service-container
ports:
- 5000:5000
build:
context: ./TestWeb/
dockerfile: ./TestWeb/Dockerfile
environment:
# - ASPNETCORE_ENVIRONMENT=Docker
- ASPNETCORE_URLS=http://*:5000
- App__SelfUrl=http://*:5000
restart: on-failure
networks:
- dotnet-network networks:
dotnet-network:
external: false

然后postgres就启动不了了,提示容器unhealthy。运行docker ps,发现.net容器的后面有一个unhealthy。但是程序访问正常,说明只是没有正确运行这段话而已。

Dockerfile方案

文档说.NET 6的镜像里面不带curl这个工具了,需要手动装一下:

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
RUN apt-get update && apt-get install -y curl
HEALTHCHECK CMD curl --fail http://localhost:5000/healthz || exit
ENTRYPOINT ["dotnet", "TestWeb.dll"]

这样再看,就完全没问题了,如果把aspnet:6.0改成aspnet:6.0-alpine,空间更节省了(默认是239M,alpine版是108M),还自带了wget,也没必要这么麻烦先安装curl(比较费时间按)。

HEALTHCHECK CMD wget --spider http://localhost:5000/healthz || exit

docker-compose方案

我不太喜欢去改Dockerfile,而是更倾向于修改docker-compose.yml文件。当然,没有curl依然还是得在Dockerfile中添加相应语句安装,但是可以删除HEALTHCHECK这一条了,直接在docker-compose.yml中对应服务下面添加:

healthcheck:
test: ["CMD-SHELL", "wget --spider http://localhost:5000/healthz || exit"]
interval: 10s
timeout: 5s
retries: 5

程序依然可以正常运行。

P.S. 如果程序没有使用AddHealthChecks,那么也可以使用暴力一点的,直接用HEALTHCHECK CMD curl --fail http://localhost:5000 || exit,只要能够正常访问页面,就认为是Healthy,不过肯定就少了很多高级特性了。

ASP.NET CORE在docker中的健康检查(healthcheck)的更多相关文章

  1. 给 asp.net core 写一个简单的健康检查

    给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...

  2. 如何在 ASP.Net Core 中实现 健康检查

    健康检查 常用于判断一个应用程序能否对 request 请求进行响应,ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态. ASP.Net Core 中的 健康检查 ...

  3. 【Docker】Asp.net core在docker容器中的端口问题

    还记得[One by one系列]一步步学习docker(三)--实战部署dotnetcore中遇到的问题么?容器内部启动始终是80端口,并不由命令左右. docker run --name cont ...

  4. ASP.NET Core开发-Docker部署运行

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  5. 基于Microsoft Azure、ASP.NET Core和Docker的博客系统

    欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统   2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客 ...

  6. [翻译] 使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据

    原文地址:http://www.dotnetcurry.com/aspnet/1354/elastic-search-kibana-in-docker-dotnet-core-app 想要轻松地通过许 ...

  7. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

  8. .NET Core微服务之ASP.NET Core on Docker

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Docker极简介绍 1.1 总体介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.D ...

  9. [翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志

    原文: Logging with ElasticSearch, Kibana, ASP.NET Core and Docker 一步一步指导您使用 ElasticSearch, Kibana, ASP ...

随机推荐

  1. Java 进阶路线图

    前言 个人的从事Java开发行业已经也有一段时间,提升自己的Java水平,特整理下学习路线图,以备日后使用. 路线图资料收集 图片打不开,建议使用复制链接打开:或者私信告诉我. Java架构师学习路线 ...

  2. Java - happens-before

    Java - happens-before JSR-133对 happens-before 关系的定义如下: 如果一个操作 happens-before 另一个操作,那么第一个操作的执行结果将对第二个 ...

  3. django框架12

    内容概要 csrf相关装饰器 基于中间件思想编写项目 auth认证模块 auth模块方法大全 auth扩展表字段 项目开发流程 bbs数据表分析 内容详情 csrf相关装饰器 基于中间件思想编写项目 ...

  4. Redis配置登录密码

    更新记录 2022年6月14日 发布. 打开配置文件 vi /etc/redis/redis.conf 搜索来找到下面这行注释 #requirepass foobared 取消注释,把 foobare ...

  5. SQL Server各版本序列号/激活码/License/秘钥

    SQL Server 2019 Enterprise:HMWJ3-KY3J2-NMVD7-KG4JR-X2G8G Enterprise Core:2C9JR-K3RNG-QD4M4-JQ2HR-846 ...

  6. Centos使用crontab自动定时备份mysql的脚本

    在我们网站上线之后免不了需要备份数据库,为什么要备份呢?我给大家列出了3个理由. 1.防止数据丢失 2.防止数据改错了,可以用来恢复 3.方便给客户数据 以 上几点告诉我们要经常备份,当然我今天给大家 ...

  7. ClickHouse(02)ClickHouse架构设计介绍概述与ClickHouse数据分片设计

    ClickHouse核心架构设计是怎么样的?ClickHouse核心架构模块分为两个部分:ClickHouse执行过程架构和ClickHouse数据存储架构,下面分别详细介绍. ClickHouse执 ...

  8. SpringBoot 集成缓存性能之王 Caffeine

    使用缓存的目的就是提高性能,今天码哥带大家实践运用 spring-boot-starter-cache 抽象的缓存组件去集成本地缓存性能之王 Caffeine. 大家需要注意的是:in-memeory ...

  9. kubernetes集群简单实例搭建

    systemctl stop firewalld && systemctl disable firewalldvim /etc/selinux/configSELINUX=disabl ...

  10. python小题目练习(一)

    题目:输出1+2+3+4+5+--+100的总数,并打印出这行式子 代码展示:# 1.定义一个初识变量total,用于后面每次循环进行累加值 total = 0# 2.利用for循环遍历累加for i ...