首页 文章

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

提问于
浏览
169

根据Docker Compose的compose-file documentation

  • depends_on - 服务之间的快速依赖关系 .

  • links - 链接到另一个服务中的容器,并且 express dependency between servicesdepends_on相同 .

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

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

我注意到,当我将容器B与容器A链接时,容器B将在容器A的shell内“ping” .

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

enter image description here

2 回答

  • 142

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

    You can still access the data when you use 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有什么区别?

    links:

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

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

  • 43

    [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 ,则无法实现,但容器的启动顺序是正确的 .

相关问题