首页 > 解决方案 > Docker compose 服务通信

问题描述

所以我有一个包含 3 个服务的 docker-compose 文件:后端、反应前端和 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"]

前端 Dockerfile:

FROM nginx:stable
WORKDIR /usr/share/nginx/html
COPY ./build .
COPY ./.env .env
EXPOSE 80
CMD  ["sh", "-c", "nginx -g \"daemon off;\""]

所以没什么不寻常的,我猜。

码头工人-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

这是有效的。我的问题是,通过添加ports: - 8080:8080到后端部分,该服务器对主机可用。从理论上讲,网络应该在没有这些行的情况下工作,正如我在 docker docs 和this question中阅读的那样,但是如果我删除它,API 调用就会停止工作(但是在前端服务下的 docker-compose 中编写的 curl 调用仍然可以工作)。

标签: dockerdocker-composenetwork-programmingportcontinuous-deployment

解决方案


您的反应前端正在从浏览器发出请求。因此端点,在这种情况下,您的 API 需要可供浏览器访问,而不是分发静态 js、css 和 html 文件的容器。

希望这张图有点意思。

在此处输入图像描述

PS 如果您想明确不公开 API,您可以让 Web 服务器将请求代理到 /api/ 到 API 容器,这将发生在网络级别,意味着您只需要公开一个服务器。

我通过从 Nginx 为我的 Angular 应用程序提供服务,然后将 /app1/api/* 的流量代理到一个容器,将 /app2/api/* 的流量代理到另一个容器等来做到这一点


推荐阅读