分享

15 个 Docker 技巧和提示

 ala咪s 2018-04-08

CLI(Command Line Interface,命令行)

好的 docker ps 输出

将 docker ps 输出通过管道重定向到 less -S,避免折行:

dockerps-a|less-S

跟随 logs

docker logs 默认情况下不会观察日志,除非你使用 -f 参数:

dockerlogs<containerid>-f                                                        

docker inspect 输出漂亮的JSON

docker inspect 默认输出大量的 JSON,可以通过 jq 提取需要的那些值:

#listIPaddressesforallcontainersconnectedto'bridge'network
dockernetworkinspectbridge-f'{{json.Containers}}'|jq'.[]|{cont:.Name,ip:.IPv4Address}

也可以像下面这样在 docker inspect 中使用内置的模板:

#isthelastruncontainerstillrunning?
dockerinspect--format'{{.State.Running}}'$(dockerps-lq)

Docker 命令完成

Docker CLI 语法非常丰富,而且还在不断充实:添加新的命令和参数。要记住每个命令和参数几乎不可能,所以在终端上能自动完成这些命令很有必要。

命令完成是一个终端插件,通过 Tab 键,它会自动完成或建议你接下来要输入的内容。Docker 命令完成功能对命令和选项都能生效。Docker 团队为 Bash shell 和 Zsh shell 下的docker、docker-machine 和 docker-compose 命令提供完成功能。

清理

使用一段时间 Docker 之后,没用的东西开始增长:不用的卷、网络、已退出的容器和不用的映像等。

prune:运行全部

prune 是个非常有用的命令(可在 vaume 和 network 子命令中使用),但它从 Docker 1.13 开始才有。如果你使用旧的 Docker 版本,下面的命令可用于代替 prune 命令。

dockersystemprune

移除悬空卷

悬空卷是不被任何容器使用的卷。若要移除它们,需要结合两个命令:首先列出悬空卷的 ID 然后移除它们。

dockervolumerm$(dockervolumels-q-f"dangling=true")

删除已退出的容器

这个操作与上面的步骤相同。首先列出要删除(通过过滤)的容器(仅 ID)然后删除它们(参考 rm -f 强制删除)。

dockerrm$(dockerps-q-f"status=exited")

删除悬空映像

悬空映像是未标记的映像,它们是映像树的叶节点(不是中间层)。

dockerrmi$(dockerimages-q-f"dangling=true")

网络

Docker 内部有一个保存 IP 地址的 IP 地址池。这些 IP 地址默认对外不可见,需要通过桥接进行访问。

查找端口映射

docker run 接收明确的端口映射参数,你也可以使用 -P 来自动映射所有端口。后者的优势在于可以防止冲突, 可以通过下面的命令查找已经分配的端口:

dockerport<containerId><portNumber>
#或
dockerinspect--format'{{.NetworkSettings.Ports}}'<containerId>

容器 IP

每个容器在私有子网中都有自己的 IP (默认是 172.17.0.0/16)。重启可以改变 IP,如果你需要,可以查询:

dockerinspect--format'{{.NetworkSettings.IPAddress}}'<containerId>

docker 会检查冲突并会在必要的时候使用不同的子网。

接管主机的网络栈

docker run --net=host 允许使用主机的网络栈。不要干这种事情 :)

使用另一容器的网络栈

$dockerrun--net=container:<name|id>...

新容器可以附加到另一个容器使用的网络接口。目标容器可以通过 ID 或名称指定。

可附加的覆盖网络

使用集群模式的Docker 引擎可以在一人管理节点的覆盖网络上创建多个主机。创建集群服务的时候你可以将其附加到之前创建的覆盖网络。

有时候你需要将新的 Docker 容器(填充不同的网络工具)附加到已经存在的覆盖网络,以检查网络配置或调试问题。你可以使用 docker run 命令来完成,不需要创建全新的调试服务。

Docker 1.13 为 docker network create 命令添加了一个新选项:attachable。这个选项允许手工附加容器。

#createanattachableoverlaynetwork
dockernetworkcreate--driveroverlay--attachablemynet
#createnet-toolscontainerandattachittomynetoverlaynetwork
dockerrun-it--rm--net=mynetnet-toolssh

自动启动容器

在 Docker 容器中运行的某个进程可能会有很多原因失败。某些情况下,可以通过重新运行失败的容器来修复。如果你在使用 Docker 业务流引擎,像 Swarm 或 Kubernetes,失败的服务会自动重启。

如果没有自动重启,那么你可能希望根据容器中主进程的退出代码来重启容器,或者直接重启容器(不管退出代码)。Docker 1.12 给 docker run 命令添加了restart参数来处理这种情况。

总是重启

配置重启策略为总是重启,这样一但容器退出,Docker 就会重启它。

dockerrun--restart=alwaysmy_image

失败时重启容器

配置重启策略为失败时重启,最大重启尝试次数为 10。

dockerrun--restart=on-failure:10my_image

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多