如何让 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
我已经开发并 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