【DevOps基础篇】Docker进阶高级技巧使用

2018-09-10T13:11:33+08:00 | 6分钟阅读 | 更新于 2018-09-10T13:11:33+08:00

Macro Zhao

【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

希望您会发现这篇文章有用。如果您有自己的更多技巧,请在评论框里留言!

© 2011 - 2025 Macro Zhao的分享站

关于我

如遇到加载502错误,请尝试刷新😄

Hi,欢迎访问 Macro Zhao 的博客。Macro Zhao(或 Macro)是我在互联网上经常使用的名字。

我是一个热衷于技术探索和分享的IT工程师,在这里我会记录分享一些关于技术、工作和生活上的事情。

我的CSDN博客:
https://macro-zhao.blog.csdn.net/

欢迎你通过评论或者邮件与我交流。
Mail Me

推荐好玩(You'll Like)
  • AI 动·画
    • 这是一款有趣·免费的能让您画的画中的角色动起来的AI工具。
    • 支持几十种动作生成。
我的项目(My Projects)
  • 爱学习网

  • 小乙日语App

    • 这是一个帮助日语学习者学习日语的App。
      (当然初衷也是为了自用😄)
    • 界面干净,简洁,漂亮!
    • 其中包含 N1 + N2 的全部单词和语法。
    • 不需注册,更不需要订阅!完全免费!
  • 小乙日文阅读器

    • 词汇不够?照样能读日语名著!
    • 越读积累越多,积跬步致千里!
    • 哪里不会点哪里!妈妈再也不担心我读不了原版读物了!
赞助我(Sponsor Me)

如果你喜欢我的作品或者发现它们对你有所帮助,可以考虑给我买一杯咖啡 ☕️。这将激励我在未来创作和分享更多的项目和技术。🦾

👉 请我喝一杯咖啡

If you like my works or find them helpful, please consider buying me a cup of coffee ☕️. It inspires me to create and share more projects in the future. 🦾

👉 Buy me a coffee