在构建我的 Docker 镜像并运行 docker run -t imageName 后,我遇到连接被拒绝的问题
在容器内,我的 python 脚本发出网络请求(外部 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?这是不正确的吗?谢谢。
请您参考如下方法:
关于EXPOSE:
您运行的每个容器都有自己的网络接口(interface)。执行 EXPOSE 5000 告诉 docker 将端口 5000 从 container-network-interface 链接到主机中的随机端口(使用 docker ps 查看它>),只要你在使用 -P docker run 时告诉 docker 执行此操作即可。
关于 logstash。
如果你的logstash安装在你的宿主机上,或者安装在另一个容器中,这意味着logstash不在容器的“localhost”中(记住每个容器都有自己的网络接口(interface),每个容器都有自己的本地主机)。所以你需要正确地指向 logstash。
如何?
方法一:
不要给容器自己的接口(interface),所以它和你的机器有相同的localhost:
docker run --net=host ...
方法二:
如果您使用的是 docker-compose,请使用 docker 网络链接。即:
services:
py_app:
...
links:
- logstash
logstash:
image: .../logstash..
所以点如下:logstash:5000(docker 会将该名称解析为对应于 logstash 的内部 IP)
方法三:
如果 logstash 监听您的 localhost:5000(来自您的主机),您可以从您的容器内部指向它:172.17.0.1:5000( 172.17.0.1 是host 固定IP,但这个选项不太优雅,可以说)
