2015-05-10 65 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