如何构建含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
相关产品推荐
相关产品推荐

