如何使一个Docker容器调用另一个Docker容器

27

我有两个 Docker 容器

  1. 一个 Web API
  2. 一个调用 Web API 的控制台应用程序

现在,在我的本地 Web API 上是本地主机,控制台应用程序没有问题调用该 API。然而,当这两件事被 Docker 化时,我不知道如何让 Docker 化的控制台应用程序使用 Docker 化的 API 的 URL。

我认为我不需要 Docker Compose,因为我将 API 的 URL 作为参数传递给 API,所以只需要确保 Docker 化的 API 的 URL 可以被 Docker 化的控制台访问即可。

有什么想法吗?


2
你是否解决了这个问题?似乎在容器A上运行的服务可以对容器B进行网络调用。我不知道为什么下面的docker-compose.yml答案被接受为解决方案,但它不应该是。 - user3335999
4个回答

18

这种方法不是传递URL,而是传递你想要调用的其他容器的主机名。

参见Compose中的网络

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

这取代了已过时的--link选项

如果您的容器没有运行在一个Docker服务器节点上,Docker Swarm模式可以实现跨多个节点的发现性。


11
这是我发现的在本地机器/单个集群中连接多个容器的最佳方法。
给定数据提供者服务和数据消费者服务。
选项1:使用网络。
docker network create data-network
docker run --name=data-provider-service --net=data-network -p 8081:8081 data-provider-image
docker run --name=data-consumer-service --net=data-network -p 8080:8080 data-consumer-image

请确保在你的data-consumer-service中使用像这样的URI:http://data-provider-service:8081/

  • 选项2:使用Docker Compose

你可以在docker-compose.yml文件中定义两个服务,并在data-provider-service中使用depends_on属性。 例如:

data-consumer-service:
  depends_on:
    - data-provider-service
     

你可以在我的Medium文章中看到更多细节:https://saggu.medium.com/how-to-connect-nultiple-docker-conatiners-17f7ca72e67f

8
您可以使用docker run命令的link选项:
运行API:
docker run -d --name api api_image

运行客户端:

docker run --link api busybox ping api

您应该看到api可以通过docker解决。

话虽如此,使用docker-compose仍然是更好的选择。


1
提醒一下:容器链接现已被弃用,建议使用用户定义网络,请参考:https://docs.docker.com/network/links/ - jerney
1
这个没有解释清楚。我想从一个服务中调用另一个服务,类似于"http://some_network/some_method",这怎么成为一个解决方案了呢? - user3335999

6

如果使用compose功能,问题可以轻松解决。使用compose,您只需创建一个配置文件(docker-compose.yml),如下所示:

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

要让它运行,只需像这样调用up
docker-compose up 

这是运行整个堆栈的最佳方式,因此,请查看此参考链接: https://docs.docker.com/compose/ 成功!

16
所以理解来说,我们想要从一个 Docker 容器向另一个 Docker 容器中的服务进行网络调用,上述提供的是一个解决方案?这完全没有意义。需要进一步解释。 - user3335999
1
需要更多解释它的工作原理才能成为正确的答案。 - JoDev
对我没用。没有什么可以说明这是正确答案的。 - Tommy Hoang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接