如何在Docker Compose中通过网络层为URL路径添加前缀?
实现方案:通过反向代理添加URI前缀
完全可行,我们可以在docker-compose中引入反向代理(以Nginx为例),通过路径重写规则在网络层完成URI前缀的添加,无需修改任何应用代码,完美复现EKS环境下的路由逻辑。
具体步骤
1. 创建Nginx配置文件
在项目目录下新建docker/nginx文件夹,创建nginx.conf文件,配置路径重写规则:
server { listen 80; # 处理带/service前缀的请求 location /service { # 去掉/service前缀后转发到service-api服务的9000端口 rewrite ^/service(.*)$ $1 break; proxy_pass http://service-api:9000; # 传递必要的请求头,保证应用能正确处理请求 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-Proto $scheme; } }
2. 修改docker-compose.yml
添加Nginx服务,将原本映射到service-api的9000端口改为映射到Nginx的80端口:
version: '3.0' services: neo4j: container_name: ${SERVICE_NAME:-service-api}-neo4j-${BUILD:-local}-${GIT_HASH} image: neo4j:${NEO4J_VERSION:-4.4.8-enterprise} volumes: - ./docker/neo4j/plugins:/plugins - ./docker/neo4j/conf:/conf - ./docker/neo4j/import:/import environment: NEO4J_AUTH: neo4j/pass NEO4J_dbms_logs_debug_level: DEBUG NEO4J_ACCEPT_LICENSE_AGREEMENT: "yes" ports: - "17687:7687" - "17474:7474" networks: - ${SERVICE_NAME:-service-api} service-api: container_name: ${SERVICE_NAME:-service-api}-${BUILD:-local}-${GIT_HASH} build: args: SERVICE_NAME: ${SERVICE_NAME:-service-api} context: ./docker/${SERVICE_NAME:-service-api} dockerfile: Dockerfile restart: on-failure depends_on: - neo4j environment: SPRING_PROFILES_ACTIVE: local # 不再对外暴露端口,仅在内部网络提供服务 networks: - ${SERVICE_NAME:-service-api} nginx: container_name: ${SERVICE_NAME:-service-api}-nginx-${BUILD:-local}-${GIT_HASH} image: nginx:alpine volumes: - ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf ports: - "9000:80" depends_on: - service-api networks: - ${SERVICE_NAME:-service-api} networks: service-api: driver: bridge
3. 测试验证
启动所有服务后,访问http://localhost:9000/service/api即可正常访问原API接口;直接访问http://localhost:9000/api会返回404,符合生产环境的路由规则。
内容的提问来源于stack exchange,提问作者Reid2
相关产品推荐
相关产品推荐

