docker_compose.yml中链接和Depends_on之间的区别


291

根据Docker Compose的compose-file文档

  • depends_on -表达服务之间的依赖性。
  • links-链接到另一个服务中的容器,并以与depends_on相同的方式表示服务之间的依赖关系

我不明白链接到其他容器的目的,所以两个选项之间的差异对我来说似乎仍然很困难。

如果有一个例子,会容易得多,但是我找不到任何例子。

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

我跑进了ping BA容器bash,得到了这样的结果(仅供参考,来自Internet的图像)

在此处输入图片说明


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

Answers:


121

links弃用该选项后,该帖子需要更新。

基本上links不再需要它了,因为它的主要目的是通过添加环境变量使另一个容器可访问,它隐含在network。将容器放置在同一网络中时,可以使用容器名称和其他别名作为主机来相互访问它们。

对于docker run--link也已弃用,应使用自定义网络替换。

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

depends_on表示开始顺序(并隐式地表示图像拉动顺序),这是的良好副作用links


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

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

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

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

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

194

此答案适用于docker-compose 版本2,也适用于版本3

当您使用depends_on时,您仍然可以访问数据。

如果您查看docker docs Docker Compose和Django,您仍然可以像这样访问数据库:

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

取决于:

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

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

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

更新资料

取决于

表达服务之间的依赖关系,这有两个作用:

  • 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的。
Xiongbing Jin

1
这对版本3仍然有效吗?
fabiomaia

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

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

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

50

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

[原始回答]:

在文档中很清楚。depends_on决定容器的依赖关系和创建顺序,links不仅要决定这些因素,而且还要

链接服务的容器可以使用与别名相同的主机名访问,如果未指定别名,则可以使用服务名。

例如,假设以下docker-compose.yml文件:

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

links,码内web将能够使用来访问数据库db:5432,假设端口5432中被暴露db的图像。如果depends_on使用了,则不可能,但是容器的启动顺序将是正确的。


能给我举个例子?因为那是我还不清楚的部分。也许还有其他撰写文件选项可能会使它更具体。请给予更详细资讯。谢谢!
itsjef

非常感谢你!我知道了。请问最后一个问题。所以,在我的具体情况,我部署我的Rails应用程序,我应该使用linksdepends_on或其中之一就可以了?我当前的docker-compose.yml用途depends_on和一切似乎正常。:)
itsjef

如果您不需要直接通过访问其他容器,name:portdepends_on可以。

9
name:port甚至在使用暴露时也无需链接即可工作:
Amit Goldstein

7
“如果使用depends_on,将不可能,但是容器的启动顺序将是正确的。” 这是不正确的。如果您只使用depends_on,它将起作用。您仍然可以dbweb使用数据库的主机名中访问您的主机。
prosan.Dusan '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.