使用 CLI 管理容器

在虚拟化出现之前,Web 服务器和 Web 应用程序的管理繁琐且效率低下。虚拟化技术的应用让这项任务变得轻松许多。随后,容器化技术的应用更是锦上添花。对于网络工程师来说,学习虚拟化的基础知识并非易事,尤其考虑到物理层本身就极具挑战性。

什么是 Docker?为什么要使用它?

Docker 是一个用于设计、交付和运行应用程序的开放平台。使用 Docker,您的应用程序可以独立于基础架构,因为它需要快速交付。这只是 Docker 提供的一种方法;遗憾的是,其他一些问题仍未得到解答。例如,Windows、Mac 和 Linux 都是可以想到的操作系统:但在理想情况下,只能管理 Docker 管理的 Windows 容器。只有采用 Docker 的所有测试和部署方法,才能部署代码并制定离岸运营策略:因此,使用 Docker 运行时应该可以提高在生产环境中编写和部署代码的速度。

但这在实际中意味着什么呢?与虚拟化类似,Docker 允许多个容器之间共享资源,这些容器独立于操作系统内核。这意味着可以在单个服务器上托管多个应用程序,并使用单个操作系统。

Docker 的好处

环境一致性

  • 隔离:将应用程序及其依赖项保存在单独的容器中,以确保跨环境的一致行为。

  • 不再有问题:告别“它在我的计算机上可以运行”的问题。

快速部署

  • 快速启动:几秒钟内启动容器,以便更快地进行测试和部署。

  • 轻松回滚:如果需要,立即恢复到以前的容器版本。

资源效率

  • 轻量级:容器共享主机操作系统内核,使其比传统虚拟机更高效。

  • 多个应用程序:在一台服务器上运行多个应用程序,无需额外开销。

简化扩展

  • 水平扩展:轻松添加更多容器来处理增加的流量。

  • 使用编排工具:使用 Kubernetes 或 Docker Swarm 管理和自动化您的容器。

微服务架构

  • 服务细分:将应用程序分解为更小的服务,每个服务位于自己的容器中。

  • 独立开发:团队可以从事不同的服务,而不会互相干扰。

环境版本控制

  • 图像版本控制:使用版本化的 Docker 图像跟踪应用程序的不同状态。

精简的 CI/CD

  • 集成:使用 Docker 与 CI/CD 工具进行自动化测试和部署。

  • 可重现的环境:确保从开发到生产的环境一致。

轻松备份和恢复

  • 简单备份:可移植性使得备份和恢复应用程序变得简单。

家庭实验室和实验

  • 测试新技术:建立一个家庭实验室来试验新的框架,而不会影响您的主要设置。

利用社区和生态系统

  • 预构建图像:使用 Docker Hub 获取即用型图像,节省设置时间。

  • 支持性社区:利用充满活力的社区提供的丰富资源和支持。

如何管理 Docker 容器?

管理 Docker 容器一开始可能会让人感到有些不知所措,但只要使用正确的方法和工具,一切就会变得轻而易举。按照以下步骤,你可以轻松管理 Docker 容器:

了解基本命令

  • 启动和停止容器:使用类似命令docker start <container_name>启动和docker stop <container_name>停止容器。这些命令是管理容器状态的常用命令。

  • 查看正在运行的容器:该命令docker ps显示所有正在运行的容器列表。添加-a(即docker ps -a)可查看所有容器,包括已停止的容器。

容器生命周期管理

  • 创建容器:您可以使用 从镜像创建新容器docker run <image_name>。如果您还没有镜像,这将拉取镜像。

  • 删除容器:使用完容器后,可以使用 将其删除docker rm <container_name>。用于-f强制删除正在运行的容器。

管理资源

  • 限制资源:Docker 允许你限制每个容器的资源。运行容器时,使用--memory和等标志--cpus可以防止其使用过多资源。

  • 使用卷实现持久化:使用 Docker 卷来保持数据持久化,即使容器被删除。这对于数据库或任何需要保存数据的应用程序都很有帮助。

监控容器健康状况

  • 健康检查:在 Dockerfile 中或通过 Docker Compose 设置健康检查。这可确保您的容器正常运行,并在出现问题时自动重启。

  • 日志记录:使用 Docker 的日志记录选项捕获容器输出。该命令docker logs <container_name>允许您查看日志以进行故障排除。

使用管理工具

  • Portainer:这是一个流行的基于 Web 的 Docker 容器管理 GUI。它界面友好,可让您以可视化的方式管理容器,更轻松地查看正在运行的内容并调整设置。

  • Docker Compose:使用 Docker Compose 管理多容器应用程序。您可以在一个文件中定义容器docker-compose.yml,并使用单个命令 ( docker-compose up) 管理所有容器。

使用脚本实现自动化

  • Bash 脚本:创建脚本来自动执行日常任务。例如,您可以编写脚本来同时启动多个容器,或者备份卷中的数据。

  • 自定义镜像的 Dockerfile:使用 Dockerfile 自动创建符合您需求的自定义镜像。这样可以轻松一致地部署相同的环境。

定期维护

  • 清理未使用的资源:随着时间的推移,您将积累未使用的镜像、容器和网络。用于docker system prune清理未使用的资源并释放空间。

  • 定期更新镜像:保持镜像更新,以便从安全补丁和性能改进中获益。用于docker pull <image_name>获取最新版本。

备份和还原

  • 备份数据:确保备份存储在卷中的重要数据。使用以下命令docker run --rm --volumes-from <container_name> -v $(pwd):/backup busybox tar czf /backup/backup.tar.gz /data创建备份。

  • 恢复数据:要恢复数据,您可以创建一个新的容器并使用类似的命令解压备份。

使用 CLI 管理 Docker 容器的分步指南

如果您同时管理多个 Docker 容器,这确实是一项非常繁重的任务。通过使用以下命令,我们将学习一些实用技巧,帮助您直接从命令行界面管理 Docker 容器。我们将看到一些最常用且非常有效的 Docker 命令的实例,这些命令一定会让您的 Docker 体验更加流畅。

步骤 1:在交互式 Shell 中运行 Docker 容器

从官方 Docker 镜像仓库中拉取 Docker Ubuntu 镜像后,你可能想要访问 Ubuntu 操作系统的 bash 来操作文件系统或安装软件包和库。你可以使用 -i 标志以交互模式运行 Docker 容器来实现这一点。

sudo docker pull ubuntu   
sudo docker run -it ubuntu

交互模式

步骤 2:删除所有悬空卷

Docker 允许您将 Docker 卷挂载到 Docker 容器,以便在多个 Docker 容器之间共享文件和目录。但是,当您删除 Docker 容器时,与其关联的 Docker 卷仍会保留在那里。这些卷被称为 Docker 卷。要查找所有悬空的 Docker 卷的列表,可以使用以下命令。

sudo docker volume ls -f dangling=true

列出悬空卷

为了避免留下悬空卷,在删除 Docker 卷时,可以使用 -v 标志。

sudo docker rm -v <container-id>

使用以下命令集列出正在运行的 Docker 容器,停止特定容器并使用 -v 标志将其删除,以避免留下悬空卷。

sudo docker container ls   
sudo docker stop my-container-01   
sudo docker rm -v my-container-01

避免悬垂卷

步骤3:删除Docker容器和镜像

您可以使用 rm 命令删除 Docker 容器。但是,在删除 Docker 容器之前,您需要确保该 Docker 容器未运行。要停止并删除 Docker 容器,您可以使用以下命令。

sudo docker ps -a
sudo docker stop <container-name>
sudo docker rm <container-name> 

第一个命令会显示系统中所有容器的列表。您可以在“状态”列下检查容器的状态。如果容器未退出,则需要先停止容器,然后再将其移除。

Docker ps 命令

删除 Docker 容器

要删除 Docker 镜像,首先删除与该镜像关联的所有容器。

sudo docker rmi <image-id>

步骤 4:使用别名

大多数 Docker 命令太长,难以记住。您可以简单地创建并使用别名,并在~/.bashrc文件中提及它们。

alias dockrm='docker rm'
alias docklist='docker ps -a'

步骤5:检查Docker容器

您可以使用 Docker Inspect 命令获取特定 Docker 容器的详细信息。它会提供容器的每个细节,例如路径、创建日期、状态、驱动程序等。您需要容器名称才能检查容器。

sudo docker container ls
sudo docker container <container-name>

检查 Docker 容器

Docker 容器管理的最佳实践

保持容器轻量

  • 每个容器一个进程:设计每个容器运行单个应用程序或进程。这样可以使操作更简单,也更容易进行故障排除。

  • 避免将数据存储在容器中:容器应该是临时的,这意味着它们可以随时启动和停止。请使用 Docker 卷进行持久数据存储。

拥抱速度和可处置性

  • 快速启动:容器应该快速启动。这是 Docker 相较于传统虚拟机的优势之一。

  • 使容器可丢弃:容器应设计为按需创建和销毁,以实现快速扩展和资源效率。

实现不变性

  • 使用不可变镜像:一旦您的 Docker 镜像通过了所有测试,就将其视为不可更改的。这样,如果出现问题,您可以轻松回滚到稳定版本。

  • 避免使用 LATEST 标签:不要使用 LATEST 标签,而是为镜像分配版本号。这有助于更好地跟踪更改和管理依赖关系。

优先考虑安全

  • 限制权限:避免以 root 用户身份运行容器。使用-u标志设置用户权限。

  • 安全存储机密:请勿将凭据等敏感信息保存在容器内。请使用环境变量或机密管理工具。

  • 使用安全工具:使用扫描工具检查容器镜像中的漏洞。

优化资源配置

  • 控制 CPU 和内存使用情况:使用 Docker 命令设置容器可使用的 CPU 和内存限制。这可以防止某个容器独占所有资源。

  • 利用块 IO 约束:调整块 IO 权重以优先考虑关键容器的性能。

明智地管理环境变量

  • 设置环境变量:您可以使用--env标志或 Dockerfile 指令来定义应用程序所需的环境变量。这有助于保持容器的灵活性。

  • 区分 ARG 和 ENV:分别用于ARG构建时变量和ENV运行时变量。这种区别有助于有效地管理配置。

智能联网

  • 了解网络:默认情况下,Docker 会为容器分配唯一的 IP 地址。但是,由于容器是临时性的,因此可以考虑使用服务名称而不是 IP 地址进行容器间通信。

  • 适当暴露端口:明确需要为您的应用程序暴露哪些端口。使用环境变量可以轻松管理端口。

集中式日志记录

  • 采用容器感知日志记录:传统的日志记录工具可能无法很好地支持多容器。使用 Sumo Logic 等集中式日志记录解决方案,它可以在一个地方处理所有容器的日志,从而提高可见性。

持续监控和维护

  • 监控容器健康状况:使用健康检查密切关注容器的健康状况。这可确保容器按预期运行,并在发生故障时重新启动。

  • 定期清理:删除未使用的图像、已停止的容器和网络以释放资源并保持 Docker 环境整洁。

Docker 安全最佳实践

安全性是使用 Docker 容器至关重要的一部分。虽然 Docker 团队已经整合了许多现代安全协议,但从开发过程开始就必须优先考虑安全性。以下是一些简单的做法,可帮助您确保 Docker 容器的安全:

  • 避免以 root权限运行容器:授予容器 root 权限可能会带来重大风险。请尽量只创建具有所需权限的容器。使用 `-u` 标志指定具有有限权限的用户,而不是以管理员身份运行所有内容。

  • 保护您的凭证:请勿将密码等敏感信息直接存储在容器中。这就像把密码写在便签上一样——如果有人入侵容器,他们可以轻松访问这些信息。使用环境变量来安全地管理凭证,并将其与您的应用程序分开。

  • 谨慎使用 `–privileged` 标签:容器默认以安全、非特权模式运行,这意味着它们无法访问主机系统上的其他设备。如果您需要授予特定设备的访问权限,请使用 `–privileged` 标签,但请谨慎使用,并且仅在必要时使用。

  • 利用第三方安全工具:多一层防护始终是明智之举。考虑使用第三方安全应用程序,它们可以审查您的配置并扫描代码中是否存在已知漏洞。这些工具通常具有用户友好的界面,让您更轻松地管理容器安全。

  • 考虑私有软件镜像仓库:虽然 Docker Hub 提供免费的软件镜像仓库,但它也存在安全风险,尤其是对于大型项目而言。请评估私有 Docker 镜像仓库是否适合您的团队。它可以提供一种更安全的方式来共享和分发 Docker 镜像,而不会将您的资源暴露在公众监督之下。

结论

Docker 的出现彻底改变了软件开发生命周期,从构建应用程序到交付和运行应用程序。容器为应用程序环境提供了前所未有的可靠性,同时缩短了部署时间并提高了资源利用率。然而,正如 Aaron 和 Michal 以及其他许多人所说,遵循 Docker 的最佳实践至关重要,这些最佳实践侧重于安全性、资源管理和容器管理。即使是在小型项目或构建大型应用程序时,遵循这些实践也能改进开发流程,并提供更安全、更高效的平台。别忘了,您无需独自完成这一切——活跃的 Docker 用户社区拥有丰富的知识和可能性,可以帮助您取得成功。

Leave a Comment