问题 运行 nginx and/or 防火墙后面的 docker 容器

problems running a docker container behind nginx and/or firewall

我 运行宁 docker 落后于 nginx,使用注册表容器和我自己的容器 运行宁 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. 我在 Docker 文件

  2. 中公开了正确的端口
  3. 运行命令为:

    docker 运行 -ti -p 9300:9300 ukrdc/ukrdc-webapi

  4. 将端口添加到 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)

迹象表明我的容器 and/or 防火墙规则有问题,但我不确定是什么。我想我正在做与注册表容器相同的事情。

运行在 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 添加到 运行 命令:

docker run -P <container>

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

我认为当你真的想在 docker run 命令上使用 -P-p 标志时,你正在使用 EXPOSE,其中 "P" 用于"publish"。根据 the docker docsEXPOSE 仅用于连接容器之间的端口,而 docker run -P <container>docker run -p 1234:1234/tcp <container> 实际上会在容器外部提供一个或多个端口,以便 nginx 可以访问它从主机。另一种选择是您可以在同一网络上的容器中 运行 nginx(那里有一个 easy-to-use 标准 nginx 容器),然后 nginx 可以到达网络上所有公开的端口,但是您在那种情况下无论如何都需要发布至少一个 nginx 容器的端口。

这是另一个 SO post,它在公开与发布方面帮助了我很多:

Difference between "expose" and "publish" in docker