2017-05-26 122 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