[英]Docker-compose: Docker containers can't connect using service names
[英]Docker-Compose can't resolve names of containers?
我有一个比较棘手的问题,因为到今天为止似乎一直运转良好。 但是,我不知道从那以后发生了什么变化。 我运行docker-compose up --build --force-recreate
,构建失败,因为它无法解析主机名。
该问题特别是由于其中一个Dockerfile中的CURL命令引起的:
USER logstash
WORKDIR /usr/share/logstash
RUN ./bin/logstash-plugin install logstash-input-beats
WORKDIR /tmp
COPY templates/winlogbeat.template.json winlogbeat.template.json
COPY templates/metricbeat.template.json metricbeat.template.json
RUN curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_template/metricbeat-6.3.2 -d@metricbeat.template.json
RUN curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_template/winlogbeat-6.3.2 -d@winlogbeat.template.json
最初,我有那些命令在Elasticsearch Container中运行,但是它停止工作,报告Could not resolve host: elasticsearch; Unknown error
Could not resolve host: elasticsearch; Unknown error
我以为可能是过早尝试执行RUN命令,因此将进程移至Logstash容器,但问题仍然存在。 Logstash取决于Elasticsearch,因此应在Logstash容器尝试运行Elastic时启动并运行Elastic。
我尝试删除图像,容器,网络等,但是似乎没有什么可以让我在构建过程中运行这些CURL命令。
我在想,也许Docker守护进程正在缓存DNS名称,但由于我已经删除并重新创建了几次网络,因此无法弄清楚如何重置它。
谁能提供任何想法?
主持人:Ubuntu Server 18.04
SW:Docker-CE(当前版本)
ELK堆栈:全部是Elastic提供的官方6.3.2图像。
码头工人,Compose.YML:
version: '2'
services:
elasticsearch:
build:
context: elasticsearch/
volumes:
- esdata:/usr/share/elasticsearch/data
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
# ports:
# - "9200:9200"
# - "9300:9300"
environment:
ES_JAVA_OPTS: "-Xmx512m -Xms512m"
HOSTNAME: "elasticsearch"
networks:
- elk
logstash:
build:
context: logstash/
volumes:
- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
- ./logstash/pipeline:/usr/share/logstash/pipeline:ro
ports:
- "5000:5000"
- "5044:5044"
- "5045:5045"
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- elk
depends_on:
- elasticsearch
kibana:
build:
context: kibana/
volumes:
- ./kibana/config/:/usr/share/kibana/config:ro
# Port 5601 is not exposed outside of the container
# Can be accessed through Nginx Reverse Proxy only
# ports:
# - "5601:5601"
networks:
- elk
depends_on:
- elasticsearch
nginx:
build:
context: nginx/
environment:
- APPLICATION_URL=http://docker.local
volumes:
- ./nginx/conf.d/:/etc/nginx/conf.d:ro
ports:
- "80:80"
networks:
- elk
depends_on:
- elasticsearch
fouroneone:
build:
context: fouroneone/
# No direct access, only through Nginx Reverse Proxy
# ports:
# - "8181:80"
networks:
- elk
depends_on:
- elasticsearch
networks:
elk:
driver: bridge
volumes:
esdata:
对Elasticsearch进行卷曲是一个错误的捷径,因为它可能没有启动,加上Dockerfile可能完全是错误的地方
另外,如果我真的想使用Dockerfile,我也不会将此脚本放在Dockerfile中,但可能会使用它来更改映像的ENTRYPOINT(再次建议不要这样做)
最好的做法是在docker-file中有一个logstash服务,仅在更新的输入插件上包含映像,并删除Dockerfile中的所有其余行。 而且您可能有一个logstash_setup服务来执行设置位(使用logstash映像或什至更清洁应安装bash和curl的基本centos映像-因为您要做的就是运行几个curl命令传递一些文件)
我正在谈论的脚本可能看起来像这样:
#!/bin/bash
set -euo pipefail
es_url=http://elasticsearch:9200
# Wait for Elasticsearch to start up before doing anything.
until curl -s $es_url -k -o /dev/null; do
sleep 1
done
#then put your code here
curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_ ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.