docker-compose:网络和链接之间的差异

Trầ*_* Dự 32 docker docker-compose docker-networking

我正在学习码头工人.我看到这两个词让我感到困惑.例如,这里是一个定义了两个服务redis和的docker-compose web-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
Run Code Online (Sandbox Code Playgroud)

docker-compose文件定义名为lognet的网桥,所有服务都将连接到此网络.据我了解,此操作使这些服务可以看到其他人.那么为什么app服务仍然需要在上面的情况下链接到redis服务.

谢谢

BMi*_*tch 47

链接已被网络取代.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
Run Code Online (Sandbox Code Playgroud)

  • 他们已被弃用,我之前已直接从docker compose开发人员验证过。文档显示,群集模式根本不支持它们,要使其与docker compose一起使用,您需要一个可以提供DNS支持的通用网络。https://docs.docker.com/compose/compose-file/#links (3认同)