从不同的Docker容器(同一主机,Apache)调用Docker容器中的API



情况:

我有两个docker容器运行两个Symfony 4应用程序。app和cte_ fe。cte_ app被暴露到主机上的端口8080并且cte_。

cte_app包含API方法,我需要使用cte_fe来使用这些方法。我可以在主机上从cte_app使用API,这很好(使用Postman),但不能通过使用cURL的PHP函数中的cte_fe使用,我得到一个连接拒绝错误(使用localhost:8080和container-name(这是依赖的))。当我使用Docker的网关地址时,我可以很好地使用cte_fe容器中的API。但我不能保证网关地址不会随着时间的推移而改变。

在同一主机上的两个容器之间调用API端点的首选方式是什么?文档中是否遗漏了将网关地址作为环境变量公开给容器的标志?

version: '3'
services:
cte_db:
image: mysql:5.7.24
restart: on-failure
container_name: cte_db
ports:
- "3306:3306"
volumes:
- /cte_data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somepassword
MYSQL_DATABASE: somedatabase
MYSQL_USER: someuser
MYSQL_PASSWORD: somepassword
cte_apache:
build: .docker/apache
container_name: cte_apache
ports:
- 8080:8080
- 80:80
volumes:
- .docker/config/vhosts:/etc/apache2/sites-enabled
- ./cte_app:/home/wwwroot/cte_app
- ./cte_fe:/home/wwwroot/cte_fe
depends_on:
- cte_fe
- cte_app
cte_app:
build: .docker/php
container_name: cte_app
volumes:
- ./cte_app:/home/wwwroot/cte_app
depends_on:
- cte_db
cte_fe:
build: .docker/php
container_name: cte_fe
volumes:
- ./cte_fe:/home/wwwroot/cte_fe
depends_on:
- cte_app
- cte_db

在这样的上下文中,一个容器要到达另一个容器,可以使用docker-compose.yml文件中的服务名称作为主机名,容器内进程正在侦听的TCP端口号作为端口号。端口不需要公开或发布,也不需要手动设置container_name:。Docker Compose将为您处理Docker级别的网络机制。

可以通过环境变量进行配置,这通常是有益的,环境变量还支持非Docker开发和服务发现系统,如Consul或Kubernetes Services。

如果"fe"代表"前端",并且连接实际上是通过浏览器应用程序进行的,则必须从浏览器的角度考虑这一点:这些Docker详细信息根本不存在,如果必须使用绝对URL,则需要使用主机的DNS名称或IP地址以及服务器的发布端口。考虑到您所展示的内容,这可能是Apache代理,并且您将使用类似http://my.host.dns.name:8080/app的URL。