根据Docker Compose的compose-file文档:



depends_on-服务之间的快速依赖关系。还以与depends_on相同的方式表示服务之间的依赖关系。 br />如果有一个示例,它会容易得多,但我找不到任何示例。

我注意到,当我将容器B与容器A链接在一起时,容器B将在内部“可ping通”容器A的外壳。

我在容器A的links中运行了ping B并得到了这样的结果(仅供参考,来自Internet的图像) >

评论

--link标志现在是Docker不推荐使用的旧功能,文档显示“可能最终被删除” Docker:旧式容器链接。建议不要使用Docker网络功能或docker compose方法。我认为这对这里了解此功能的任何人都是有帮助的。

#1 楼

弃用了links选项后,该帖子需要更新。将容器放置在同一网络中时,可以使用其容器名称和其他别名作为主机来相互访问它们。

docker network create mynet
docker run -d --net mynet --name container1 my_image
docker run -it --net mynet --name container1 another_image


links表示开始顺序(并隐含图像拉出顺序),这是network的良好副作用。

评论


常见的StackOverflow,为什么我必须向下滚动到147和43点以下才能找到实际上最好的1点答案。

–u8it
19年2月1日在2:21

@ u8it这是时间和互联网的本质。

–迈克尔·科尔
19年2月28日在18:53

如何在docker-compose中做同样的事情?我认为使用docker compose,所有服务已经在同一个网络中,因此无需添加任何内容。如果其中一个容器试图连接到未处于“就绪”状态的容器,则仍然无法在容器之间进行链接。

– makkasi
19 Mar 27 '19 8:44



我在docker-compose版本3 docs中看不到有关弃用链接的信息:docs.docker.com/compose/compose-file/#links。我认为该选项不太有用,因为我们拥有共享的网络和depends_on,但是如果我正确地阅读了文档,则不会弃用该选项(它们只在docker容器上提到--link标志)。

–乘风破浪
19年7月2日在10:29

注意:可以通过服务名称(而不是容器名称)访问同一网络中的容器(实际上是服务)。官方文档:docs.docker.com/compose/networking/#links

–GarryOne
19/12/23在13:47

#2 楼

这个答案适用于docker-compose版本2,并且也适用于版本3
。当您使用depends_on时,您仍然可以访问数据。像这样的数据库:
version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

链接和Depends_on有什么区别?
为数据库创建容器时,例如:
docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

您可能会找到
"HostPort": "32777"

这意味着您可以从本地主机端口32777(容器中的3306)连接数据库,但是此端口在每次重新启动或删除容器时都会更改。因此,您可以使用链接来确保始终连接到数据库,而不必知道它是哪个端口。
web:
  links:
   - db

depends_on:
我从Giorgio Ferraris找到了一个不错的博客Docker-compose.yml:从V1到V2

当docker-compose执行V2文件时,它将自动在文件中定义的所有容器之间建立网络,并且每个容器都将立即能够仅使用docker-compose.yml文件中定义的名称来引用其他文件。



所以我们不再需要链接;链接用于启动数据库容器和Web服务器容器之间的网络通信,但这已经由docker-compose

Update
depends_on
服务之间的快速依赖关系完成,它有两个作用:


docker-compose up将以依赖关系顺序启动服务。在下面的示例中,db和redis将在web之前启动。

docker-compose up SERVICE将自动包含SERVICE的依赖项。在以下示例中,docker-compose up网站还将创建并启动db和redis。

简单示例:
version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres


注意:depends_on在启动Web之前不会等待db和redis处于“就绪”状态-仅在启动之前。如果需要等待服务准备就绪,请参阅控制启动顺序以获取有关此问题的更多信息以及解决方法。


评论


我已经更新了答案,以澄清该答案是针对撰写文件v1的。

–金雄兵
16-09-23在13:36

这对版本3仍然有效吗?

–fabiomaia
17 Mar 20 '17 at 0:03

是的,您可以看看https://docs.docker.com/compose/compose-file/compose-versioning/

–Windsooon
17 Mar 20 '17在2:36

“这意味着您可以从本地主机端口32777(容器中的3306)连接数据库,但是此端口将在每次重新启动或删除容器时更改”,如果您在docker-compose-file中指定端口绑定,则不会。而且由于这个问题是专门关于docker-compose的,所以我觉得在这里运行docker的示例是完全不相关的,无论如何这都不是容器的运行方式。我想念什么?

–安德鲁(Andrew Savinykh)
17年5月10日在5:34



是的,如果您指定端口,那是对的。我的docker run示例想指出为什么我们需要使用depends_on或链接而不是对端口号进行硬编码。只是因为如果不指定它,它每次都会更改。我认为这会让人们更多地了解depends_on或链接。

–Windsooon
17年5月10日在8:01

#3 楼

[2016年9月更新]:此答案适用于docker compose文件v1(如下面的示例compose文件所示)。对于v2,请参见@Windsooon的其他答案。

[原始答案]:

在文档中非常清楚。 depends_on决定了容器创建的依存关系和顺序,而links不仅确定了依存关系和顺序,而且链接服务的容器也可以通过与别名或服务相同的主机名访问如果未指定别名,则为名称。


例如,假定以下docker-compose.yml文件:假设端口4332在links映像中暴露,则web将能够使用db:5432访问数据库。如果使用db,则不可能,但是容器的启动顺序将是正确的。

评论


你可以给我一个例子吗?因为那部分我还不清楚。也许还有其他compose-file选项可能会使它更具体。请给予更详细资讯。谢谢!

–itsjef
16-3-6在21:13



非常感谢你!我知道了。请问最后一个问题。因此,在我的特定情况下,我正在部署我的Rails应用程序,我应该使用链接还是Depends_on,或者它们都可以吗?我当前的docker-compose.yml使用Depends_on,一切似乎正常。 :)

–itsjef
16 Mar 7 '16 at 8:36



如果您不需要通过name:port直接访问另一个容器,那么depends_on就可以了。

–金雄兵
16 Mar 7 '16 at 15:09

名称:端口即使使用暴露时也无需链接即可工作:

–阿米·戈德斯坦
16年8月21日在13:32

“如果使用depends_on,将不可能,但是容器的启动顺序将是正确的。”这是不正确的。如果您只使用depends_on,它将起作用。您仍然可以使用数据库主机名在Web上访问数据库。

–杜尚(prosan.Dusan)
16-09-22在4:08