我有监听8080端口的服务。这不是一个容器。
然后,我使用官方镜像创建了一个nginx容器:
docker run --name nginx -d -v /root/nginx/conf:/etc/nginx/conf.d -p 443:443 -p 80:80 nginx
毕竟:
# netstat -tupln | grep 443
tcp6 0 0 :::443 :::* LISTEN 3482/docker-proxy
# netstat -tupln | grep 80
tcp6 0 0 :::80 :::* LISTEN 3489/docker-proxy
tcp6 0 0 :::8080 :::* LISTEN 1009/java
Nginx配置:
upstream eighty {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name eighty.domain.com;
location / {
proxy_pass http://eighty;
}
}
我已经检查了我可以通过# curl http://127.0.0.1:8080
连接到此服务器
<html><head><meta http-equiv='refresh'
content='1;url=/login?from=%2F'/><script>window.location.replace('/login?from=%2F');</script></head><body
style='background-color:white; color:white;'>
...
它似乎运行良好,然而,当我试图使用我的浏览器访问时,nginx告诉bt一个502坏网关响应。
我发现这可能是一个与非容器化进程打开的对象和容器之间的可见性相关的问题。我的容器可以建立到一个被其他非容器进程打开的端口的连接吗?
编辑
其中upstream { server 127.0.0.1:8080; }
:
2016/07/13 09:06:53 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 62.57.217.25, server: eighty.domain.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "eighty.domain.com"
62.57.217.25 - - [13/Jul/2016:09:06:53 +0000] "GET / HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" "-"
其中upstream { server 0.0.0.0:8080; }
:
62.57.217.25 - - [13/Jul/2016:09:00:30 +0000] "GET / HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" 2016/07/13 09:00:30 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client:
62.57.217.25, server: eighty.domain.com, request: "GET / HTTP/1.1", upstream: "http://0.0.0.0:8080/", host: "eighty.domain.com" 2016/07/13 09:00:32 [error] 5#5: *3 connect() failed (111: Connection refused) while connecting to upstream, client: 62.57.217.25, server: eighty.domain.com, request: "GET / HTTP/1.1", upstream: "http://0.0.0.0:8080/", host: "eighty.domain.com"
62.57.217.25 - - [13/Jul/2016:09:00:32 +0000] "GET / HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" "-"
有什么想法吗?
8条答案
按热度按时间niknxzdl1#
问题
Localhost在容器方面有点棘手。在Docker容器中,localhost指向容器本身。这意味着,对于像这样的上游:
或
你告诉nginx把你的请求传递给本地主机。但是在docker-container的上下文中,localhost(以及相应的ip地址)指向容器本身:
如果您的容器不在主机网络上,则通过寻址127.0.0.1,您将永远无法到达您的主机。
解决方案
主机组网
您可以选择在与主机相同的网络上运行nginx:
请注意,在这种情况下,您不需要公开任何端口。
这是可行的,尽管你失去了Docker网络的好处。如果你有多个容器需要通过Docker网络进行通信,这种方法可能会有问题。如果你只想用docker部署nginx,不想使用任何高级的docker网络功能,这种方法很好。
访问主机远程IP地址
另一种方法是重新配置nginx upstream指令,通过添加其远程IP地址直接连接到主机:
容器现在将通过网络堆栈并正确解析您的主机:
你也可以使用你的DNS名称,如果你有一个。确保Docker知道你的DNS服务器。
tp5buhyn2#
对我来说,帮助这行代码
proxy_set_header Host $http_host;
rkttyhzu3#
只是为了完成其他答案,我使用mac进行开发,并直接在上游使用host.docker.internal为我工作,不需要传递主机远程IP地址。下面是代理nginx的配置:
正如你所看到的,我在nginx代理后面为不同的应用程序使用了不同的端口。我为app1使用了端口81,为app2使用了端口82,app1和app2都有自己的nginx容器:
对于应用程序1:
对于应用程序2:
此外,请参阅此链接了解更多详情:Docker for Mac
vwhgwdsa4#
您可以做的是配置
proxy_pass
,从container
的Angular 来看,地址将指向您的真实的主机。要从容器的Angular 获取
host
地址,您可以在Windows上使用Docker18.03
(或更新)执行以下操作:在镜像名称为
nginx
的主机上运行bash(适用于Alpine Linux distribution
):然后在容器内运行
192.168.65.2
是主机的IP -而不是像spinus
接受的答案中的网桥IP。我在这里使用host.docker.internal:
主机的IP地址不断变化(如果您没有网络访问权限,则没有)。从18.03开始,我们建议连接到特殊的DNS名称host.docker.internal,它解析为主机使用的内部IP地址。这是出于开发目的,不会在Docker for Windows之外的生产环境中工作。
然后,您可以将
nginx
配置更改为:proxy_pass http://192.168.65.2:{your_app_port};
应该能正常工作
请记住提供与本地应用程序运行时相同的
port
。c8ib6hqw5#
完整参考资料:https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
pes8fvy96#
nginx.sh(示例网站)
nginx.conf
对我很有效
6vl6ewon7#
我得到了同样的错误,但在我的情况下,这是因为我正在引导https流量(从负载均衡器- ALB)到http。将目标组的协议更改为http解决了这个问题。
vmpqdwk38#
我遇到了这个问题,结果证明是由于权限问题导致Docker容器无法启动的问题。
在我的情况下,
显示容器尚未启动并以状态1退出。原来权限在迁移到新机器时丢失了。将权限调整到父目录上的一个已知员工用户,为我解决了这个问题,然后我就可以启动docker服务,就像以前一样。