问题描述
有两个正在运行的Docker容器:
1. 一个运行Nginx的Docker容器,用于提供在docker build过程中复制到Docker镜像中的Angular应用程序资源文件。
2. 一个运行API的Docker容器,该容器在容器内部监听端口5007,在主机上监听端口5007。
用户正在设置一个分阶段环境,并希望以下外部URL:
– app.staging.mysite.com
– account.staging.mysite.com
app.staging.mysite.com可以通过端口80访问,并正常响应Angular应用程序资源。
现在,用户希望account.staging.mysite.com的外部API URL请求能够命中监听端口5007的API Docker容器。account.staging.mysite.com的请求将命中主机机器的端口80。
Nginx将接收account.staging.mysite.com端口80的请求,并将其代理到Docker容器的127.0.0.1:5007,同时仍然为所有未在Nginx配置中显式表达为代理的外部URL/域名提供Angular应用程序文件。
用户修改了Nginx配置如下:
upstream accountstaging {
server 0.0.0.0:5007;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Main
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri$args $uri$args/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name account.staging.mysite.com;
location / {
proxy_pass http://accountstaging;
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-compose.yml文件,一个用于account.staging.mysite.com,一个用于app.staging.mysite.com。
用户怀疑问题可能是因为Angular应用程序前端Docker容器绑定了80:80端口。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据用户提供的信息,我们可以得出以下解决方案:
- 首先,我们需要创建一个docker-compose.yml文件,用于同时启动Nginx代理容器和API容器。以下是示例docker-compose.yml文件的内容:
version: '3'
services:
reverseproxy:
build:
context: ./
dockerfile: docker/nginxproxy/docker/Dockerfile
image: tsl.devops.reverseproxy.image
container_name: tsl.devops.reverseproxy.container
ports:
- "80:80"
apistaging:
build:
context: ./
dockerfile: docker/staging/Dockerfile
image: tsl.api.example.image
container_name: tsl.api.example.container
ports:
- "5023:5023"
environment:
ASPNETCORE_URLS: http://+:5023
- 在Nginx配置中,我们需要将代理目标更改为Docker容器的服务名称。以下是修改后的Nginx配置:
upstream accountstaging {
server apistaging:5023;
}
server {
listen 80;
server_name account.staging.mysite.com;
location / {
proxy_pass http://accountstaging;
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;
}
}
请注意,我们将proxy_pass
的值更改为http://accountstaging
,其中accountstaging
是Docker容器的服务名称。
方案2
根据用户提供的信息,我们可以得出以下解决方案:
- 首先,我们需要创建一个docker-compose.yml文件,用于同时启动Nginx代理容器和API容器。以下是示例docker-compose.yml文件的内容:
version: '3'
services:
reverseproxy:
build:
context: ./
dockerfile: docker/nginxproxy/docker/Dockerfile
image: tsl.devops.reverseproxy.image
container_name: tsl.devops.reverseproxy.container
ports:
- "80:80"
apistaging:
build:
context: ./
dockerfile: docker/staging/Dockerfile
image: tsl.api.example.image
container_name: tsl.api.example.container
ports:
- "5023:5023"
environment:
ASPNETCORE_URLS: http://+:5023
- 在Nginx配置中,我们需要将代理目标更改为Docker容器的IP地址和端口号。以下是修改后的Nginx配置:
upstream accountstaging {
server 127.0.0.1:5023;
}
server {
listen 80;
server_name account.staging.mysite.com;
location / {
proxy_pass http://accountstaging;
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;
}
}
请注意,我们将proxy_pass
的值更改为http://127.0.0.1:5023
,其中127.0.0.1
是Nginx容器内部的IP地址。
方案3
根据用户提供的信息,我们可以得出以下解决方案:
- 首先,我们需要创建一个docker-compose.yml文件,用于同时启动Nginx代理容器和API容器。以下是示例docker-compose.yml文件的内容:
version: '3'
services:
reverseproxy:
build:
context: ./
dockerfile: docker/nginxproxy/docker/Dockerfile
image: tsl.devops.reverseproxy.image
container_name: tsl.devops.reverseproxy.container
ports:
- "80:80"
apistaging:
build:
context: ./
dockerfile: docker/staging/Dockerfile
image: tsl.api.example.image
container_name: tsl.api.example.container
ports:
- "5023:5023"
environment:
ASPNETCORE_URLS: http://+:5023
- 在Nginx配置中,我们需要将代理目标更改为Docker容器的服务名称,并将
proxy_pass
的值更改为http://accountstaging
。以下是修改后的Nginx配置:
upstream accountstaging {
server apistaging:5023;
}
server {
listen 80;
server_name account.staging.mysite.com;
location / {
proxy_pass http://accountstaging;
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;
}
}
请注意,我们将proxy_pass
的值更改为http://accountstaging
,其中accountstaging
是Docker容器的服务名称。
以上是解决方案的几个示例,根据用户的具体情况选择适合的方案。请确保在应用解决方案之前备份相关文件和配置。