(我知道其他人之前已经问过这个问题,但是我无法使用其他帖子中提出的解决方案来解决问题,所以我想我会尝试发布我的配置文件并查看是否有人可以提供帮助。)
我想为nginx创建一个容器,并使用proxy_pass
通过正在运行的Web应用程序将请求传递给容器。我无法弄清楚如何在两个容器之间进行通信。当我尝试运行docker stack deploy -c docker-compose.yml somename
时,只启动Web容器。 nginx容器无法启动,并且陷入了尝试重新启动的循环中。这是我得到的日志消息:
2017/08/16 14:56:10 [emerg] 1#1:主机未在上游找到" web:8000" 在/etc/nginx/conf.d/nginx.conf:2 nginx:找不到[emerg]主机 上游" web:8000"在/etc/nginx/conf.d/nginx.conf:2
我找到了答案,只要您使用与docker-compose.yml
文件中的服务相同的名称,nginx就会找到该变量。然而,在我的情况下,这似乎并没有帮助。
不同容器之间的通信如何工作? ' web'在哪里?变量
我见过的大多数示例都在version: "2"
文件中使用docker-compose.yml
,这是否会产生影响?
我的docker-compose.yml:
version: "3"
services:
web:
image: user/repo:web
deploy:
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "8000:80"
networks:
- webnet
nginx:
image: user/repo:nginx
ports:
- 80:80
links:
- web:web
depends_on:
- web
networks:
webnet:
Nginx配置:
upstream docker-web {
server web:8000;
}
server {
listen 80;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_pass http://docker-web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
答案 0 :(得分:2)
我想出了如何解决这个问题。得到一些帮助来修复docker-compose.yml
,所以它看起来像这样:
<强>搬运工-撰写-YML:强>
version: "3"
services:
web:
image: user/repo:web
deploy:
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "8000:80"
networks:
main:
aliases:
- web
nginx:
image: user/repo:nginx
ports:
- 80:80
links:
- web:web
depends_on:
- web
networks:
main:
aliases:
- nginx
networks:
main:
此后nginx容器实际运行,但它仍然无法连接到Web容器。发现我能够使用curl web
和curl web -p 8000
从nginx容器内部从Web获取页面。然后我改变了nginx.conf
中的上游
upstream docker-web {
server web:8000;
}
到此:
upstream docker-web {
server web;
}
答案 1 :(得分:2)
很简单。只需更改旧配置:
upstream docker-web {
server web:8000;
}
到这个新的:
upstream docker-web {
server web:80;
}
原因是,容器之间无法与已发布的端口进行通信。它只能与目标端口通信。 8000:80(发布的端口为8000,目标端口为80)。
假设您拥有8000:443,则必须在Nginx内使用“ server web:443”创建配置以侦听443端口号。希望有帮助。
答案 2 :(得分:1)
您好,问题在于链接web:web的端口时,您需要指定容器运行示例服务的端口
ports:
- "8000:80"
表示可以在端口80上访问容器内的内容,但在主机上可以通过8000访问。 这是关于在docker-compose中链接两个服务的doc
因此,如果要在代理nginx中访问网站,请不要使用8000 但使用:
upstream docker-web {
server web:80;
}
相反,这应该可以工作:)
或(两者都相同)
upstream docker-web {
server web;
}
答案 3 :(得分:0)
您可以通过编辑 / etc / hosts 文件并为您的网络主机添加正确的条目来实现这一目标
1.1.1.1 web
显然,您必须将1.1.1.1替换为Web服务器的真实IP地址(我认为是私有IP地址)。保存文件,然后重试。另一种解决方法是在配置中替换:
upstream docker-web {
server web:8000;
}
带
upstream docker-web {
server web-ip-address:8000;
}
如果您要参加第二场比赛,请不要忘记重启/重新加载nginx!