有效使用 Docker Compose Down 命令

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Docker Compose 的 down 命令是 Docker 容器管理中一个必不可少的工具。本实验将指导你有效地使用 docker-compose down 来正确关闭和清理 Docker 容器、网络、卷和镜像。通过掌握这个命令,你将能够维护一个干净的 Docker 环境,并优化你的开发工作流程。

安装 Docker Compose 并创建一个示例项目

在使用 docker-compose down 命令之前,我们需要确保 Docker Compose 已正确安装,并创建一个示例 Docker Compose 项目来使用。

验证 Docker Compose 的安装

首先,让我们检查一下 Docker Compose 在安装过程中是否已成功安装:

docker-compose version

你应该看到类似这样的输出:

Docker Compose version v2.18.1

创建一个简单的 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

请注意,该命令:

  1. 停止在你的 Docker Compose 文件中定义的所有正在运行的容器
  2. 移除所有容器
  3. 移除由 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 文件中定义的容器。这些被称为“孤立容器”。

为了演示这一点,让我们修改我们的 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

此命令将:

  1. 停止并删除所有容器
  2. 删除所有命名卷
  3. 删除任何服务使用的所有镜像
  4. 删除任何孤立容器

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

探索其他选项

你可以通过使用 help 标志来查看 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..."

## Stop and remove containers, networks, volumes, and images
docker-compose down --volumes --rmi all --remove-orphans

## Remove dangling volumes
echo "Removing dangling volumes..."
docker volume prune -f

## Remove dangling images
echo "Removing dangling images..."
docker image prune -f

echo "Cleanup complete!"

保存并退出编辑器。

使脚本可执行:

chmod +x cleanup.sh

现在,你可以在需要进行完全清理时运行此脚本:

./cleanup.sh

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

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

以下是你将如何处理不同的场景:

  1. 仅删除容器和网络(保留卷和镜像):

    docker-compose down
  2. 删除容器、网络和镜像(保留卷):

    docker-compose down --rmi all
  3. 删除容器、网络和卷(保留镜像):

    docker-compose down --volumes
  4. 仅删除本地镜像(未从注册表拉取):

    docker-compose down --rmi local

通过选择性地删除资源,你可以根据你的特定需求优化你的工作流程。

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

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

以下是一些有用的命令:

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

    docker ps -a
  2. 列出所有网络:

    docker network ls
  3. 列出所有卷:

    docker volume ls
  4. 列出所有镜像:

    docker image ls
  5. 获取系统范围的信息:

    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 环境。