我正在学习码头工人。我看到这两个词让我感到困惑。例如,这里有一个docker-compose,它定义了两个服务redis
和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
此docker-compose
文件定义了名为lognet的网桥,所有服务都将连接到此网络。据我了解,此操作使这些服务可以看到其他人。那么为什么app服务仍然需要在上面的情况下链接到redis服务。
由于
答案 0 :(得分:38)
链接已被网络取代。 Docker将它们描述为legacy feature that you should avoid using.您可以安全地删除链接,并且两个容器将能够通过其服务名称(或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