社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

从客户端docker容器到服务器容器的conusume api

Dan • 6 年前 • 1809 次点击  

我有两个不同的项目运行在不同的码头集装箱。下面是两个yml文件:

文件 Web服务器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"

文件 客户端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: [...]

客户端应用程序 我想打电话给 Web服务器API . 当我试图从 Web服务器API 我收到消息“curl错误连接被拒绝”或超时错误。

例如

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

我还尝试用 Web服务器API 这样的容器:

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

但是我还是得到了一个超时连接错误。

从客户端容器调用服务器容器的正确url是哪个?或者如何设置主机url?

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/45964
文章 [ 3 ]  |  最新文章 6 年前
Dan
Reply   •   1 楼
Dan    6 年前

我终于明白了。

默认情况下,Docker创建一个名为的网络(在我的例子中) WebServer-API默认值 在哪里? Web服务器API 是包含YML文件的文件夹的名称 [projectname]_default .

客户端app/docker-compose.yml 我必须指定要加入的网络:

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: [...]

从客户端容器中,我必须调用url:

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

在哪里? Web服务器API 是服务器容器的名称,而不是网络的名称 .

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

asolanki
Reply   •   2 楼
asolanki    6 年前

按照 docker-compose documentation

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

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

http://webserver/api/test

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

$response=文件获取内容(' http://localhost:8005/api/test “”;

它也应该起作用。

要调试,可以检查

  1. 如果端口绑定到8005发生在主机上。
  2. 指定的终结点是正确的,可以从主机访问。
todaynowork
Reply   •   3 楼
todaynowork    6 年前

你需要先建立一个网络。然后将此网络用于客户端和服务器docker compose。否则网络将被隔离。

另一种方法是将服务器端口公开给本地主机,并从客户端连接到本地主机。