2015-05-10 90 views
8

我有以下配置:
Dockerfile運行,以接受來自主機流量泊塢窗容器

FROM centos 
MAINTAINER Eduar Tua <[email protected]> 

RUN yum -y update && yum clean all 
RUN yum -y install httpd && yum clean all 
RUN echo "Apache works" >> /var/www/html/index.html 

EXPOSE 80 

ADD run-apache.sh /run-apache.sh 
RUN chmod -v +x /run-apache.sh 

CMD ["/run-apache.sh"] 

的run-apache.sh腳本:

#!/bin/bash 

rm -rf /run/httpd/* /tmp/httpd* 

exec /usr/sbin/apachectl -D FOREGROUND 

然後,我建立一個與圖像:

sudo docker build --rm -t platzi/httpd . 

then

sudo docker run -d -p 80:80 platzi/httpd 

後,當我嘗試在80端口運行容器接受來自該主機的連接,我得到這樣的:

67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657 
FATA[0002] Error response from daemon: Cannot start container  67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657: Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use 

任何幫助嗎?

+0

你說你'正在做'碼頭運行'「,然後在'嘗試運行容器'。」爲什麼你已經運行它後運行它? – jwodder

+0

嘿@jwodder這是我寫的錯誤,運行容器後出現錯誤。那就是我的意思。 – eduartua

+0

另外,當我檢查與'docker ps'沒有容器運行。 – eduartua

回答

7

的錯誤似乎很清楚:

FATA技術從後臺程序錯誤響應:無法啓動容器67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657:錯誤啓動用戶級代理:在使用

地址已:聽TCP 0.0.0.0:80:綁定

它說「地址已經在使用」。這意味着,一些在系統上 - 可能是一個Web服務器,如Apache - 已在偵聽端口80。你要麼需要:

  • 停止Web服務器,
  • 選擇在不同的主機端口-p參數docker run
  • 只是放棄-p的說法。

由於Docker無法設置請求的端口轉發,因此它不啓動容器。

選項(a)和(b)都將允許容器綁定到主機上的端口80。這隻有在你想從主機以外的地方訪問容器時纔是必需的。

如果您只想從Docker主機訪問容器,但不希望以其他方式暴露本地網絡上的容器,則選項(c)很有用。在這種情況下,你可以使用容器IP地址由泊塢窗,您可以通過運行docker inspect和細讀輸出,或只是運行得到儘可能分配:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_id 
+1

Thanks @larsks Apache Web服務器正在我的主機系統上運行。我可以讓Apache在我的主機上運行並將流量重定向到我的容器?都在端​​口80上。 – eduartua

+0

您不能在同一個IP地址的同一端口上偵聽兩件事情。如果你希望你的容器可以從80以外的主機訪問,你需要在你的主機上分配一個額外的IP地址,然後使用'-p'標誌將該容器綁定到該地址('-p ')。 – larsks

+0

謝謝@larsks,愚蠢的問題。但是你的建議對我很有幫助。 – eduartua

7

它說80端口忙跑...這看誰正在使用端口80

netstat -tlnp | grep 80 

tcp  0  0 0.0.0.0:80    0.0.0.0:*    LISTEN  1380/nginx -g daemo 
tcp6  0  0 :::80     :::*     LISTEN  1380/nginx -g daemo 

滾動到最右邊看到有問題的進程保持端口80的PID ...其PID 1380所以讓我們做一個進程列表看出,PID

ps -eaf | grep 1380 

root  1380  1 0 11:33 ?  00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; 

這樣拆毀該問題的進程以釋放端口80

sudo kill 1380 # if you know the pid (1380 for example) 

__或__

sudo fuser -k 80/tcp # just kill whatever pid is using port 80 tcp