我在构建Docker镜像并运行docker run -t imageName
在容器内部,我的python脚本正在发出Web请求(外部API调用),然后通过localhost:5000与logstash套接字进行通信。
我的dockerfile非常简单:
FROM ubuntu:14.04
RUN apt-get update -y
RUN apt-get install -y nginx git python-setuptools python-dev
RUN easy_install pip
#Install app dependencies
RUN pip install requests configparser
EXPOSE 80
EXPOSE 5000
#Add project directory
ADD . /usr/local/scripts/
#Set default working directory
WORKDIR /usr/local/scripts
CMD ["python", "logs.py"]
但是,当我尝试运行此消息时,收到[ERROR] Connection refused
消息。对我来说,我在这里做错了什么并不是很明显 - 我相信我会向外界开放80和5000?这是不正确的?感谢。
答案 0 :(得分:2)
关于EXPOSE
:
您运行的每个容器都有自己的网络接口。执行EXPOSE 5000
告诉docker将端口5000 从 container-network-interface链接到主机中的随机端口(请参阅docker ps
),只要告诉您当docker run
-P
时,泊坞人可以使用此功能。
关于logstash。
如果您的logstash安装在您的主机或其他容器中,则表示logstash不在" localhost"容器(请记住,每个容器都有自己的网络接口,每个容器都有自己的localhost
)。所以你需要正确指向logstash。
如何?
方法1:
不要为容器提供自己的接口,因此它与您的机器具有相同的localhost
:
docker run --net=host ...
方法2:
如果您使用的是docker-compose,请使用docker network links。即:
services:
py_app:
...
links:
- logstash
logstash:
image: .../logstash..
所以指出:logstash:5000
(泊坞窗将该名称解析为与logstash
对应的内部IP)
方法3:
如果logstash在您的localhost:5000
(来自您的主机)收听,您可以从容器内部指向它:172.17.0.1:5000
172.17.0.1
是host
固定IP,但这个选项不太优雅,可以说是