如果您使用 Docker 有一段时间,您可能已经有一个为您量身定制的简单有效的工作流程,其中包括一些您最喜欢的 docker 命令(子命令在技术上是正确的)。
为了 example,我曾经使用长命令删除未运行的容器,如下所示 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系统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 系统修剪
如果您曾经想要删除 (1) 所有未使用的网络、(2) 悬空图像、(3) 停止的容器、(4) 所有未使用的卷,那么您很有可能使用过,或者习惯于使用四个单独的命令来实现工作。
docker network prune &&
docker image prune &&
docker volume prune &&
docker container prune
如果你以前不知道 container prune
像我一样,命令变得更大。 我们很幸运,所有这些都可以使用一个简单的命令来完成,即 docker system prune --volumes
.
默认情况下 docker system prune
不会删除卷,因为您需要使用 --volumes
选项。 此命令还为您清除构建缓存。
您可以使用 -f
避免(有时)烦人的提示的选项。 见 example 以下:
➟ 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 上下文实现这一目标。
首先我有一个服务器部署在 锂节点,有 docker 正在运行。 如果我要在没有上下文的情况下访问远程 docker 守护程序,我将使用如下命令
➟ docker --host ssh://[email protected]: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://[email protected]:7770
或使用环境变量 DOCKER_HOST
. 但是这些使得切换到其他主机非常困难。 一个更简单的选择是只创建一个上下文。
以下命令创建一个名为 remote
对于与本地主机不同的 docker 端点。
docker context create remote --description "Remote docker server" --docker "host=ssh://[email protected]:7770"
输出如下所示:
➟ docker context create remote --description "Remote docker server" --docker "host=ssh://[email protected]: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
要脱离上下文,请使用 use
子命令 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 之类的工具部署它们时,有时会发生一个组件在另一个组件之前启动[s] 这取决于。 这是一个问题,因为它的依赖项(或多个依赖项)尚未启动,因此该组件将无法启动。
您可以通过在 Docker 中使用重启策略来缓解此问题,但它们并不能防止失败的尝试淹没日志。 我一开始所做的只是停止容器/服务,直到依赖项完全启动。
更好的方法是暂停容器一段时间,一旦必要的服务[s] 已成功启动,您可以取消暂停容器,一切都会从那里开始就好了。
尽管容器可以快速启动,但这是解决此类问题的更快方法。
的语法 pause
和 unpause
很简单。
docker pause [CONTAINER_NAME|ID]
docker unpause [CONTAINER_NAME|ID]
这篇文章到此结束。 如果我发现更多这样的命令,有用或有趣,我会相应地更新这篇文章。
你有一个你认为应该在这个列表中的 Docker 命令吗? 请在下面的评论中告诉我。