在同一网络中从一个容器到另一个容器的 docker-compose api 调用

时间:2021-02-27 23:29:23

标签: docker rest docker-compose

我有 2 个不同的组件/图像和以下 docker-compose 文件。

version: '3'
services:
    my_service:
        image: my_service:latest
        restart: always
        environment:
            - DUMMY=dummy
        ports:
            - "8071:8071"
        command: ""
        healthcheck:
            test: ["CMD-SHELL", "[ -f /usr/local/bin ]"]
            interval: 30s
            timeout: 30s
            retries: 3
        container_name: my-service-container
        networks:
            - my_net

    my_ui:
        image: my_ui:latest
        depends_on:
            - my_service
        restart: always
        ports:
            - "8080:8080"
        command: ""
        networks:
            - my_net
networks:
    my_net:
        driver: bridge

“my_ui”组件是一个 ui(角度代码),它从“my_service”组件调用服务。 当我使用“真实”主机名(所有部署都在那里的服务器)调用时,它可以工作,即

例如

主机名(Linux):real.host.name

Docker 安装并运行在上面的主机上。我在上面的主机上运行了 docker-compose up,这样我的 dontainer 就可以启动并运行了。

在另一台机器或主机上,我通过邮递员调用以下代码,它可以工作。

(POST 请求,根据需要具有原始正文等)。

http://real.host.name:8071/api/auth/login 

上述调用有效。但是,我想对此类调用使用 docker 服务名称,以便顺利部署到多个主机/环境。

当我尝试以下操作时,它不起作用:

http://my_service:8071/api/auth/login

失败

Failed to load resource: net::ERR_NAME_NOT_RESOLVED

当我去“my_ui”时

docker exec -it rm <container name of my_ui> /bin/bash

$ ping my_service

以上工作正常,即 ping 很好。但是,当我发出 http 请求时,它无法识别“my_service”主机。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:-1)

我认为在使用桥接模式时,服务名称解析纯粹是内部的,这就是为什么您可以使用其名称从容器中 ping 服务,但在从主机 ping 时无法获得 ICMP 回复。

因此 my_ui 容器能够从 Docker 桥接网络向 my_service 容器发出请求,但不能从主机发出请求(至少不能通过服务名称解析)。

如果您担心无论是否来自不同的主机,您都希望能够使用相同的服务,我建议在此类用例中使用 Swarm 模式下的 Docker。这样,您就可以基于端口而不是服务名称来使用相同的服务。

我去年写了一篇关于 Docker Swarm 的分步指南,如果你感兴趣的话 :) https://pat-laboratory.com/2020/11/03/docker-swarm-introduction-workshop/

让我知道这是否有帮助,或者我是否完全没有理解你的问题!

相关问题