当前位置: 首页 > 知识库问答 >
问题:

docker_compose.yml中links和depends_on之间的区别

宗冠宇
2023-03-14

根据Docker Compose的compose-file文档:

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

我不明白链接到其他容器的目的,所以两个选项之间的区别对我来说仍然是相当困难的。

如果有一个例子就容易多了,但我找不到。

我注意到,当我链接容器B和容器A时,容器B将在容器A的外壳内“ping”。

我在容器A的bash中运行ping B并得到如下结果(仅供参考,图片来自网络)

共有2个答案

姬奇思
2023-03-14

这个答案适用于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

links和depends_on之间有什么区别?

链接:

为数据库创建容器时,例如:

docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

你可能会发现

"HostPort": "32777"

这意味着可以从localhost端口32777(容器中的3306)连接数据库,但每次重新启动或删除容器时,该端口都会更改。所以您可以使用链接来确保您将始终连接到数据库,而不必知道它是哪个端口。

web:
  links:
   - db

依赖于:

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

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

而且

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

表示服务之间的依赖关系,这有两个效果:

  • docker-compose up将按依赖关系顺序启动服务。在下面的示例中,db和redis将在Web之前启动。
  • docker-compose up service将自动包含服务的依赖项。在下面的示例中,docker-compose up web还将创建和启动db和Redis。

简单示例:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意:depends_on在启动web之前不会等待db和redis“就绪”--仅在它们已经启动之前。如果需要等待服务就绪,请参阅控制启动顺序以获得有关此问题的更多信息以及解决此问题的策略。

冯敏达
2023-03-14

不推荐使用链接选项后,该帖子需要更新。

基本上,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表示启动顺序(以及隐式的图像拉取顺序),这是链接的一个很好的副作用。

 类似资料:
  • 问题内容: 我有两个问题,可能需要一些帮助来理解它们。 和之间有什么区别?我知道这 意味着在单独的外壳中运行命令,然后将其传递给变量。有人可以帮助我理解这一点吗?如果我错了,请纠正我。 如果我们可以使用并且效果很好,那我为什么不能使用它呢?两者的执行周期有何不同? 问题答案: 语法是令牌级别的,因此美元符号的含义取决于其所在的令牌。表达式是现代代名词,代表命令替换;这意味着运行并将其输出放在此处。

  • 问题内容: 我对和感到困惑。我有两本PHP书。一个说它们是相同的,但是另一个说它们是不同的。我以为他们也一样。 他们不一样吗? 问题答案: 是按位与。请参见按位运算符。假设您这样做: 是逻辑AND。请参阅逻辑运算符。考虑一下这个真值表:

  • 问题内容: 这个问题已经在这里有了答案 : JavaScript比较中应使用哪个等于运算符(== vs ===)? (49个答案) 5个月前关闭。 和之间的区别是什么?我也看过和运算符。还有更多这样的运营商吗? 问题答案: 并且是严格的比较运算符: JavaScript具有严格和类型转换相等性比较。为了相等,要比较的对象必须具有相同的类型,并且: 当两个字符串在相同位置具有相同的字符序列,相同的长

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。