Docker Compose中links和depends_on的区别

2023/05/23

1. 概述

Docker容器在我们的系统中作为独立进程运行。然而,我们通常希望它们能够相互交流和传递信息。

在本教程中,我们通过一些使用Docker Compose的实际示例了解Docker链接和depends_on之间的区别。

2. Docker Compose depends_on

depends_on是一个Docker Compose关键字,用于设置服务必须启动和停止的顺序

例如,假设我们希望我们的Web应用程序(我们构建为wep-app镜像)在我们的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服务已正确启动,但我们无法执行任何脚本。

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

3. Docker Compose链接

links指示Docker通过网络链接容器,当我们链接容器时,Docker会创建环境变量并将容器添加到已知主机列表中,以便它们可以相互发现

我们将查看一个运行Postgres容器的简单Docker示例,并将其链接到我们的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

4. Docker Compose网络

我们可以发现Docker链接仍在使用,但是,由于网络的引入,Docker Compose从版本2开始弃用它

通过这种方式,我们可以将应用程序与复杂的网络连接起来,例如覆盖网络。

但是,在独立应用程序中,当我们不指定网络时,我们通常可以使用网桥作为默认值。

让我们删除links并将其替换为networks,同时还为数据库添加数据卷和环境变量:

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

5. Docker links和depends_on的区别

虽然它们都涉及表达依赖关系,但Docker links和depends_on具有不同的含义。depends_on指示服务必须启动和停止的顺序,而links关键字处理网络上容器的通信

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

6. 总结

在本文中,我们通过Docker Compose示例了解了Docker链接和depends_on之间的区别。depends_on指示Docker运行容器的顺序,而links或较新版本的Docker Compose中的网络通过网络为容器设置连接。

与往常一样,我们可以在GitHub上找到案例的源docker-compose.yml文件。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章