2017-05-26 64 views
1

我得到建设我Docker映像档和运行docker run -t imageName连接被拒绝泊坞运行

我的python脚本正在Web请求(外部API调用),然后在容器内部通信的本地主机连接后拒绝: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?这是不正确的?谢谢。

+2

当我使用Docker来暴露端口时,我总是必须使用'-P srd:dst'标志......我认为如果你将它链接到另一个端口docker image with the -L flag ...或者使用docker ps'来查看它映射到的实际端口 –

回答

2

关于EXPOSE

每次运行容器都有自己的网络接口。做EXPOSE 5000告诉码头将端口5000 容器网络接口链接到主机中的随机端口(请参阅docker ps),只要您告诉码头工人在docker run-P之间执行此操作。

关于logstash。

如果您的logstash安装在您的主机或其他容器中,这意味着logstash不在容器的“本地主机”中(请记住,每个容器都有自己的网络接口,每个容器都有自己的网络接口localhost) 。所以你需要正确地指向logstash。

怎么样?

方法1:

不要给容器自身的iterface,所以它具有相同的localhost为您的机器:

docker run --net=host ... 

方法2:

如果您使用的是docker-compose,请使用docker网络链接。即:

services: 
    py_app: 
    ... 
    links: 
     - logstash 
    logstash: 
    image: .../logstash.. 

那么一点,因为这:logstash:5000(泊坞窗将名称解析为相应logstash内部IP)


方法3:

如果logstash在听你的localhost:5000(来自你的主机),你可以从你的容器中指向它:172.17.0.1:5000172.17.0.1host固定的IP,但这个选项不太优雅,可以说)

+0

感谢!我绝对可以修改logstash作品。有趣的是,我的代码首先发出一个API请求(在python脚本中)来拉动一些JSON,然后将它放到logstash上。 “拒绝连接”是否是试图访问互联网以进行此API调用的容器?我假设它也会阻止尝试达到logstash,但API调用是第一次。感谢你的帮助。 – HectorOfTroy407

+0

然后你应该看到这样的连接拒绝作为python异常,向你显示错误的代码行。什么是完整的错误信息? – Robert

+0

当使用puppet伪造的docker-platform模块时,请注意,类docker :: run的$ net参数默认为'bridge'。将它设置为'host'(上面的方法1)解决了我在https://docs.docker.com/registry/deploying/下面的教程。 – Schuh