【DevOps基础篇】Docker进阶高级技巧使用
@TOC
推荐超级课程:
在这篇文章中,我决定与您分享一些我在使用Docker技术时经常使用的有用命令和工具。 每个“技巧”都没有特定的顺序或“酷炫水平”。 我将简单介绍用例以及特定命令或工具如何帮助我完成工作。
清理垃圾
在使用Docker一段时间后,您会开始积累开发垃圾:未使用的卷、网络、已退出的容器和未使用的镜像。
下面一条命令“清除所有”
$ docker system prune
prune是一个非常有用的命令(也适用于volume和network子命令),
删除悬空卷
悬空卷是任何容器都不使用的卷。要删除它们,结合两个命令:首先,列出悬空卷的卷ID,然后删除它们。
$ docker volume rm $(docker volume ls -q -f “dangling=true”)
删除已退出的容器
同样的原则在这里也适用。首先,列出要删除的容器(仅ID)(会带有过滤器),然后删除它们(考虑使用rm -f强制删除)。
$ docker rm $(docker ps -q -f “status=exited”)
删除悬空镜像
悬空镜像是未标记的镜像,是镜像树的叶子(不是中间层)。
docker rmi $(docker images -q -f “dangling=true”)
自动删除交互式容器
当您运行一个新的交互式容器,并且希望避免在退出后键入rm命令时,使用–rm选项。然后当您退出创建的容器时,它将自动销毁。
$ docker run -it — rm alpine sh
检查Docker资源
jq — jq是一个轻量级灵活的命令行JSON处理器。它就像sed用于JSON数据一样。您可以使用它来切片、过滤、映射和转换结构化数据,就像sed、awk、grep让您处理文本一样轻松。
docker info和docker inspect命令可以以JSON格式输出。将这些命令与jq处理程序结合使用。
美观的JSON和jq处理
显示整个Docker信息
$ docker info — format “{{json .}}” | jq .
仅显示插件
$ docker info — format “{{json .Plugins}}” | jq .
列出连接到‘bridge’网络的所有容器的IP地址
$ docker network inspect bridge -f ‘{{json .Containers}}’ | jq ‘.[] | {cont: .Name, ip: .IPv4Address}’
监视容器生命周期
有时候您希望在运行某些docker命令或尝试不同的重启策略时,看到容器被激活和退出。watch命令与docker ps结合使用在这里会非常有用。我发现docker stats命令(即使使用–format选项)对此不够实用,因为它不允许您看到与docker ps命令一样的信息。
为活动容器显示一个包含‘ID Image Status’的表格,并且每2秒刷新一次
$ watch -n 2 ‘docker ps — format “table {{.ID}}\t {{.Image}}\t {{.Status}}”’
进入主机/容器命名空间
有时候您想连接到Docker主机。ssh命令是默认选项,但是由于安全设置、防火墙规则或其他未记录的问题可能存在不可用的情况(尝试搜索“如何ssh进入Docker for Mac VM”来了解我是什么意思)。
nsenter ,是一个对于这种用例非常有用的小工具。nsenter命令允许您进入命名空间。我喜欢使用最简单(580 kB)的nsenter Docker镜像。
进入Docker主机
您可以使用--pid=host
进入Docker主机命名空间。
# get a shell into Docker host
$ docker run — rm -it — privileged — pid=host walkerlee/nsenter -t 1 -m -u -i -n sh
在Docker主机中获取shell
$ docker run — rm -it — privileged — pid=host walkerlee/nsenter -t 1 -m -u -i -n sh
进入任何容器
也可以使用nsenter和--pid=container:[id或名称]
进入任何容器。但在大多数情况下,最好使用标准的docker exec命令。主要区别在于nsenter不进入cgroups,因此可以回避资源限制(这对于调试非常有用)。
进入‘redis’容器命名空间
$ docker run — rm -it — privileged — pid=container:redis walkerlee/nsenter -t 1 -m -u -i -n sh
Heredoc Docker容器
有时您想要将一些工具作为Docker镜像,但又不想搜索合适的镜像或创建新的Dockerfile(例如,无需将其保留以供将来使用)。有时在文件中存储Docker镜像定义看起来有点过程繁琐 - 您需要决定如何编辑、存储和共享此Dockerfile。有时候拥有一条单行命令更好,您可以复制、分享、嵌入到shell脚本中或创建特殊命令别名。 所以,当您想要使用单个命令创建新的即时容器时,请尝试Heredoc方法。
使用‘htop’工具创建基于Alpine的容器
$ docker build -t htop — << EOF
FROM alpine
RUN apk — no-cache add htop
EOF
Docker命令完成提示
Docker CLI的语法非常丰富且不断增长:添加新的命令和选项。要记住每个可能的命令和选项很难,因此在终端上拥有一个良好的命令完成提示是必不可少的。
命令完成提示是一种终端插件,它可以通过按下tab键自动补全或提示下一个要键入的内容。Docker命令完成提示适用于命令和选项。Docker团队为Bash和Zsh shell准备了docker、docker-machine和docker-compose命令的命令完成提示。
如果您使用的是Mac和Homebrew,那么安装Docker命令完成提示非常简单。
Tap homebrew/completion以获取访问权限
$ brew tap homebrew/completions
为docker套件安装完成
$ brew install docker-completion
$ brew install docker-compose-completion
$ brew install docker-machine-completion
自动启动容器
在Docker容器内运行过程中,可能会因多种原因而发生故障。在某些情况下,可以通过重新运行失败的容器来解决问题。如果您正在使用Docker编排引擎,比如Swarm或Kubernetes,那么失败的服务将会自动重新启动。 如果没有,那么您可能想根据容器主要进程的退出代码重新启动容器,或者始终重新启动(不考虑退出代码)。
始终重新启动
使用重启策略保持为always
重新启动redis容器,这样如果容器退出,Docker会重新启动。
$ docker run — restart=always redis
失败时重新启动容器
使用重启策略为on-failure
和最大重启次数为10重新启动redis容器。
$ docker run — restart=on-failure:10 redis
网络技巧
有时候您可能想要创建一个新的容器并将其连接到现有的网络堆栈。这可能是Docker主机网络或另一个容器的网络。在调试和审核网络问题时,这很有帮助。
docker run --network/net
选项允许您这样做。
使用Docker主机网络堆栈
$ docker run — net=host …
新容器将连接到与Docker主机相同的网络接口。
使用另一个容器的网络堆栈
$ docker run — net=container:<名称|ID> …
新容器将连接到与另一个容器相同的网络接口。目标容器可以通过ID或名称指定。
可附加的覆盖网络
通过在swarm模式下运行的Docker Engine,您可以在管理节点上创建多主机覆盖网络。当您创建新的swarm服务时,您可以将其连接到之前创建的覆盖网络。
有时需要连接一个新的Docker容器(填充有不同网络工具),到一个现有的覆盖网络,以便检查网络配置或调试网络问题。您可以使用docker run命令进行此操作,无需创建一个完全新的“调试服务”。
Docker 1.13为docker network create
命令引入了一个新选项:attachable
。attachable选项启用手动容器附加。
创建一个可附加的覆盖网络
$ docker network create — driver overlay — attachable mynet
创建net-tools容器并将其连接到mynet覆盖网络
$ docker run -it — rm — net=mynet net-tools sh
希望您会发现这篇文章有用。如果您有自己的更多技巧,请在评论框里留言!