在docker_compose.yml中链接和depends_on之间的差异

时间:2016-03-06 20:24:13

标签: docker docker-compose dockerfile

根据Docker Compose的compose-file documentation

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

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

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

我注意到,当我将容器B与容器A链接时,容器B将是" pingable"在容器A的外壳内。

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

enter image description here

3 个答案:

答案 0 :(得分:165)

这个答案适用于docker-compose 版本2 ,它也适用于版本3

使用depends_on时仍可以访问数据。

如果查看docker docs Docker Compose and 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"

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

web:
  links:
   - db

<强> depends_on:

我在Giorgio Ferraris发现了一个不错的博客Docker-compose.yml: from V1 to V2

  

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

  

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

更新

depends_on

服务之间的快速依赖关系,它有两个影响:

  • docker-compose up将按依赖顺序启动服务。在以下示例中,将在web之前启动db和redis。
  • 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之前“准备好” - 只有在它们启动之前。如果您需要等待服务准备就绪,请参阅控制启动顺序以了解有关此问题的更多信息以及解决此问题的策略。

答案 1 :(得分:44)

[2016年9月更新]:此答案适用于docker撰写文件v1(如下面的示例撰写文件所示)。对于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

使用linksweb内的代码将能够使用db:5432访问数据库,假设端口5432在db图像中公开。如果使用了depends_on,这是不可能的,但容器的启动顺序是正确的。

答案 2 :(得分:39)

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