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