- 由 虚拟的现实创建于11月 15, 2024 需要 11 分钟阅读时间
MySQL
开发中,最常用的应该就是数据库了。创建如下目录结构,并添加相关相关文件:
$ tree . ├── README.adoc ├── clean.sh ├── data │ └── mysql │ └── .gitkeep ├── docker │ ├── config │ │ └── mysql │ │ └── init.sql │ ├── env │ │ └── mysql.env │ └── images │ └── mysql.dockerfile └── docker-compose.yml
先来看一下 docker-compose.yml 文件的内容:
services: mysql: container_name: mysql build: context: . dockerfile: ./docker/images/mysql.dockerfile image: example/mysql:8.4 env_file: - ./docker/env/mysql.env volumes: - ./data/mysql:/var/lib/mysql ports: - "3306:3306" healthcheck: test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] interval: 5s timeout: 10s retries: 10
由于 MySQL 的官方镜像只是提供了数据库软件,需要将初始化脚本在数据库内执行一遍。所以,基于 mysql:8.4 重新构建私有镜像。./docker/images/mysql.dockerfile
FROM mysql:8.4 ADD ./docker/config/mysql/init.sql /docker-entrypoint-initdb.d/mysql-init.sql RUN chown -R mysql:mysql /docker-entrypoint-initdb.d/*.sql EXPOSE 3306 CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_0900_ai_ci"]
./docker/env/mysql.env
MYSQL_ROOT_PASSWORD=123456 LANG=C.UTF-8
如果有多个组件依赖 MySQL,还可以通过初始化脚本给各个组件创建不同的数据库、账户和密码。示例初始化脚本如下:./docker/config/mysql/init.sql -- https://stackoverflow.com/a/52899915
-- create databases CREATE DATABASE IF NOT EXISTS `diguage`; -- create root user and grant rights -- https://stackoverflow.com/a/16592722 CREATE USER IF NOT EXISTS 'diguage'@'%' IDENTIFIED BY '123456'; GRANT ALL ON diguage.* TO 'diguage'@'%'; FLUSH PRIVILEGES;
登录验证:
$ mysql -h127.0.0.1 -uroot -p123456
NACOS
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个由阿里巴巴推出的,更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
1、在 ./docker/config/mysql/init.sql 文件中增加初始化数据库、账户和密码的 SQL 语句。
CREATE USER IF NOT EXISTS 'nacos'@'%' IDENTIFIED BY '123456'; GRANT ALL ON nacos.* TO 'nacos'@'%';
2、添加数据库初始化脚本 ./docker/config/nacos/mysql-schema.sql 到 docker/images/mysql.dockerfile 中。
# https://raw.githubusercontent.com/alibaba/nacos/develop/distribution/conf/mysql-schema.sql # 在文件头加一句 SQL: use nacos; ADD ./docker/config/nacos/mysql-schema.sql /docker-entrypoint-initdb.d/nacos-mysql.sql
3、添加必要的环境变量配置文件 ./docker/env/nacos.env。
PREFER_HOST_MODE=hostname MODE=standalone SPRING_DATASOURCE_PLATFORM=mysql MYSQL_SERVICE_HOST=mysql MYSQL_SERVICE_DB_NAME=nacos MYSQL_SERVICE_PORT=3306 MYSQL_SERVICE_USER=nacos MYSQL_SERVICE_PASSWORD=123456 MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true NACOS_AUTH_IDENTITY_KEY=2222 NACOS_AUTH_IDENTITY_VALUE=2xxx NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
4、docker-compose.yml 的内容最后一起给出。下同,不在赘述。
验证网页: http://127.0.0.1:8848/nacos/ ,监控数据见: http://localhost:8848/nacos/actuator/prometheus
Prometheus
部署好 NACOS,下面来部署一下 Prometheus,并且用 Prometheus 来监控 NACOS。
1、增加配置文件: ./docker/config/prometheus/prometheus.yml。
# my global config global: scrape_interval: 5s # Set the scrape interval to every 5 seconds. Default is every 1 minute. evaluation_interval: 5s # Evaluate rules every 5 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: [ 'localhost:9090' ] - job_name: 'nacos' metrics_path: '/nacos/actuator/prometheus' static_configs: - targets: [ 'nacos:8848' ]
接入新应用需要的配置
2、由于 NACOS 官方镜像内置的配置文件没有开启 Prometheus 监控。所以,需要增加一个配置文件,并将其挂载到容器里:./docker/config/nacos/application.properties:/home/nacos/conf/application.properties
# spring server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos} server.contextPath=/nacos server.port=${NACOS_APPLICATION_PORT:8848} server.tomcat.accesslog.max-days=30 server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false} server.error.include-message=ALWAYS # default current work dir server.tomcat.basedir=file:. #*************** Config Module Related Configurations ***************# ### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced. #spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:} spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:} nacos.cmdb.dumpTaskInterval=3600 nacos.cmdb.eventTaskInterval=10 nacos.cmdb.labelTaskInterval=300 nacos.cmdb.loadDataAtStart=false db.num=${MYSQL_DATABASE_NUM:1} db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false} db.user.0=${MYSQL_SERVICE_USER} db.password.0=${MYSQL_SERVICE_PASSWORD} ## DB connection pool settings db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000} db.pool.config.validationTimeout=10000 db.pool.config.maximumPoolSize=20 db.pool.config.minimumIdle=2 ### The auth system to use, currently only 'nacos' and 'ldap' is supported: nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos} ### worked when nacos.core.auth.system.type=nacos ### The token expiration in seconds: nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000} ### The default token: nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:} ### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay. nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false} nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false} nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:} nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:} ## spring security config ### turn off security nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**} # metrics for elastic search management.endpoints.web.exposure.include=* management.metrics.export.elastic.enabled=false management.metrics.export.influx.enabled=false nacos.naming.distro.taskDispatchThreadCount=10 nacos.naming.distro.taskDispatchPeriod=200 nacos.naming.distro.batchSyncKeyCount=1000 nacos.naming.distro.initDataRatio=0.9 nacos.naming.distro.syncRetryDelay=5000 nacos.naming.data.warmup=true nacos.console.ui.enabled=true nacos.core.param.check.enabled=true
新增配置。
验证网页: http://localhost:9090/
Grafana
在监控可视化方面,Grafana 还是更胜一筹。下面以 NACOS 为例,看看如何基于 Prometheus 的监控数据来做监控和报警。配置方面很简单,只需要将 Grafana 加入到 docker-compose.yml 即可。启动后,主要是在 UI 页面进行操作。
- 添加 Prometheus 类型的 Data Source。
- 添加监控面板,将 模板 导入即可。
操作细节见 Nacos 监控手册。
在 Micrometer - Spring Boot 3 DataBase Sample 中看到,可以将配置文件直接挂载到 Grafana 中,这样应该就无需配置。但是,尝试后,数据不通,后续还要再研究一下怎么优化。
验证网页: http://localhost:3000/ , 账户密码: admin/admin
业务应用接入
将业务应用接入到 Prometheus,就需要业务应用将相关监控数据暴露出来。Spring Boot 已经有相关 Starter,可以直接使用。步骤如下:
1、添加相关依赖
<!-- spring-boot-actuator依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- prometheus依赖 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
2、添加相关配置,暴露监测数据端口。配置完成后,启动应用即可在 http://localhost:8081/actuator/prometheus 中看到相关监控数据。
# application.properties 添加以下配置用于暴露指标 spring.application.name=diguage-order management.server.port=8081 management.endpoints.web.exposure.include=* management.metrics.tags.application=${spring.application.name}
3、在 ./docker/config/prometheus/prometheus.yml 中配置拉取任务:
- job_name: 'diguage-order' metrics_path: '/actuator/prometheus' static_configs: - targets: [ 'diguage-order:8848' ]
这里的域名与 docker-compose.yml 中配置的名称相对应。
4、将应用打包,接入到 docker-compose.yml 中,即可一起启动接入到系统中。
Elasticsearch
由于 Elasticsearch 8+ 的版本修改了安全策略,不允许 Kibana 使用超级管理员 elastic 连接 Elasticsearch,这里选用 7.x 版本做演示。
在测试中,还遇到一个磁盘过载导致的只读问题。解决方式如下:
1、curl -X GET "localhost:9200/_cat/allocation?v&pretty" 查看磁盘使用情况
2、解除只读状态
$ curl -X PUT "localhost:9200/test/_settings" -H 'Content-Type: application/json' -d' { "index.blocks.read_only_allow_delete": null }'
3、调整磁盘使用阈值
$ curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d' { "persistent": { "cluster.routing.allocation.disk.watermark.flood_stage": "97%", "cluster.routing.allocation.disk.watermark.high": "90%", "cluster.routing.allocation.disk.watermark.low": "85%", "cluster.info.update.interval": "1m" } }'
- 当磁盘使用超过这个百分比时,索引会被设置为只读。
- 当磁盘使用超过这个百分比时,Elasticsearch 会尝试将分片迁移到磁盘使用较少的节点。
- 当磁盘使用超过这个百分比时,会触发分片的重新分配。
- 更新磁盘使用信息的间隔时间。
Kibana
配置好 Elasticsearch 的网址、账户、密码就可以启动访问了。
Fluentd
安装 Fluentd,通过 Fluentd 把 NACOS 和业务应用的日志传输到 Elasticsearch。目前先把 NACOS 的日志接入到 Elasticsearch。这里需要一个配置文件,用于知名日志的来源及去向:./docker/config/fluentd/fluent.conf
<source> @type monitor_agent port 9880 # HTTP 监控端口,默认为 9880 </source> <source> @type tail path "/var/log/nacos/nacos.log" # NACOS 的日志路径 pos_file "/fluentd/log/nacos.pos" # 记录日志读取进度 tag "nacos.*" <parse> @type "none" # 如果 NACOS 日志是纯文本格式,可以选择 `none` 或其他解析方式 </parse> </source> <match nacos.**> @type elasticsearch host "elasticsearch" # Elasticsearch 的服务名 port 9200 logstash_format true # 格式化为 logstash 格式 logstash_prefix "nacos" # 索引前缀 include_tag_key true flush_interval 5s <buffer> flush_interval 5s </buffer> </match>
接入成功后,curl http://localhost:9200/nacos*/_search?pretty 验证 NACOS 日志接入到 Elasticsearch。下面重点介绍一下遇到的几个问题:
插件缺失导致的启动失败
由于需求将日志输送到 Elasticsearch,这就需要 fluent-plugin-elasticsearch 插件。容器中,默认是没有安装的,启动时就会导致失败。
两种解决办法:
- 基于官方镜像,在里面装上插件,再打包一个新镜像。
- 在 docker-compose.yml 中通过 command 指令,运行 Fluentd 时安装 fluent-plugin-elasticsearch 插件。
为了简单起见,直接选择第二种方案。安装命令是: command: ["sh", "-c", "gem install fluent-plugin-elasticsearch --no-document && fluentd -c /fluentd/etc/fluent.conf"]。
由于权限导致的安装失败
配置上述命令后,启动就遇到了该错误: ERROR: While executing gem … (Gem::FilePermissionError) You don’t have write permissions for the /usr/lib/ruby/gems/3.2.0 directory.。
这是由于默认以 fluent 运行的,该用户对 /usr/lib/ruby/gems/3.2.0 没有写权限。所以,在安装插件时,就会报错。
解决方案: 通过在 docker-compose.yml 中增加 user: root 配置,使用 root 来运行容器。
健康检查
尝试了三种方案:
- 启用 monitor_agent 插件,监控 9880 端口。失败!
- 使用 nc 检查 Fluentd 监听的 24224 端口。失败!
- 最后通过使用 test: [ "CMD-SHELL", "pgrep fluentd || exit 1" ] 来查看 Fluentd 的进程方式。成功!
链路追踪
站在更高的视角去看,链路追踪其实是可观测性的一部分。日志、追踪、度量,三者是相辅相成的。
在 OpenTelemetry 出现之前,日志、追踪、度量是分离的,三者各各自为战。而 OpenTelemetry 的出现,则是试图将三者统一。目前 OpenTelemetry 是云原生架构中,最炙手可热的分布式链路追踪解决方案,它提供了一套相关标准,各个厂商可以在这套标准之上进行各种各样的组件开发,大家可以根据自己的需要,选择不同的组件,进行可插拔式的安装。
OpenTelemetry
OpenTelemetry 并不需要在 Docker 中启动或者配置什么。在目前的架构中,Jaeger 是作为 OpenTelemetry 的一个实现来出现的。 OpenTelemetry 需要做的就是下载一个 Java Agent,执行 docker/config/opentelemetry/download-opentelemetry-agent.sh 脚本即可下载最新版的 Java Agent。在业务应用启动时,增加如下 JVM 参数:
-javaagent:/path/to/opentelemetry-javaagent.jar -Dotel.service.name=<业务系统名称> -Dotel.traces.exporter=otlp -Dotel.exporter.otlp.endpoint="http://localhost:4318" -Dotel.exporter.otlp.protocol=http/protobuf -Dotel.logs.exporter=console -Dotel.metrics.exporter=prometheus -Dotel.exporter.prometheus.port=8079 -Dotel.metric.export.interval=1000
- 选择 otlp exporter
- otlp exporter 的网址
- 传输协议。这个必须和 otel.exporter.otlp.endpoint 配置项及 Jaeger 暴露的端口相对应,否则传输失败。
- 将日志输出到控制台。
- 将 Metrics 信息导出到 Prometheus
- Metrics 导出的端口。Prometheus 会从端口号拉去,路径是 /metrics。
- Metrics 统计间隔。
应用启动后,可以在 Prometheus 的配置文件 docker/config/prometheus/prometheus.yml 中增加相关配置:
# 业务系统:商城 - job_name: 'mall-system' metrics_path: '/metrics' static_configs: - targets: ['host.docker.internal:8099']
这样就会 Prometheus 定期去拉取业务系统的监控信息,可以在 http://localhost:9090/targets 页面看到系统的运行状况。详细配置见: OpenTelemetry Configure the SDK。
Jaeger
最新版的 Jaeger 都被集成到了 jaegertracing/all-in-one 这个一个镜像中。简化了很多配置。将官方文档中,启动 Docker 的参数改成 Docker Compose 配置即可。初次使用 Jaeger,肯定会惊讶于它居然需要这么多端口号,具体端口号的解释见: Jaeger Getting Started。
尾部采样
尾部采样是通过考虑 Trace 内的全部或大部分 Span 来决定对 Trace 进行采样。尾部采样允许您根据从 Trace 的不同部分使用的特定条件对 Trace 进行采样,而头部采样则不具有此选项。
利用 OpenTelemetry Collector 来实现尾部采样。私以为尾部采样最大的优势是可以根据“问题”进行采样,比如耗时比较高的采样,再比如链路中出现错误,进行采样。OpenTelemetry Collector 的配置:docker/config/opentelemetry/otel-collector-config.yaml
# https://opentelemetry.io/docs/collector/configuration/ receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 processors: ${file:/etc/otelcol-contrib/tail_sampling_config.yaml} exporters: otlp: endpoint: jaeger:4317 tls: insecure: true # 根据实际情况配置 TLS extensions: health_check: pprof: zpages: service: extensions: [ health_check, pprof, zpages ] pipelines: traces: receivers: [ otlp ] processors: [ tail_sampling, batch ] exporters: [ otlp ]
这里展示三种采样示例:①超长耗时采样;②错误请求采样;③百分比随机采样:
tail_sampling: # 在采样决策之前等待的时间。这个时间允许 collector 收集更多的 # 追踪数据,以便基于更完整的信息进行决策。5s 表示等待 5 秒后进行采样决策。 # 确保采样决策基于完整的追踪数据,而不是追踪开始后的即时数据。 decision_wait: 5s # 决定如何批量处理追踪数据。具体来说,这是一个用于批处理采样决策的追踪数量阈值。 # 100 表示每处理 100 个追踪数据后进行一次采样决策。 # 优化性能,通过批量处理减少资源消耗。 num_traces: 100 # 预期每秒钟接收的新追踪数量。这个参数用于调整采样策略的性能和资源使用。 # 10 表示预期每秒钟有 10 个新追踪到达。 # 帮助处理器优化其内部数据结构和性能,以适应流量模式。 expected_new_traces_per_sec: 10 # 配置用于存储已采样追踪的缓存设置。 decision_cache: # 缓存中可存储的已采样追踪的最大数量。500 表示缓存最多存储 500 个已采样的追踪。 # 控制缓存的大小,防止内存占用过高。 sampled_cache_size: 500 # 定义一组采样策略,决定哪些追踪应被采样(保留)或丢弃。采样决策按顺序应用,直到一个策略匹配。 policies: [ # 基于追踪的延迟时间来决定是否采样。延迟阈值(毫秒)。 # 有助于识别和分析性能瓶颈或异常延迟的追踪。 { name: test-policy-2, type: latency, # 如果一个追踪的总延迟时间超过 119 毫秒,则该追踪将被采样。延迟阈值(毫秒)。 latency: { threshold_ms: 119 } }, # 基于概率进行采样,即以一定的概率采样追踪数据。 # 用于控制采样率,以在保持数据质量的同时减少数据量。 { name: test-policy-4, type: probabilistic, # hash_salt:用于哈希计算的盐值。 # sampling_percentage:采样百分比,20 表示 20% 的追踪将被采样。 probabilistic: { hash_salt: "39b68c2b07f28452df4e64357e749139", sampling_percentage: 20 } }, # 基于追踪的状态码来决定是否采样。 # 用于重点关注有错误或未设置状态码的追踪,以便快速识别和修复问题。 { name: test-policy-5, type: status_code, # status_codes:要匹配的状态码列表。 status_code: { status_codes: [ ERROR ] } }, ]
尾部采样的配置文件在 docker/config/opentelemetry/tail_sampling_config.yaml。,
完整 docker-compose.yml
services: # mysql -h127.0.0.1 -uroot -p123456 mysql: container_name: mysql build: context: . dockerfile: ./docker/images/mysql.dockerfile image: example/mysql:8.4 environment: - TZ=Asia/Shanghai # 设置时区为上海时间 env_file: - ./docker/env/mysql.env volumes: - ./data/mysql:/var/lib/mysql ports: - "3306:3306" healthcheck: test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] interval: 30s # 每 30 秒检查一次 timeout: 10s # 请求超时时间为 10 秒 retries: 5 # 如果检查失败,最多重试 5 次 start_period: 60s # 等待 60 秒后再开始进行 healthcheck # Nacos: http://127.0.0.1:8848/nacos/ # http://localhost:8848/nacos/actuator/prometheus # http://localhost:8848/nacos/actuator/health nacos: image: nacos/nacos-server:${NACOS_VERSION:-latest} container_name: nacos environment: - TZ=Asia/Shanghai # 设置时区为上海时间 env_file: - ./docker/env/nacos.env volumes: - ./docker/config/nacos/application.properties:/home/nacos/conf/application.properties - nacos_log:/home/nacos/logs ports: - "8848:8848" - "9848:9848" restart: on-failure healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:8848/nacos/actuator/health" ] interval: 30s # 每 30 秒检查一次 timeout: 10s # 请求超时时间为 10 秒 retries: 5 # 如果检查失败,最多重试 5 次 start_period: 60s # 等待 60 秒后再开始进行 healthcheck depends_on: mysql: condition: service_healthy # Prometheus: http://localhost:9090/ # http://localhost:9090/-/healthy prometheus: image: prom/prometheus:${PROMETHEUS_VERSION:-latest} container_name: prometheus environment: - TZ=Asia/Shanghai # 设置时区为上海时间 command: - --config.file=/etc/prometheus/prometheus.yml volumes: - ./docker/config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro ports: - 9090:9090 restart: on-failure healthcheck: test: [ "CMD", "wget", "--spider", "http://localhost:9090/-/healthy" ] interval: 30s # 每 30 秒检查一次 timeout: 10s # 请求超时时间为 10 秒 retries: 5 # 如果检查失败,最多重试 5 次 start_period: 60s # 等待 60 秒后再开始进行 healthcheck depends_on: - nacos # Grafana: http://localhost:3000/ # admin/admin grafana: container_name: grafana image: grafana/grafana:${GRAFANA_VERSION:-latest} environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin - TZ=Asia/Shanghai # 设置时区为上海时间 volumes: - ./data/grafana:/var/lib/grafana # 将主机目录映射到 Grafana 容器内的 /var/lib/grafana ports: - 3000:3000 restart: on-failure healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:3000/api/health" ] interval: 30s # 每 30 秒检查一次 timeout: 10s # 请求超时时间为 10 秒 retries: 5 # 如果检查失败,最多重试 5 次 start_period: 60s # 等待 60 秒后再开始进行 healthcheck depends_on: - prometheus # ElasticSearch http://localhost:9200/ # http://localhost:9200/_cluster/health elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTICSEARCH_VERSION:-7.17.24} container_name: elasticsearch environment: - discovery.type=single-node - ELASTIC_PASSWORD='123456' # 设置 elastic 用户的默认密码 - TZ=Asia/Shanghai # 设置时区为上海时间 ulimits: memlock: soft: -1 hard: -1 volumes: - ./data/elasticsearch:/usr/share/elasticsearch/data ports: - "9200:9200" - "9300:9300" healthcheck: test: [ "CMD-SHELL", "curl -fsSL http://localhost:9200/_cluster/health || exit 1" ] interval: 30s # 每 30 秒检查一次 timeout: 10s # 请求超时时间为 10 秒 retries: 5 # 如果检查失败,最多重试 5 次 start_period: 60s # 等待 60 秒后再开始进行 healthcheck # Kibana http://localhost:5601 # http://localhost:5601/api/status kibana: image: docker.elastic.co/kibana/kibana:${KIBANA_VERSION:-7.17.24} container_name: kibana environment: - ELASTICSEARCH_URL=http://elasticsearch:9200 - ELASTICSEARCH_USERNAME=elastic - ELASTICSEARCH_PASSWORD='123456' - TZ=Asia/Shanghai # 设置时区为上海时间 ports: - "5601:5601" restart: on-failure healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:5601/api/status" ] interval: 30s # 每 30 秒检查一次 timeout: 10s # 请求超时时间为 10 秒 retries: 5 # 如果检查失败,最多重试 5 次 start_period: 60s # 等待 60 秒后再开始进行 healthcheck depends_on: - elasticsearch # Fluentd http://localhost:9880/api/plugins.json 插件的安装情况 fluentd: image: fluentd:${FLUENTD_VERSION:-latest} container_name: fluentd user: root # 使用 root 用户安装插件 ports: - "24224:24224" - "9880:9880" # 开启监控端口 volumes: - ./docker/config/fluentd/fluent.conf:/fluentd/etc/fluent.conf # 挂载 Fluentd 配置文件 - ./data/fluentd:/fluentd/log # 持久化 Fluentd 数据目录 - nacos_log:/var/log/nacos # 挂载 NACOS 日志目录 environment: FLUENT_ELASTICSEARCH_HOST: elasticsearch FLUENT_ELASTICSEARCH_PORT: 9200 TZ: Asia/Shanghai # 设置时区为上海时间 # command: ["sh", "-c", "gem install fluent-plugin-elasticsearch --no-document && fluentd -c /fluentd/etc/fluent.conf"] command: [ "sh", "-c", "gem install fluent-plugin-elasticsearch --no-document && chown -R fluent /usr/lib/ruby/gems && fluentd -c /fluentd/etc/fluent.conf" ] healthcheck: test: [ "CMD-SHELL", "pgrep fluentd || exit 1" ] interval: 30s # 每 30 秒检查一次 timeout: 10s # 请求超时时间为 10 秒 retries: 5 # 如果检查失败,最多重试 5 次 start_period: 60s # 等待 60 秒后再开始进行 healthcheck depends_on: - elasticsearch # Jaeger: http://localhost:16686 jaeger: image: jaegertracing/all-in-one:${JAEGER_VERSION:-latest} container_name: jaeger environment: - TZ=Asia/Shanghai # 设置时区为上海时间 ports: - "16686:16686" # Jaeger UI - "14268:14268" # Jaeger Collector HTTP, accept jaeger.thrift directly from clients - "14250:14250" # Jaeger Collector gRPC, accept model.proto - "14317:4317" # accept OpenTelemetry Protocol (OTLP) over gRPC - "14318:4318" # accept OpenTelemetry Protocol (OTLP) over HTTP - "9411:9411" # Zipkin compatible endpoint (optional) - "6831:6831/udp" # accept jaeger.thrift over Thrift-compact protocol (used by most SDKs) - "6832:6832/udp" # accept jaeger.thrift over Thrift-binary protocol (used by Node.js SDK) - "5775:5775/udp" # (deprecated) accept zipkin.thrift over compact Thrift protocol (used by legacy clients only) - "5778:5778" # serve configs (sampling, etc.) # https://www.jaegertracing.io/docs/1.62/getting-started/ 各端口用途 healthcheck: test: [ "CMD", "wget", "--spider", "http://localhost:16686/" ] interval: 30s # 每 30 秒检查一次 timeout: 10s # 请求超时时间为 10 秒 retries: 5 # 如果检查失败,最多重试 5 次 start_period: 60s # 等待 60 秒后再开始进行 healthcheck otel-collector: image: otel/opentelemetry-collector-contrib:${OPEN_TELEMETRY_COLLECTOR_VERSION:-latest} container_name: otel-collector environment: - TZ=Asia/Shanghai # 设置时区为上海时间 volumes: - ./docker/config/opentelemetry/otel-collector-config.yaml:/etc/otelcol-contrib/config.yaml - ./docker/config/opentelemetry/tail_sampling_config.yaml:/etc/otelcol-contrib/tail_sampling_config.yaml ports: - 1888:1888 # pprof extension - 8888:8888 # Prometheus metrics exposed by the Collector - 8889:8889 # Prometheus exporter metrics - 13133:13133 # health_check extension - 4317:4317 # OTLP gRPC receiver - 4318:4318 # OTLP http receiver - 55679:55679 # zpages extension depends_on: - jaeger volumes: nacos_log:
参考
- 无标签