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

时间:2015-05-10 21:28:32

标签: apache centos docker dockerfile

我有以下配置:
Dockerfile

Polynome

run-apache.sh脚本:

toString()

然后我用:

构建图像
public class Polynome {
    public ArrayList<Term> terms;

    @Override
    public String toString() {
        if (terms != null) {
            return terms.toString(); 
        } else {
            return "";
        }
    }
}

然后

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"]

之后,当我尝试运行容器接受来自80端口主机的连接时,我得到了这个:

#!/bin/bash

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

exec /usr/sbin/apachectl -D FOREGROUND

任何帮助?

4 个答案:

答案 0 :(得分:15)

说端口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

答案 1 :(得分:11)

错误似乎很清楚:

  

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

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

  • 停止网络服务器,
  • -p参数中选择docker run
  • 中的其他主机端口
  • 只需删除-p参数。

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

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

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

来获取容器IP地址。
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_id

答案 2 :(得分:6)

如果您正在运行Ubuntu,只需运行

sudo /etc/init.d/apache2 stop

然后重新加载Docker映像

docker reload

答案 3 :(得分:0)

我找到了解决方法:

$ docker stop container_name
$ docker commit container_name image_name
$ docker rm container_name

然后您可以根据图片创建一个新容器:

$ docker run -d -P --name container_name_the_same_or_new image_name

现在可以使用。