百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

3 个不为人知的 Docker 命令,但它们在管理容器时会派上用场

suiw9 2024-10-31 16:05 26 浏览 0 评论

如果您使用 Docker 有一段时间,您可能已经有一个为您量身定制的简单而有效的工作流程,其中包括一些您最喜欢的 docker 命令。

例如,我曾经使用看起来像这样的长命令删除未运行的容器docker container rm $(docker container ps -qf status=exited),它起作用了,显然只要没有悬空的容器就会抛出错误。

有一天,当我发现我们还有一个prune用于容器的子命令时,这种情况就停止了!

所以现在这个长命令已经归结为一个简单的docker container prune.

关键是,即使我们中的许多人已经使用 Docker 一段时间了,有些事情可能会被忽视,甚至可能随着时间的推移而被遗忘。

在本文中,我将为您提供三个 docker 命令,它们可能对您来说是新的,或者您不经常使用它们,但我认为您应该使用它们。

1.系统子命令

Docker 有一个system命令,可以为您提供一些与 docker 相关的系统级信息,您实际上已经使用其中一个子命令有一段时间了,还记得docker info吗?这个命令实际上是docker system info.

要了解有关此子命令及其提供的更多信息,请在--help其上运行该选项。

? docker system --help

Usage:  docker system COMMAND

Manage Docker

Commands:
  df          Show docker disk usage
  events      Get real time events from the server
  info        Display system-wide information
  prune       Remove unused data

Run 'docker system COMMAND --help' for more information on a command.

让我们逐一介绍这些子命令,因为我认为它们都非常关键。

Docker system df

您是否曾经遇到过服务器磁盘空间几乎已满的情况?

要检查它是否是容器(运行/卷),您可能一直在直接在数据根目录上使用该du命令。

数据根或数据根是 docker 存储与其状态相关的所有数据的位置,这包括但不限于图像(层)、卷、网络相关信息、插件。

du在数据根上使用需要sudo访问权限。

? du -h --max-depth=1 /var/lib/docker
du: cannot read directory '/var/lib/docker': Permission denied
4.0K    /var/lib/docker

不仅如此,要明确知道分配了多少卷或映像,您必须多次运行该命令。

? sudo du -h --max-depth=0 /var/lib/docker/volumes && \
    sudo du -h --max-depth=0 /var/lib/docker/image && \
    sudo du -h --max-depth=0 /var/lib/docker/

一个更好的选择是调用docker system df命令,这将自动检测数据根并相应地打印有关Docker 容器、图像和卷的磁盘使用情况的所有信息。

这是我当前系统显示的内容(这是一个新安装)

? docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          10        1         84.17MB   84.17MB (100%)
Containers      1         1         8.219MB   0B (0%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

Docker 系统修剪

如果您曾经想要删除:

  • 所有未使用的网络
  • 悬空图像
  • 停止的容器
  • 所有未使用的卷

那么您很有可能使用过,或者习惯于使用四个单独的命令来实现工作。

docker network prune && \
    docker image prune && \
    docker volume prune && \
    docker container prune

如果您以前不知道container prune像我一样,那么命令会变得更大。我们很幸运,所有这些都可以使用一个简单的命令来完成,即docker system prune --volumes.

默认情况下docker system prune不会删除卷,因为您需要使用该--volumes选项。此命令还为您清除构建缓存。

您可以使用该-f选项来避免(有时)烦人的提示,请参见下面的示例:

? docker system prune --volumes -f
Deleted Containers:
672d39c1a78969887f411ce9139e74e5b21c31fccf2bcf8c1190a9e166089ede

Deleted Networks:
Example
SSHnet
Dummy

Deleted Volumes:
dummy

Total reclaimed space: 0B

其他选项包括-a删除所有未使用的图像,而不仅仅是悬空的图像。

Docker 系统事件

这个命令可能不是一直都有用,但我认为每个人都应该知道这一点。

docker system events或者docker events简而言之,直接为 docker 守护进程 ( ) 提供实时事件dockerd。这可以帮助监控某些事件,例如图像何时被删除。

请参阅下面的屏幕截图以更好地理解这一点。

2.上下文子命令

这是另一个漂亮的子命令,据我所知,没有多少人知道。任何 docker 命令执行的上下文都是一对键值对,包括但不限于端点、主机,可能还有一些配置文件等。

创建上下文后,以后可以重用它。

最大的实际用例之一,尤其是对我来说,是为我运行 docker 的各个服务器创建单独的上下文。因为我的大部分工作都围绕它展开,所以我不是每次都登录服务器,而是通过 SSH 使用本地客户端和删除 docker 服务器。

让我向您展示如何使用 docker 上下文实现这一目标。

首先,我在Linode上部署了一台服务器,该服务器正在运行 docker。如果我要在没有上下文的情况下访问远程 docker 守护程序,我将使用如下命令

? docker --host ssh://debdut@194.195.116.210:7770 ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS                                                                      NAMES
bb4fa8390ab7   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   2 hours ago   Up 2 hours                                                                              reverse-proxy_letsencrypt_1
ccdda507facb   jwilder/nginx-proxy                      "/app/docker-entrypo…"   2 hours ago   Up 2 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   reverse-proxy_reverse_proxy_1

因此,要访问远程守护程序,我必须使用别名docker,docker --host ssh://debdut@194.195.116.210:7770或者使用环境变量DOCKER_HOST。但是这些使得切换到其他主机非常困难。一个更简单的选择是只创建一个上下文。

以下命令remote为与本地主机不同的 docker 端点创建一个名为 的上下文。

docker context create remote --description "Remote docker server" --docker "host=ssh://debdut@194.195.116.210:7770"

输出如下所示:

? docker context create remote --description "Remote docker server" --docker "host=ssh://debdut@194.195.116.210:7770"
remote
Successfully created context "remote"

现在,如果您想快速检查某些内容或重复操作,您可以使用该-c选项,将上下文更改为这个新的。docker

使用以下-c选项:

? docker -c remote ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS                                                                      NAMES
bb4fa8390ab7   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   2 hours ago   Up 2 hours                                                                              reverse-proxy_letsencrypt_1
ccdda507facb   jwilder/nginx-proxy                      "/app/docker-entrypo…"   2 hours ago   Up 2 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   reverse-proxy_reverse_proxy_1

与docker context use [CONTEXT_NAME]:

? docker context use remote
remote
Current context is now "remote"
~ 
? docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED       STATUS       PORTS                                                                      NAMES
bb4fa8390ab7   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   2 hours ago   Up 2 hours                                                                              reverse-proxy_letsencrypt_1
ccdda507facb   jwilder/nginx-proxy                      "/app/docker-entrypo…"   2 hours ago   Up 2 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   reverse-proxy_reverse_proxy_1

要脱离上下文,请使用usewith 子命令default作为上下文名称:

? docker context use default
default
Current context is now "default"
~ 
? docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

3. pause & unpause 子命令

大部署(应用程序)现在分为多个组件,更广为人知的是微服务,当您使用 docker-compose 之类的工具部署它们时,有时会发生一个组件在它所依赖的组件之前启动的情况,这是一个问题,因为它的依赖项(或多个依赖项)尚未启动,因此该组件将无法启动。

您可以通过在 Docker 中使用重启策略来缓解此问题,但它们并不能防止失败的尝试导致日志泛滥,我一开始所做的只是停止容器/服务,直到依赖项完全启动。

更好的方法是暂停容器一段时间,一旦必要的服务成功启动,您可以取消暂停容器,一切都会从那里顺利进行。

尽管容器可以快速启动,但这是解决此类问题的更快方法。

pause和的语法unpause非常简单。

docker pause [CONTAINER_NAME|ID]
docker unpause [CONTAINER_NAME|ID]

相关推荐

5款Syslog集中系统日志常用工具对比推荐

一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...

跨平台、多数据库支持的开源数据库管理工具——DBeaver

简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...

强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)

NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...

3 年 Java 程序员还玩不转 MongoDB,网友:失望

一、什么场景使用MongoDB?...

拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南

作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...

mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?

前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...

solidworks使用心得,纯干货!建议大家收藏

SolidWorks常见问题...

统一规约-关乎数字化的真正实现(规范统一性)

尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...

Elasticsearch节点角色配置详解(Node)

本篇文章将介绍如下内容:节点角色简介...

产前母婴用品分享 篇一:我的母婴购物清单及单品推荐

作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...

比任何人都光彩照人的假期!水润、紧致的肌肤护理程序

图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...

Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型

中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...

柔性——面向大规模定制生产的数字化实现的基本特征

大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...

创建PLC内部标准——企业前进的道路

作者:FrankBurger...

标准化编程之 ----------- 西门子LPMLV30测试总结

PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...

取消回复欢迎 发表评论: