【问题标题】:Docker-compose and nginx proxyDocker-compose 和 nginx 代理
【发布时间】:2018-04-24 19:18:52
【问题描述】:

我正在尝试使用 jwilder/nginx-proxy 作为我的 angular2 应用程序的反向代理,该应用程序分为 3 个容器(angular、express 和数据库)。

我尝试了不同的配置来在端口 80 上代理对我的应用程序的请求,但是当我尝试运行 docker-compose 时,我得到:

ERROR: for angular  Cannot start service angular: driver failed programming 
external connectivity on endpoint example_angular_1
(335ce6d0c775b7837eb436fff97bbb56bfdcaece22d51049e1eb4bf5ce45553c): Bind for 
0.0.0.0:80 failed: port is already allocated

虽然消息很清楚,端口 80 上存在冲突,但我无法找到绕过它的方法,但当我将 angular 容器设置为在端口 4200 上工作时它工作得很好,但我必须指定每次我想访问页面时 url 中的端口号。我正在使用反向代理,因为它不是将在我的环境中运行的唯一应用程序

下面是我的 docker-compose.yml

version: '3'

services:
    nginx-proxy:
        image: jwilder/nginx-proxy
        container_name: nginx-proxy
        ports: - "80:80"
        volumes: - /var/run/docker.sock:/tmp/docker.sock:ro

    angular:
        build: client
        ports: - "80"
        environment:
            - VIRTUAL_HOST=example.com
            - VIRTUAL_PORT=80
        restart: always

     express:
         build: server
         ports: - "3000:3000"
         links: - database
         restart: always

     database:
         image: mongo
         ports: - "27017:27017"
         restart: always

networks:
  default:
   external:
     name: nginx-proxy

还有 Dockerfile 用于 Angular 容器

FROM node:8-alpine as builder

COPY package.json package-lock.json ./

RUN npm set progress=false && npm config set depth 0 && npm cache clean --force

RUN npm i && mkdir /ng-app && cp -R ./node_modules ./ng-app

WORKDIR /ng-app

COPY . .

RUN $(npm bin)/ng build --prod --build-optimizer

FROM nginx:1.13.3-alpine

COPY nginx/default.conf /etc/nginx/conf.d/

RUN rm -rf /usr/share/nginx/html/*

COPY --from=builder /ng-app/dist /usr/share/nginx/html

CMD ["nginx", "-g", "daemon off;"]

EXPOSE 80

【问题讨论】:

  • 为什么要用2个nginx?您只需将 express 的代理传递规则放入 Angular nginx 中即可实现所需的一切。
  • 1 是反向代理,第二个是托管 angular2 应用程序本身。 express 容器是 Angular 的后端,我想让所有东西尽可能模块化,这样组件就可以自己重用。如果有意义的话,我不希望 angular 容器知道其他应用程序。

标签: docker nginx proxy docker-compose jwilder-nginx-proxy


【解决方案1】:

问题是您尝试打开主机上的 80 端口两次。一次用于 nginx-proxy,一次用于 Angular。从 Angular 中删除“端口 80”。

【讨论】:

  • 我之前尝试过删除角度配置的 ports: - "80" 部分。 docker-compose 启动时没有错误,但是我没有得到关于启动 angular 容器的消息旁边的绿色 done 并且似乎没有在端口 80 上监听当我测试时。
  • 这是因为您在 localhost 上有代理传递。尝试在 angular:80 上设置代理通行证,或为 angular 容器使用不同的端口。
【解决方案2】:

浏览器将与您设置的 virtual_port 上的容器对话。 也许您可以通过 api 端点将请求定向到后端

【讨论】:

    【解决方案3】:

    如果你想使用 nginx 作为反向代理,你需要使用 80 端口访问它。然后修改 nginx 配置以重定向到您的 Angular 容器和端口(例如 81)。试试这个:“proxy_pass http://angular:81”。这应该可以。

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2021-11-09
      相关资源
      最近更新 更多