首页 > 解决方案 > 如何让来自不同项目的 docker 容器相互通信

问题描述

我已经开发和对接了两个应用程序 web (react) 和 api (laravel, mysql),它们有单独的代码库和单独的目录。

有人可以帮忙解释一下如何让我的 web 应用程序在使用 docker 的同时与我的 api 对话

更新:最终我想要实现的是让我的前端和后端都在端口 80 上运行,而不必让两个 Web 服务器作为容器运行,这样我的 docker 开发环境就可以像使用 valet 或 mamp 等一样工作。

标签: laraveldockercontainersdevelopment-environment

解决方案


对于开发,您可以使用docker-compose

主要优势:

  • 在 YAML 中配置应用的服务。
  • 创建/启动此配置上定义的服务的单个命令。
  • Compose 会为您的应用程序创建一个默认网络。每个容器都加入这个默认网络,它们可以互相看到。

我对项目使用以下结构。

projectFolder
  |_backend (laravel app)
  |_frontend (react app)
  |_docker-compose.yml
  |_backend.dockerfile
  |_frontend.dockerfile

我的 docker-compose.yml

version: "3.3"
  services:
    frontend:
      build:
        context: ./
        dockerfile: frontend.dockerfile
        args:
          - NODE_ENV=development
      ports:
        - "3000:3000"
      volumes:
        - ./frontend:/opt/app
        - ./frontend/package.json:/opt/package.json
      environment:
        - NODE_ENV=development
    backend:
      build:
        context: ./
        dockerfile: backend.dockerfile
      working_dir: /var/www/html/actas
      volumes:
        - ./backend:/var/www/html/actas
      environment:
        - "DB_PORT=3306"
        - "DB_HOST=mysql"
      ports:
        - "8000:8000"
    mysql:
      image: mysql:5.6
      ports:
        - "3306:3306"
      volumes:
        - dbdata:/var/lib/mysql
      environment:
        - "MYSQL_DATABASE=homestead"
        - "MYSQL_USER=homestead"
        - "MYSQL_PASSWORD=secret"
        - "MYSQL_ROOT_PASSWORD=secret"

  volumes:
    dbdata:

应用程序的每个部分都由 docker-compose 文件中的服务定义。例如

  • 前端
  • 后端
  • mysql

Docker-compose 将创建一个默认网络并将每个容器添加到其中。每个容器的主机名将是 yml 文件中定义的服务名称。

例如,后端容器访问名为 m​​ysql 的 mysql服务器。您可以在服务定义本身上看到这一点:

backend:
...
  environment:
  - "DB_PORT=3306"
  - "DB_HOST=mysql" <-- The hostname for the mysql container is the name of the service

有了这个,在反应应用程序中,我可以在 package.json 中设置代理配置,如下所示

"proxy": "http://backend:8000",

最后一件事,正如 David Maze 在评论中提到的那样。将后端添加到您的主机文件中,以便浏览器可以解析该名称。

例如 ubuntu 上的 /etc/hosts

127.0.1.1       backend

推荐阅读