从客户端Docker容器到服务器容器使用API

时间:2019-07-01 08:25:43

标签: docker docker-compose

我在不同的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是哪个?或如何设置主机网址?

非常感谢您的帮助和时间。

3 个答案:

答案 0 :(得分:1)

您需要先创建一个网络。然后将此网络用于您的客户端和服务器Docker组成。否则,网络将被隔离。

另一种方法是将服务器的端口公开给localhost,然后从客户端连接到localhost。

答案 1 :(得分:1)

按照docker-compose documentation

  

默认情况下,Compose为您的应用设置单个网络。服务的每个容器都加入默认网络,并且都可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名下被发现。

因此,理想情况下,如果您的服务是相互依赖的,则应将它们放在单个撰写文件中。在这种情况下,您可以直接通过名称和容器端口访问服务

http://webserver/api/test

但是由于它们在单独的撰写文件中,因此您可以通过主机映射端口访问服务

$ response = file_get_contents('http://localhost:8005/api/test');

它也应该起作用。

要调试,您可以检查

  1. 如果主机上正在发生与8005的端口绑定。
  2. 指定的端点是正确的,可以从主机访问。

答案 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 是服务器容器的名称,而不是网络的名称

https://docs.docker.com/compose/networking/