Docker组合服务通信

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

所以我有一个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"]
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/*的流量代理到另一个容器等等来实现这一点,这是有道理的,我感到惭愧。感谢您的解释和这张艺术序列图。如果我是对的,这就是代理过滤器的用途。代理有很多不同的形式,最纯粹的形式,它只是一个中间人。正如你所发现的,你可能有很多理由想这么做。但它通常集中在访问受限的情况下,当然在你的情况下,它甚至不是设计的,只是因为网络不一样,你不想完全自然地开放一切。代理筛选器是一个中间人,用于应用筛选,或者出于安全原因,想要限制某些内容、阻止站点等。