Skip to main content
 首页 » 编程设计

python之连接被拒绝 Docker 运行

2024年10月01日27soundcode

在构建我的 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,但这个选项不太优雅,可以说)