docker-compose:网络和链接之间的区别

59

我正在学习Docker。我看到了两个术语,让我感到困惑。例如,在这里定义了两个服务redisweb-app的docker-compose文件。

services:
  redis:
    container_name: redis
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      - lognet

  app:
    container_name: web-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - ".:/webapp"
    links:
      - redis
    networks:
      - lognet

networks:
  lognet:
    driver: bridge

这个 docker-compose 文件定义了一个名为lognet的桥接网络,所有的服务都将连接到这个网络。据我所知,这样做可以让这些服务看到其他服务。那么为什么在上述情况下应用程序服务仍然需要链接到redis服务呢?

谢谢

1个回答

90

链接已被网络取代。Docker将它们描述为一个遗留特性,应该避免使用。您可以安全地删除链接,两个容器将能够通过其服务名称(或container_name)相互引用。

在compose中,链接确实具有创建暗示依赖项的副作用。您应该使用更明确的depends_on部分来替换它,以便应用程序不会在redis启动之前或之后尝试运行。

顺便说一下,我不喜欢硬编码container_name,除非您确定这是主机上唯一存在的具有该名称的容器,并且您需要通过名称从docker cli引用它。如果没有容器名称,docker-compose将给它一个不太直观的名称,但它也将在网络上为它提供一个别名“redis”,这正是您需要进行容器到容器网络连接的方式。因此,按照这些建议最终结果如下:

version: '2'
# do not forget the version line, this file syntax is invalid without it

services:
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      - lognet

  app:
    container_name: web-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - ".:/webapp"
    depends_on:
      - redis
    networks:
      - lognet

networks:
  lognet:
    driver: bridge

1
我认为@Trân在问关于docker-compose中未被弃用的links。只有在docker run命令中才被弃用。https://forums.docker.com/t/are-links-deprecated-in-docker-compose/27348/2 - Ethan Davis
9
它们已经被弃用了,我之前直接向docker compose的开发人员验证过这一点。文档显示在swarm模式下它们根本不被支持,如果要让它们与docker compose一起使用,你需要一个公共网络,该网络将提供DNS支持。请参考https://docs.docker.com/compose/compose-file/#links - BMitch
那么,在这里,“depends_on”只是指先决条件吗? - chenghuayang
1
@chenghuayang 是的,我已经更新了文档链接。 - BMitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接