概述
Docker容器在我们的系统中以独立进程运行。然而,我们通常希望它们能够相互通信并从一个传递信息到另一个。
在这个教程中,我们将看到 Docker 中的 links 和 depends_on 之间的区别,并使用 Docker Compose 提供一些实用的例子。
Docker Compose depends_on
depends_on 是 Docker Compose 的关键字之一,用于设置服务必须按照特定顺序启动和停止的规则。例如,假设我们想要构建名为 web-app 的图像作为 Web 应用程序,并且希望它在我们的Postgres容器之后启动。让我们看看 docker-compose.yml 文件:
services:
db:
image: postgres:latest
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- 5432:5432
web-app:
image: web-app:latest
ports:
- 8080:8080
depends_on:
- db
Docker 将根据给定的依赖关系拉取镜像并运行容器。因此,在这种情况下,Postgres 容器是第一个启动的队列。
然而,存在限制,因为 depends_on 并不明确等待依赖项就绪。想象一下,我们的 Web 应用程序在启动时需要执行一些迁移脚本。如果数据库尚未接受连接,尽管 Postgres 服务已正确启动,但我们无法执行任何脚本。
但是,如果我们可以使用特定工具或自定义脚本来控制启动或关闭顺序,就可以避免这种情况。例如,可以使用 控制启动或关闭顺序 的工具。
Docker Compose links
links 关键字指示 Docker 如何通过网络链接容器。当我们链接容器时,Docker 创建环境变量并将容器添加到已知主机列表中,以便它们可以互相发现。
我们将检查一个简单的 Docker 示例,其中运行了一个 Postgres 容器并将其与我们的 Web 应用程序链接起来。
首先,让我们运行 Postgres 容器:
docker run -d --name db -p 5342:5342 postgres:latest
然后,我们将它链接到我们的 Web 应用程序:
docker run -d -p 8080:8080 --name web-app --link db
让我们将示例转换为 Docker Compose:
services:
db:
image: postgres:latest
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- 5432:5432
web-app:
images: web-app:latest
ports:
- 8080:8080
links:
- db
Docker Compose network
links 在 Docker 中仍然被使用,但自 Docker Compose 版本 2 引入了 network 后,它已被弃用。通过这种方式,我们可以为具有复杂网络的应用程序链接应用程序,例如使用 overlay 网络。
然而,在单个应用中,我们通常可以使用 bridge 作为默认网络选项,当未指定网络时。
让我们移除 links 并替换为 network,同时添加数据库的卷和环境变量:
services:
db:
image: postgres:latest
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- 5432:5432
volumes:
- db:/var/lib/postgresql/data
networks:
- mynet
web-app:
image:web-app:latest
depends_on:
- db
networks:
- mynet
ports:
- 8080:8080
environment:
DB_HOST: db
DB_PORT: 5432
DB_USER: postgres
DB_PASSWORD: postgres
DB_NAME: postgres
networks:
mynet:
driver: bridge
volumes:
db:
driver: local
links 和 depends_on 之间的差异
尽管它们都涉及表达依赖性,但 Docker 中的 links 和 depends_on 有不同的含义。
depends_on 表示服务必须按照特定顺序启动和停止,而 links 或是 Docker Compose 新版本中的 network 处理容器之间的网络通信。
此外,depends_on 是 Docker Compose 的关键字,而我们可以类似地使用 links 作为 Docker 的遗留功能。
结论
在这篇文章中,我们看到了 Docker 中的 links 和 depends_on 之间的区别,并使用了 Docker Compose 的示例。
depends_on 告诉 Docker 容器的运行顺序,而 links(或 Docker Compose 更新版本中的 network)则在容器之间建立网络连接。
如往常一样,您可以在此处找到示例的 docker-compose.yml 文件 GitHub。