概述

Docker容器在我们的系统中以独立进程运行。然而,我们通常希望它们能够相互通信并从一个传递信息到另一个。

在这个教程中,我们将看到 Docker 中的 linksdepends_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 服务已正确启动,但我们无法执行任何脚本。

但是,如果我们可以使用特定工具或自定义脚本来控制启动或关闭顺序,就可以避免这种情况。例如,可以使用 控制启动或关闭顺序 的工具。

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

尽管它们都涉及表达依赖性,但 Docker 中的 linksdepends_on 有不同的含义。

depends_on 表示服务必须按照特定顺序启动和停止,而 links 或是 Docker Compose 新版本中的 network 处理容器之间的网络通信。

此外,depends_on 是 Docker Compose 的关键字,而我们可以类似地使用 links 作为 Docker 的遗留功能。

结论

在这篇文章中,我们看到了 Docker 中的 linksdepends_on 之间的区别,并使用了 Docker Compose 的示例。

depends_on 告诉 Docker 容器的运行顺序,而 links(或 Docker Compose 更新版本中的 network)则在容器之间建立网络连接。

如往常一样,您可以在此处找到示例的 docker-compose.yml 文件 GitHub