高效使用 Docker Compose Down 命令

DockerBeginner
立即练习

介绍

Docker Compose Down 命令是 Docker 容器管理中的一项核心工具。本实验将指导你如何高效使用 docker-compose down 来正确停止并清理 Docker 容器、网络、数据卷和镜像。掌握该命令后,你将能够维护整洁的 Docker 环境并优化开发工作流。

安装 Docker Compose 并创建示例项目

在此步骤中,我们将确保 Docker Compose 已正确安装,并创建一个示例 Docker Compose 项目以供后续操作。

验证 Docker Compose 安装

首先,让我们检查在环境设置过程中是否已成功安装 Docker Compose:

docker-compose version

你应该会看到类似以下的输出(具体的构建详情可能有所不同):

docker-compose version 1.29.2, build unknown

创建简单的 Docker Compose 文件

现在,让我们创建一个简单的 Docker Compose 文件,在整个实验中我们将使用它。我们将在当前目录下创建一个名为 docker-compose.yml 的文件,其中包含一个基于 Nginx 的基础 Web 服务。

使用 nano 编辑器创建该文件:

cd ~/project/docker-compose-demo
nano docker-compose.yml

将以下内容复制并粘贴到编辑器中:

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - web_data:/usr/share/nginx/html

  db:
    image: redis:latest
    volumes:
      - db_data:/data

volumes:
  web_data:
  db_data:

Ctrl+O 保存文件,按 Enter 确认,然后按 Ctrl+X 退出。

此 Docker Compose 文件定义了:

  • 一个使用 Nginx 镜像的 Web 服务
  • 一个使用 Redis 的数据库服务
  • 两个用于持久化数据存储的命名数据卷

启动 Docker Compose 服务

让我们启动 Docker Compose 文件中定义的服务:

docker-compose up -d

-d 参数以分离模式(后台运行)启动容器。你应该会看到类似以下的输出:

Creating network "docker-compose-demo_default" with the default driver
Creating volume "docker-compose-demo_web_data" with default driver
Creating volume "docker-compose-demo_db_data" with default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1  ... done

验证运行中的容器

让我们检查容器是否正在运行:

docker-compose ps

你应该会看到输出显示两个服务均已启动并运行:

        Name                       Command               State          Ports
-----------------------------------------------------------------------------------
docker-compose-demo_db_1    docker-entrypoint.sh redis ...   Up      6379/tcp
docker-compose-demo_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8080->80/tcp

你还可以使用 curl 检查 Nginx Web 服务器是否可访问:

curl http://localhost:8080

你应该会看到默认的 Nginx 欢迎页面 HTML 输出。

现在服务已经启动并运行,我们准备在下一步中学习 docker-compose down 命令。

理解并使用 Docker Compose Down

在此步骤中,既然我们的 Docker Compose 服务正在运行,我们将学习 docker-compose down 命令以及如何高效使用它。

什么是 Docker Compose Down?

docker-compose down 命令用于停止并移除由 docker-compose up 创建的容器、网络、数据卷和镜像。当你不再需要这些资源或想要重置环境时,该命令对于清理资源至关重要。

Docker Compose Down 的基本用法

该命令最简单的形式是:

docker-compose down

让我们运行此命令并观察会发生什么:

cd ~/project/docker-compose-demo
docker-compose down

你应该会看到类似以下的输出:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default

请注意,该命令执行了以下操作:

  • 停止 Docker Compose 文件中定义的所有运行中容器
  • 移除所有容器
  • 移除由 Docker Compose 创建的网络

但是,默认情况下它不会移除数据卷。理解这一点很重要:数据卷的生命周期独立于容器,以保留你的数据。

验证资源已被移除

让我们确认容器和网络已被移除:

docker-compose ps

你应该会看到一个空列表,表明该 Docker Compose 项目中没有正在运行的容器。

让我们检查数据卷是否仍然存在:

docker volume ls | grep docker-compose-demo

你应该会看到数据卷依然存在:

local     docker-compose-demo_db_data
local     docker-compose-demo_web_data

这种默认行为非常重要,因为它可以在容器重启后保留你的数据。如果你也想移除这些数据卷,则需要使用额外的选项,我们将在下一步中介绍。

再次启动服务

让我们再次启动服务,因为下一步还需要用到它们:

docker-compose up -d

你应该会看到:

Creating network "docker-compose-demo_default" with the default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1  ... done

请注意,Docker Compose 不需要重新创建数据卷,因为它们已经存在。

现在你已经了解了 docker-compose down 的基本用法。在下一步中,我们将探索更高级的选项来精确控制要移除的资源。

使用 Docker Compose Down 的高级选项

基本的 docker-compose down 命令很有用,但 Docker Compose 提供了额外的选项,让你能更精细地控制要移除的资源。在此步骤中,我们将探索这些选项。

移除数据卷

正如我们在上一步中观察到的,docker-compose down 默认不会移除数据卷。这是一种安全特性,旨在防止意外的数据丢失。然而,有时你确实需要移除数据卷,例如在进行彻底清理或想要重置应用程序数据时。

要连同容器和网络一起移除数据卷,请使用 --volumes 参数:

docker-compose down --volumes

让我们试一下:

cd ~/project/docker-compose-demo
docker-compose down --volumes

你应该会看到类似以下的输出:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default
Removing volume docker-compose-demo_web_data
Removing volume docker-compose-demo_db_data

请注意,这次数据卷也被移除了。

让我们验证数据卷是否已被移除:

docker volume ls | grep docker-compose-demo

你应该看不到任何输出,这确认了数据卷已被移除。

移除镜像

另一个有用的选项是在关闭 Docker Compose 环境时移除镜像。这可以通过 --rmi 参数实现,它接受不同的值:

  • --rmi all:移除任何服务使用的所有镜像
  • --rmi local:仅移除没有自定义标签的镜像

让我们再次启动服务,然后使用 --rmi 参数:

docker-compose up -d

等待服务启动,然后使用 --rmi 参数将其关闭:

docker-compose down --rmi local

你应该会看到类似以下的输出:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default
Removing image redis:latest
Removing image nginx:latest

这次,镜像也被移除了。

移除孤立容器

有时,你可能会有一些由 Docker Compose 创建但不再定义在当前 docker-compose.yml 文件中的容器。这些被称为「孤立容器」(orphan containers)。

为了演示这一点,让我们修改 Docker Compose 文件以移除 db 服务:

nano docker-compose.yml

编辑文件以移除 db 服务及其数据卷:

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - web_data:/usr/share/nginx/html

volumes:
  web_data:

保存并退出编辑器(Ctrl+O, Enter, Ctrl+X)。

现在,让我们使用更新后的文件再次启动服务:

docker-compose up -d

如果我们之前有一个未正确停止的 db 服务容器在运行,它现在就会被视为孤立容器。我们可以使用 --remove-orphans 参数移除此类孤立容器:

docker-compose down --remove-orphans

这确保了任何由旧版本 Docker Compose 文件创建但不再定义的容器也会被移除。

组合使用选项

你还可以组合使用这些选项以进行彻底清理:

docker-compose down --volumes --rmi all --remove-orphans

此命令将:

  • 停止并移除所有容器
  • 移除所有命名数据卷
  • 移除任何服务使用的所有镜像
  • 移除所有孤立容器

当你想要彻底重置环境,或者准备对 Docker Compose 配置进行重大更改时,这特别有用。

探索更多选项

你可以通过帮助参数查看 docker-compose down 命令的所有可用选项:

docker-compose down --help

花点时间查看可用的选项及其描述。

现在你已经很好地掌握了如何使用带有各种选项的 docker-compose down 来控制关闭 Docker Compose 环境时要移除的资源。

最佳实践与实际场景

在此步骤中,既然你已经了解了 docker-compose down 命令及其选项,我们将探索高效使用该命令的最佳实践和实际场景。

创建更复杂的 Docker Compose 环境

为了更好地演示实际用法,让我们创建一个更复杂的 Docker Compose 环境。我们将设置一个包含前端、后端和数据库的简单 Web 应用程序。

cd ~/project/docker-compose-demo
nano docker-compose.yml

将内容替换为:

version: "3"

services:
  frontend:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - frontend_data:/usr/share/nginx/html
    networks:
      - app_network

  backend:
    image: node:14-alpine
    command: sh -c "echo 'Backend service running' && sleep infinity"
    volumes:
      - backend_data:/app
    networks:
      - app_network
      - db_network

  database:
    image: postgres:13-alpine
    environment:
      POSTGRES_PASSWORD: example
      POSTGRES_USER: user
      POSTGRES_DB: appdb
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - db_network

networks:
  app_network:
  db_network:

volumes:
  frontend_data:
  backend_data:
  db_data:

保存并退出编辑器。

让我们启动这个更复杂的环境:

docker-compose up -d

你应该会看到输出显示所有三个服务的网络、数据卷和容器的创建过程。

最佳实践:使用环境

在实际场景中,你可能拥有开发、测试和生产等不同的环境。Docker Compose 允许你为不同环境使用不同的配置文件。

创建一个开发环境文件:

nano docker-compose.dev.yml

添加以下内容:

version: "3"

services:
  frontend:
    ports:
      - "8081:80"
    environment:
      NODE_ENV: development

  backend:
    environment:
      NODE_ENV: development
      DEBUG: "true"

  database:
    ports:
      - "5432:5432"

保存并退出编辑器。

要将此文件与基础文件结合使用,可以使用 -f 参数:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

这将合并配置,应用开发特定的设置。

要关闭此环境,你可以使用:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml down

最佳实践:使用清理脚本

在持续集成/部署 (CI/CD) 流水线或开发工作流中,拥有一个能移除所有 Docker 资源的清理脚本通常很有用。让我们创建一个简单的清理脚本:

nano cleanup.sh

添加以下内容:

#!/bin/bash

echo "Cleaning up Docker environment..."

## 停止并移除容器、网络、数据卷和镜像
docker-compose down --volumes --rmi all --remove-orphans

## 移除悬空数据卷
echo "Removing dangling volumes..."
docker volume prune -f

## 移除悬空镜像
echo "Removing dangling images..."
docker image prune -f

echo "Cleanup complete!"

保存并退出编辑器。

使脚本可执行:

chmod +x cleanup.sh

现在,每当你需要进行彻底清理时,都可以运行此脚本:

./cleanup.sh

最佳实践:选择性移除资源

有时你可能只想移除特定的资源。例如,你可能想保留数据卷(以保存数据),但移除容器、网络和镜像。

以下是针对不同场景的处理方法:

仅移除容器和网络(保留数据卷和镜像):

docker-compose down

移除容器、网络和镜像(保留数据卷):

docker-compose down --rmi all

移除容器、网络和数据卷(保留镜像):

docker-compose down --volumes

仅移除本地镜像(非从仓库拉取的镜像):

docker-compose down --rmi local

通过选择性地移除资源,你可以根据具体需求优化工作流。

最佳实践:监控资源使用情况

在运行 docker-compose down 前后,监控 Docker 资源使用情况通常很有帮助。这可以帮助你识别未被正确清理的资源。

以下是一些有用的命令:

列出所有容器(包括已停止的):

docker ps -a

列出所有网络:

docker network ls

列出所有数据卷:

docker volume ls

列出所有镜像:

docker image ls

获取系统级信息:

docker system df

让我们尝试最后一个命令来查看当前的资源使用情况:

docker system df

你将看到 Docker 资源使用情况的摘要,包括容器、镜像、数据卷的数量以及使用的总空间。

关闭我们的复杂环境

现在,让我们关闭复杂环境并移除所有相关资源:

docker-compose down --volumes --rmi all --remove-orphans

这将停止并移除与我们的 Docker Compose 项目相关的所有容器、网络、数据卷和镜像。

通过遵循这些最佳实践,你可以高效地管理 Docker 环境并确保资源使用的最优化。

总结

在本实验中,你学习了如何高效使用 docker-compose down 命令来管理 Docker 容器和资源。以下是你所学内容的总结:

  1. 安装了 Docker Compose 并创建了一个简单的 Docker Compose 环境
  2. 学习了 docker-compose down 的基础知识,以及它如何默认移除容器和网络
  3. 探索了高级选项,如 --volumes--rmi--remove-orphans,以精确控制要移除的资源
  4. 实施了最佳实践,以便在实际场景中使用 Docker Compose,包括:
    • 使用特定于环境的配置文件
    • 创建清理脚本
    • 选择性地移除资源
    • 监控资源使用情况

通过掌握 docker-compose down 命令,你现在具备了维护整洁 Docker 环境、防止资源泄漏以及优化开发工作流的知识。

请记住以下关键点:

  • 基本的 docker-compose down 命令会移除容器和网络,但会保留数据卷
  • 当你想重置数据时,使用 --volumes 来移除数据卷
  • 当你需要释放磁盘空间时,使用 --rmi 来移除镜像
  • 使用 --remove-orphans 来清理 Compose 文件中不再定义的容器
  • 在需要时组合使用这些选项进行彻底清理

掌握了这些技能,你现在能够更高效地管理项目中的 Docker Compose 环境。