docker_compose.yml 中的 links 和 depends_on 的区别

新手上路,请多包涵

根据 Docker Compose 的 compose-file 文档

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

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

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

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

我在容器 A 的 bash 中运行了 ping B 并得到了这样的结果(仅供参考,图片来自互联网)

在此处输入图像描述

原文由 itsjef 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3k
2 个回答

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 的一个很好的副作用。

原文由 Siyu 发布,翻译遵循 CC BY-SA 4.0 许可协议

此答案适用于 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"

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

 web:
  links:
   - db

取决于:

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

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

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

更新

取决于

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

  • docker-compose up 将按依赖顺序启动服务。在以下示例中,db 和 redis 将在 web 之前启动。
  • docker-compose up SERVICE 会自动包含SERVICE的依赖。在下面的例子中,docker-compose up web 也会创建并启动 db 和 redis。

简单的例子:

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

注意:depends_on 不会等待 db 和 redis 在启动 web 之前“准备好”——只有在它们启动之前。如果您需要等待服务准备好,请参阅控制启动顺序以获取有关此问题的更多信息以及解决该问题的策略。

原文由 Windsooon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进