【发布时间】: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