lan*_*gio 15 nginx docker docker-compose
(我知道其他人之前已经问过这个问题,但我无法使用其他帖子中提出的解决方案解决问题,所以我想我会尝试发布我的配置文件,看看是否有人可以提供帮助。)
我想为 nginx 创建一个容器,并使用proxy_pass正在运行的 Web 应用程序将请求传递给容器。我不知道如何在两个容器之间进行通信。当我尝试运行时docker stack deploy -c docker-compose.yml somename,只有 Web 容器启动。nginx容器启动失败,卡在尝试重启的循环中。这是我得到的日志消息:
2017/08/16 14:56:10 [emerg] 1#1: host not found in upstream "web:8000" in /etc/nginx/conf.d/nginx.conf:2 nginx: [emerg] host not found在 /etc/nginx/conf.d/nginx.conf:2 中的上游“web:8000”中
我找到了一个答案,只要您在docker-compose.yml文件中使用与服务下相同的名称,nginx 就会找到该变量。但是,这对我来说似乎没有帮助。
不同容器之间的这种通信是如何工作的?“网络”变量在哪里
我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:
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这很简单。只需更改旧配置:
upstream docker-web {
server web:8000;
}
Run Code Online (Sandbox Code Playgroud)
对于这个新的:
upstream docker-web {
server web:80;
}
Run Code Online (Sandbox Code Playgroud)
原因是容器之间无法与已发布的端口进行通信。它只能与目标端口进行通信。8000:80(8000是发布端口,80是目标端口)。
假设你有 8000:443,你必须在 Nginx 中创建带有“server web:443”的配置来监听 443 端口号。愿这有帮助。
我想出了如何解决这个问题。得到了一些帮助来修复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:
Run Code Online (Sandbox Code Playgroud)
此后,nginx 容器实际运行,但仍无法连接到 Web 容器。发现我能够同时使用这两者,curl web并curl web -p 8000从 nginx 容器内部的网络获取页面。然后我nginx.conf从这个改变了我的上游
upstream docker-web {
server web:8000;
}
Run Code Online (Sandbox Code Playgroud)
对此:
upstream docker-web {
server web;
}
Run Code Online (Sandbox Code Playgroud)
您好,您的问题在于链接 web:web 时的端口,您需要指定容器运行服务的端口,例如
ports:
- "8000:80"
Run Code Online (Sandbox Code Playgroud)
意味着在容器内部我可以通过端口 80 访问,但在主机中我可以通过 8000 访问。这是关于在 docker-compose 中链接两个服务的文档
所以如果你想在代理 nginx 中访问网络,不要使用 8000,而是使用:
upstream docker-web {
server web:80;
}
Run Code Online (Sandbox Code Playgroud)
相反,这应该有效:)
或(两者相同)
upstream docker-web {
server web;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16331 次 |
| 最近记录: |