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

在nginx和/或防火墙后面运行docker容器时出现问题,docker,nginx,iptables,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

我在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"
当我在网络应用上做一次尝试时

注册表容器工作正常

  • 我在Dockerfile中暴露了正确的端口

  • 运行命令是:

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

  • 将端口添加到iptables

  • (来自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)
    
    这些迹象表明我的容器和/或防火墙规则有问题,但我不确定是什么问题。我想我正在做与注册表容器相同的事情

    在Centos 6.9上运行,Docker版本为1.7.1,构建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 \
    

    我已将其绑定到本地回圈地址。它现在绑定到所有地址,现在可以工作。

    尝试将
    -p
    添加到run命令:

    docker run -P <container>
    
    docker运行-P
    
    这将自动发布公开的端口。请注意区别:公开端口使docker网络上的其他容器可以使用该端口,而发布端口使主机以及网络上的其他容器可以使用该端口

    我认为您在使用
    EXPOSE
    时确实需要
    -p
    -p
    标记在
    docker run
    命令上,其中“p”表示“发布”。根据,
    EXPOSE
    仅用于链接容器之间的端口,其中as
    docker run-P
    docker run-P 1234:1234/tcp
    将实际使容器外部的一个或多个端口可用,以便nginx可以从主机访问它。另一个选项是可以在同一网络上的容器中运行nginx(有一个易于使用的标准nginx容器),然后nginx可以访问网络上所有公开的端口,但在该实例中,您至少需要发布一个nginx容器的端口

    下面是另一篇SO帖子,它在公开与发布方面对我帮助很大:

    您能否添加“失败消息”并提供一个?