54

我正在学习码头工人。我看到这两个术语让我感到困惑。例如,这里是一个定义了两个服务的 docker-composeredisweb-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-compose文件定义了一个名为 lognet 的桥接网络,所有服务都将连接到该网络。据我了解,此操作使这些服务可以看到其他服务。那么为什么在上述情况下应用服务仍然需要链接到redis服务。

谢谢

4

1 回答 1

83

链接已被网络取代。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
于 2016-12-23T02:57:07.550 回答