运行接受来自主机的流量的Docker容器

edu*_*tua 14 apache centos docker dockerfile

我有以下配置:
Dockerfile

FROM centos  
MAINTAINER Eduar Tua <eduartua@gmail.com>  

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 Code Online (Sandbox Code Playgroud)

run-apache.sh脚本:

#!/bin/bash

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

exec /usr/sbin/apachectl -D FOREGROUND
Run Code Online (Sandbox Code Playgroud)

然后我建立图像:

sudo docker build --rm -t platzi/httpd .  
Run Code Online (Sandbox Code Playgroud)

然后

sudo docker run -d -p 80:80 platzi/httpd
Run Code Online (Sandbox Code Playgroud)

之后,当我尝试运行容器接受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
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

Sco*_*and 19

它说端口80正忙...运行这个以查看谁在使用端口80

sudo 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
Run Code Online (Sandbox Code Playgroud)

滚动到最右边看到进程保持端口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;
Run Code Online (Sandbox Code Playgroud)

所以拆除那个冒犯进程以释放端口80

sudo kill 1380  # if you know the pid ( 1380 for example )
Run Code Online (Sandbox Code Playgroud)

__ 要么​​ __

sudo fuser -k 80/tcp #  just kill whatever pid is using port 80 tcp
Run Code Online (Sandbox Code Playgroud)


lar*_*sks 12

错误似乎很清楚:

FATA [0002]来自守护进程的错误响应:无法启动容器67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657:启动userland代理时出错:listen tcp 0.0.0.0:80:bind:地址已在使用中

它说,"地址已在使用中".这意味着您的系统上的某些东西 - 可能是像Apache这样的Web服务器 - 已经在端口80上进行侦听.您将需要:

  • 停止Web服务器,
  • -p参数中选择不同的主机端口docker run
  • 只是放弃了-p论点.

由于Docker无法设置请求的端口转发,因此它不会启动容器.

选项(a)和(b)都允许容器绑定到主机上的端口80.仅当您要从主机以外的其他位置访问容器时,才需要这样做.

如果您只想从docker主机访问容器但又不希望在本地网络上公开容器,则选项(c)非常有用.在这种情况下,您将使用docker分配的容器IP地址,您可以通过运行docker inspect和浏览输出来获取容器IP地址,或者只运行:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_id
Run Code Online (Sandbox Code Playgroud)


Mau*_*agu 9

如果您正在运行Ubuntu,请运行

sudo /etc/init.d/apache2 stop
Run Code Online (Sandbox Code Playgroud)

然后重新加载您的Docker映像

docker reload
Run Code Online (Sandbox Code Playgroud)