如何让 docker 个来自不同项目的容器相互通信

How to get docker containers from different projects speaking to each other

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

有人可以帮助解释一下如何让我的 Web 应用程序在使用 docker 的同时与我的 api 通信

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

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

主要优势:

  • 在 YAML 中配置应用的服务。
  • 单个命令 create/start 在此配置上定义的服务。
  • 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 文件中定义的服务名称。

比如后端容器访问mysql服务器,名称为mysql。你可以 在服务定义本身上看到这个:

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

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

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

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

例如 /etc/hosts 在 ubuntu

127.0.1.1       backend