You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建含Elasticsearch与Zipkin的Docker镜像并同时启动二者

解决同一Docker镜像中同时启动Elasticsearch和Zipkin的问题

核心问题分析

当前的script.sh仅启动了Zipkin,未启动Elasticsearch;且即使启动ES,也需要确保ES完全就绪后再启动Zipkin,否则Zipkin无法正常连接ES。此外,Docker镜像中需正确配置ES的运行参数与权限,确保两个服务都能稳定启动。

修改后的Dockerfile

FROM openjdk:11

# 创建用户组和用户
RUN groupadd -g 1000 elk-zipkin && useradd elk-zipkin -u 1000 -g 1000

# 创建目录并复制本地资源
RUN mkdir -p /usr/share/elasticsearch /usr/share/zipkin
COPY artifacts/elasticsearch-7.17.6.tar.gz /usr/share/elasticsearch/
COPY artifacts/zipkin.jar /usr/share/zipkin/
COPY artifacts/elasticsearch.yml /usr/share/elasticsearch/
COPY script.sh /usr/share/zipkin/

# 解压Elasticsearch并清理压缩包
WORKDIR /usr/share/elasticsearch
RUN tar xvf elasticsearch-7.17.6.tar.gz && rm elasticsearch-7.17.6.tar.gz

# 设置ES目录权限
WORKDIR /usr/share/elasticsearch/elasticsearch-7.17.6
RUN set -ex && for path in data logs config config/scripts; do \
    mkdir -p "$path"; \
    chown -R elk-zipkin:elk-zipkin "$path"; \
done

# 配置ES环境变量与路径
USER elk-zipkin
ENV PATH=$PATH:/usr/share/elasticsearch/elasticsearch-7.17.6/bin
ENV ES_JAVA_OPTS="-Xms512m -Xmx512m" # 根据容器资源调整堆内存大小

# 复制自定义ES配置文件
COPY --chown=elk-zipkin:elk-zipkin artifacts/elasticsearch.yml /usr/share/elasticsearch/elasticsearch-7.17.6/config/

# 暴露服务端口
EXPOSE 9200 9300 9411

# 切换到Zipkin目录执行启动脚本
WORKDIR /usr/share/zipkin
CMD ["sh", "script.sh"]

修改后的script.sh

#!/bin/bash

# 后台启动Elasticsearch
elasticsearch &
ES_PID=$!

# 等待Elasticsearch就绪(检测9200端口连通性)
until curl -s http://localhost:9200 > /dev/null; do
    echo "等待Elasticsearch启动..."
    sleep 5
done

echo "Elasticsearch已就绪,启动Zipkin..."
# 启动Zipkin并配置连接本地ES
STORAGE_TYPE=elasticsearch ES_HOSTS=http://localhost:9200 java -jar zipkin.jar

# 守护ES进程,防止容器异常退出
wait $ES_PID

关键配置说明

  • Elasticsearch配置要求:确保你的elasticsearch.yml包含以下核心配置,保证ES能在容器内被访问且以单节点模式运行:
    network.host: 0.0.0.0
    discovery.type: single-node
    
  • 内存优化:通过ES_JAVA_OPTS设置ES堆内存,避免因内存不足导致启动失败。
  • 启动顺序控制:脚本先后台启动ES,通过curl检测端口等待ES就绪后再启动Zipkin,解决服务依赖问题。
  • 进程守护:最后通过wait $ES_PID确保容器不会因Zipkin进程结束而退出,同时监控ES进程状态。

构建与运行命令

构建镜像

docker build -t elk-zipkin-local .

运行容器

docker run -d --name elk-zipkin -p 9200:9200 -p 9411:9411 elk-zipkin-local

服务验证

  • 访问http://localhost:9200确认Elasticsearch正常运行
  • 访问http://localhost:9411确认Zipkin UI正常加载

内容的提问来源于stack exchange,提问作者Rohit Kundu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:40:28