链接和docker_compose.yml中的depends_on之间的区别
根据Docker Compose的撰写文档文档 :
-
depends_on
– 服务之间的快速依赖关系。 -
links
– 链接到另一个服务中的容器,也以与depends_on相同的方式表示服务之间的依赖关系 。
我不明白链接到其他容器的目的,所以两个选项之间的差异对我来说似乎还相当困难。
有一个例子会容易得多,但是我找不到。 请帮我理解这两个。
先谢谢你!
编辑:所以我注意到,当我连接容器B与容器A然后容器B将(是什么字?)在容器A的壳内pingable 。
我在容器A的bash
内部运行了ping B
,得到了这样的结果(仅供参考,来自Internet的图像)
对不起,我的英文破碎:(
这个答案适用于docker-compose 版本2 ,它也适用于版本3
当您使用depends_on时,仍然可以访问数据。
如果你看Docker文档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有什么区别?
链接:
为数据库创build容器时,例如:
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.ymlfind了一个不错的博客:从V1到V2
当docker-compose执行V2文件时,它会自动在文件中定义的所有容器之间build立一个networking,每个容器将立即使用docker-compose.yml文件中定义的名称来引用其他容器。
和
所以我们不再需要链接 链接被用来启动我们的数据库容器和我们的networking服务器容器之间的networking通信,但是这已经由docker-compose
更新
依赖于取决于
表示服务之间的依赖关系,这有两个作用:
- docker-compose up将以依赖性顺序启动服务。 在下面的例子中,db和redis将在web之前启动。
- docker-up up SERVICE将自动包含SERVICE的依赖关系。 在下面的例子中,docker-up up web也会创build并启动db和redis。
简单的例子:
version: '2' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
注意:在启动web之前,depends_on不会等待db和redis“准备就绪” – 直到它们启动。 如果您需要等待服务准备就绪,请参阅控制启动顺序以获取有关此问题的更多信息以及解决此问题的策略。
[2016年9月更新]:这个答案是为Docker撰写文件v1(如下面的示例撰写文件所示)。 对于v2,请参阅@Windsooon的其他答案。
[原文的解答]:
在文档中很清楚。 depends_on
决定容器创build和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
访问数据库,假设在db
映像中公开端口5432。 如果使用了depends_on
,这是不可能的,但是容器的启动顺序是正确的。