Docker组合服务通信
所以我有一个docker compose文件,包含3个服务:后端、react前端和mongo 后端Dockerfile:Docker组合服务通信,docker,docker-compose,network-programming,port,continuous-deployment,Docker,Docker Compose,Network Programming,Port,Continuous Deployment,所以我有一个docker compose文件,包含3个服务:后端、react前端和mongo 后端Dockerfile: FROM ubuntu:latest WORKDIR /backend-server COPY ./static/ ./static COPY ./config.yml ./config.yml COPY ./builds/backend-server_linux ./backend-server EXPOSE 8080 CMD ["./backend-server"] F
FROM ubuntu:latest
WORKDIR /backend-server
COPY ./static/ ./static
COPY ./config.yml ./config.yml
COPY ./builds/backend-server_linux ./backend-server
EXPOSE 8080
CMD ["./backend-server"]
FROM nginx:stable
WORKDIR /usr/share/nginx/html
COPY ./build .
COPY ./.env .env
EXPOSE 80
CMD ["sh", "-c", "nginx -g \"daemon off;\""]
前端Dockerfile:
FROM ubuntu:latest
WORKDIR /backend-server
COPY ./static/ ./static
COPY ./config.yml ./config.yml
COPY ./builds/backend-server_linux ./backend-server
EXPOSE 8080
CMD ["./backend-server"]
FROM nginx:stable
WORKDIR /usr/share/nginx/html
COPY ./build .
COPY ./.env .env
EXPOSE 80
CMD ["sh", "-c", "nginx -g \"daemon off;\""]
所以我想没什么不寻常的
docker-compose.yml:
version: "3"
services:
mongo-db:
image: mongo:4.2.0-bionic
container_name: mongo-db
volumes:
- mongo-data:/data
network_mode: bridge
backend:
image: backend-linux:latest
container_name: backend
depends_on:
- mongo-db
environment:
- DATABASE_URL=mongodb://mongo-db:27017
..etc
network_mode: bridge
# networks:
# - mynetwork
expose:
- "8080"
ports:
- 8080:8080
links:
- mongo-db:mongo-db
restart: always
frontend:
image: frontend-linux:latest
container_name: frontend
depends_on:
- backend
network_mode: bridge
links:
- backend:backend
ports:
- 80:80
restart: always
volumes:
mongo-data:
driver: local
这是有效的。我的问题是,通过将
端口:-8080:8080
添加到后端部分,主机就可以使用该服务器。理论上,网络应该在没有这些行的情况下工作,正如我在docker文档和中读到的,但是如果我删除它,API调用就会停止工作(但是在docker compose中写在前端服务下的curl调用仍然可以工作)。您的react前端正在从浏览器发出请求。
因此,在本例中,您的API需要能够被浏览器访问,而不是分发静态js、css和html文件的容器
希望这张照片有点道理
另外,如果您不想公开API,可以让Web服务器代理/API/到API容器的请求,这将在网络级别发生,这意味着您只需要公开一台服务器
我通过使用Nginx为我的Angular应用程序提供服务,然后将/app1/api/*的流量代理到一个容器和/app2/api/*的流量代理到另一个容器等等来实现这一点,这是有道理的,我感到惭愧。感谢您的解释和这张艺术序列图。如果我是对的,这就是代理过滤器的用途。代理有很多不同的形式,最纯粹的形式,它只是一个中间人。正如你所发现的,你可能有很多理由想这么做。但它通常集中在访问受限的情况下,当然在你的情况下,它甚至不是设计的,只是因为网络不一样,你不想完全自然地开放一切。代理筛选器是一个中间人,用于应用筛选,或者出于安全原因,想要限制某些内容、阻止站点等。