多个docker组成共享网络,拥有一个未知的nginx主机
我使用多个docker compose文件:多个docker组成共享网络,拥有一个未知的nginx主机,docker,nginx,asp.net-core,docker-compose,Docker,Nginx,Asp.net Core,Docker Compose,我使用多个docker compose文件: 一个用于在同一网络上运行:postgres和nginx =>此容器集合应始终运行 每个asp核心网站一个(每个位于特定端口上) =>此容器通过CI/CD管道(VSTS)更新 由于Nginx在定义上游时需要知道主机名,因此如果asp核心容器未运行,则其主机名未知,则Nginx在docker compose up上抛出一个错误命令: nginx | 2018/01/04 15:59:17 [emerg] 1#1: host no
- 一个用于在同一网络上运行:postgres和nginx =>此容器集合应始终运行
- 每个asp核心网站一个(每个位于特定端口上) =>此容器通过CI/CD管道(VSTS)更新
nginx | 2018/01/04 15:59:17 [emerg] 1#1: host not found in upstream
"webportalstage:5001" in /etc/nginx/nginx.conf:9
nginx | nginx: [emerg] host not found in upstream
"webportalstage:5001" in /etc/nginx/nginx.conf:9
nginx exited with code 1
显然,如果asp核心容器以前运行过,那么nginx知道主机名webportalstage,一切正常。但开始的顺序不是我所期望的
是否有任何解决方案可以在上游使用未知主机名启动nginx
这是我的nginx.conf文件:
worker_processes 4;
events { worker_connections 1024; }
http {
sendfile on;
upstream webportalstage {
server webportalstage:5001;
}
server {
listen 80;
location / {
proxy_pass http://webportalstage;
proxy_redirect off;
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;
}
}
}
和两个docker组合文件:
Nginx+Postgres:
version: "3"
services:
proxy:
image: myPrivateRepo:latest
ports:
- "80:80"
container_name: nginx
networks:
aspcore:
aliases:
- nginx
postgres:
image: postgres:latest
environment:
- POSTGRES_PASSWORD=myPWD
- POSTGRES_USER=postgres
ports:
- "5432:5432"
container_name: postgres
networks:
aspcore:
aliases:
- postgres
networks:
aspcore:
driver: bridge
version: "3"
services:
webportal:
image: myPrivateRepo:latest
environment:
- ASPNETCORE_ENVIRONMENT=Staging
container_name: webportal
networks:
common_aspcore:
aliases:
- webportal
networks:
common_aspcore:
external: true
我的asp核心网站之一:
version: "3"
services:
proxy:
image: myPrivateRepo:latest
ports:
- "80:80"
container_name: nginx
networks:
aspcore:
aliases:
- nginx
postgres:
image: postgres:latest
environment:
- POSTGRES_PASSWORD=myPWD
- POSTGRES_USER=postgres
ports:
- "5432:5432"
container_name: postgres
networks:
aspcore:
aliases:
- postgres
networks:
aspcore:
driver: bridge
version: "3"
services:
webportal:
image: myPrivateRepo:latest
environment:
- ASPNETCORE_ENVIRONMENT=Staging
container_name: webportal
networks:
common_aspcore:
aliases:
- webportal
networks:
common_aspcore:
external: true
最后,我使用extra_主机功能在我的nginx+postgres docker-compose.yml文件中定义了静态IP:
extra_hosts:
webportalstage: 10.5.0.20
并将相同的静态IP设置到我的asp core docker compose文件。
它可以工作,但不像我希望的那样通用。好吧,我在类似的情况下使用了以下技巧:
location / {
set $docker_host "webportalstage";
proxy_pass http://$docker_host:5001;
...
}
我不确定它是否适用于上游,也许应该
我知道这不是最好的解决办法,但是我没有找到更好的。nginx docker compose中的
aspcore
与core docker compose配置中的common\u aspcore
相比?是的,这很特别,但是当你用docker compose创建一个网络时,真正的网络名是:directoryName\u你服务的名称,所以我在aspcore网站中将网络称为外部网络docker用他的真名写作。我只尝试使用aspcore名称网络,但出现了一个错误,如网络不存在。如果这样做,Nxin不会崩溃吗?我的意思是,即使“webportalstage”存储在docker变量($docker\u host)中,在NGINX启动时解析行http://$docker\u host:5001时,它也会导致与我的错误相同的行为否?@Cladoo否,不是。我在一些项目中使用此解决方案。很好,我将尝试您的解决方案