我在不同的docker容器上运行了两个不同的项目。在两个YML文件下面:
文件 webserver-api / docker-compose.yml
version: "3.1"
services:
webserver:
image: nginx:alpine
container_name: webserver-api
working_dir: /application
volumes:
- .:/application
- ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "8005:80"
FILE client-app / docker-compose.yml
version: '3'
services:
web:
container_name: client-app
build:
context: ./
dockerfile: deploy/web.docker
volumes:
- ./:/var/www
ports:
- "8010:80"
links:
- app
app: [...]
database: [...]
在 client-app 中,我想调用 webserver-api 。 当我尝试使用 webserver-api 中的API时,收到消息“ cURL错误连接被拒绝”或超时错误。
例如
$response = file_get_contents('http:/localhost:8005/api/test');
我也尝试用 webserver-api 容器的IP替换localhost:
$response = file_get_contents('http://172.25.0.2:8005/api/test');
但是仍然出现超时连接错误。
要从客户端容器调用的服务器容器的正确URL是哪个?或如何设置主机网址?
非常感谢您的帮助和时间。
答案 0 :(得分:1)
您需要先创建一个网络。然后将此网络用于您的客户端和服务器Docker组成。否则,网络将被隔离。
另一种方法是将服务器的端口公开给localhost,然后从客户端连接到localhost。
答案 1 :(得分:1)
按照docker-compose documentation
默认情况下,Compose为您的应用设置单个网络。服务的每个容器都加入默认网络,并且都可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名下被发现。
因此,理想情况下,如果您的服务是相互依赖的,则应将它们放在单个撰写文件中。在这种情况下,您可以直接通过名称和容器端口访问服务
但是由于它们在单独的撰写文件中,因此您可以通过主机映射端口访问服务
$ response = file_get_contents('http://localhost:8005/api/test');
它也应该起作用。
要调试,您可以检查
答案 2 :(得分:0)
最后我想通了。
默认情况下,docker创建一个名为(以我为例) webserver-api_default 的网络,其中 webserver-api 是包含YML文件{{1 }}。
在客户端的 client-app / docker-compose.yml 上,我必须指定要加入的网络:
[projectname]_default
从客户端容器中,我必须调用URL:
version: '3'
networks:
default:
external:
name: webserver-api_default
web:
container_name: client-app
build:
context: ./
dockerfile: deploy/web.docker
volumes:
- ./:/var/www
ports:
- "8010:80"
links:
- app
app: [...]
database: [...]
webserver-api 是服务器容器的名称,而不是网络的名称。