docker-compose在容器之间发出请求

Elo*_*ati 3 docker docker-compose

我对docker-compose有点陌生,所以甚至不确定我在寻找什么。

我创建了两个映像,并使用docker-compose在本地环境中运行它们,这两个服务通过HTTP请求进行通信(两者都在localhost上运行,一个在端口3000上运行,一个在8000端口上运行)

当我将这两个服务移至docker(两个分离的容器和图像)时,我似乎无法使它们进行通信。

这是我的docker-compose文件:

version: '3'

services:
  service1:
    image: services/services1
    ports:
      - 3000:3000
    links:
      - "service2"
    depends_on:
      - service2

  service2:
    image: services/service2
    ports:
      - 8000:8000
Run Code Online (Sandbox Code Playgroud)

当我直接向每个服务发出http请求时,我会收到很好的响应,但是当我向service1发出请求时,而在services1中,我有另一个对服务2的请求,我根本无法得到响应

Error: connect ECONNREFUSED 127.0.0.1:8000
Run Code Online (Sandbox Code Playgroud)

两种服务都在0.0.0.0上运行

小智 7

docker-compose.yml 文件中声明的所有服务都在自己的容器中运行。他们有不同的ip。您可以使用将解析为服务 ip 的服务名称来寻址它们。在你的情况下:

docker-compose exec service1 ping service2
or
docker-compose exec service2 ping service1
Run Code Online (Sandbox Code Playgroud)


Fac*_*bos 7

您应该定义一个网络并使用服务名称而不是 localhost:

version: '3'

services:
  service1:
    image: services/services1
    ports:
      - 3000:3000
    links:
      - "service2"
    depends_on:
      - service2
    networks:
      - mynet

  service2:
    image: services/service2
    ports:
      - 8000:8000
    networks:
      - mynet

networks:
  mynet:
Run Code Online (Sandbox Code Playgroud)


Con*_*nst 5

所以我不确定我在找什么。

您很可能正在寻找docker文档的这一部分。它说明了docker compose如何处理网络。您特别感兴趣的部分是:

By default Compose sets up a single network for your app.
Each container for a service joins the default network and is both reachable
by other containers on that network, and discoverable by them 
at a hostname identical to the container name.
Run Code Online (Sandbox Code Playgroud)

这意味着您应该使用service1和service2而不是localhost来跨服务定位。

  • 所以只是为了确保我理解,因为我没有完全为我工作,例如,如果我使用 JS,我应该做这样的事情 `axios.get('http://service2/api/状态')` ? (2认同)
  • 或者用`service2:8000`替换`service2`,以防你使用指定端口,是的... (2认同)