docker-compose:networking和链接的区别

我在学Docker。 我看到这两个术语让我感到困惑。 例如,这里是一个docker-compose,它定义了两个服务redisweb-app

 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 docker-compose文件定义了一个名为lognet的桥接networking,所有的服务都将连接到这个networking。 据我所知,这个行动使得这些服务可以看到别人。 那么为什么在上面的情况下应用服务仍然需要链接到redis服务。

谢谢

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

通过撰写,链接确实会产生隐含依赖的副作用。 你应该用一个更明确的depends_on部分replace这个,这样应用程序不会在没有启动或者没有启动之前尝试运行。

顺便说一句,我不喜欢硬编码的container_name,除非你确定这是唯一的容器,将在主机上存在这个名字,你需要从docker cli中通过名字引用它。 如果没有容器名称,docker-compose会给它一个不那么直观的名字,但是它也会给它一个redis的别名,这正是你容器到容器networking所需要的。 所以这些build议的最终结果是:

 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