在nginx和/或防火墙后面运行docker容器的问题

时间:2018-03-20 13:18:22

标签: docker nginx iptables

我在 nginx后面运行docker ,注册表容器和我自己的容器运行gunicorn django webapp。

django webapp在docker容器外运行 。但是,一旦我尝试从容器中运行django webapp,webapp就会失败并显示来自nginx的消息:

2018/03/20 15:39:30 [error] 14767#0: *360 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 10.38.181.123, server: app.ukrdc.nhs.uk, request: "POST /convert/pv-to-rda/ HTTP/1.1", upstream: "http://127.0.0.1:9300/convert/pv-to-rda/", host: "app.ukrdc.nhs.uk"

当我开始使用webapp时。

注册表容器工作正常。

  1. 我已经在Dockerfile中公开了正确的端口

  2. 运行命令为:

    docker run -ti -p 9300:9300 ukrdc / ukrdc-webapi

  3. 将端口添加到iptables。

  4. (来自iptables -S

    的输出
    -P INPUT ACCEPT
    -P FORWARD ACCEPT
    -P OUTPUT ACCEPT
    -N DOCKER
    -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 5000 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 9300 -j ACCEPT
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -o docker0 -j DOCKER
    -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -i docker0 -o docker0 -j ACCEPT
    -A DOCKER -d 172.17.0.1/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5000 -j ACCEPT
    -A DOCKER -d 172.17.0.20/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 9300 -j ACCEPT)
    

    这些迹象表明我的容器和/或防火墙规则有问题,但我不确定是什么。我想我和注册表容器一样。

    使用Docker 1.7.1版在Centos 6.9上运行,构建786b29d / 1.7.1

    答案是:

    使用

    运行django应用程序
     exec gunicorn mysite.wsgi \
    -    -b 127.0.0.1:9300 \
    +    -b 0.0.0.0:9300 \
        --name ukrdc_django \
        --workers 3 \
        --log-level=info \
    

    我将它绑定到本地环回地址。它现在已经绑定到所有地址,现在可以使用了。

1 个答案:

答案 0 :(得分:1)

尝试将-P添加到运行命令:

docker run -P <container>

这将自动发布公开的端口。请注意区别:公开端口使其可用于docker网络上的其他容器,其中发布端口使其可供主机以及其他容器使用在网络上。

我认为您在EXPOSE命令中确实需要-P-p标记时才会使用docker run,其中&#34; P&#34 ;用于&#34;发布&#34;。根据{{​​3}},EXPOSE仅用于链接容器之间的端口,其中docker run -P <container>docker run -p 1234:1234/tcp <container>实际上会在容器外部提供端口或端口,因此nginx可以访问它来自主机。另一个选择是你可以在同一网络上的容器中运行nginx(那里有一个易于使用的标准nginx容器),然后nginx可以到达网络上所有暴露的端口,但你需要发布至少在该实例中至少有一个nginx容器的端口。

这是另一个SO帖子,它通过曝光与发布帮助了我很多:

the docker docs