一些 Docker 的技巧与秘诀

原文 Some Docker Tips and TricksWouter Danes 编写html

Docker 可能一开始让你望而生畏,但确实是一个很是伟大的工具。用 Shells 工做使人烦扰,而且有陷阱。鉴于我花了不少时间才弄明白它,因此我想写这篇文章来避免大家作无用功。这篇文章列举了一些快速技巧、秘诀和单行脚本,帮助你更有效地使用 Docker 。java

移除全部的容器和镜像(大扫除)

用一行命令大扫除:golang

docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)

注:shell 中的 $() 和 `` 相似,会先执行这里面的内容,上面的脚本会出现以下 docker kill "pids" ; docker kill 在 docker 中用于中止容器,docker rm 删除容器, docker rmi 删除镜像docker

当没有运行的容器或者是根本没有容器的时候,这只会提示一个警告信息。当你想尝试的时候,这就是个很是好的单行命令。若是你仅仅想删除全部的容器,你能够运行以下命令:shell

docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)

退出时删除容器

若是你仅仅想在一个容器中快速的运行一个命令,而后退出,而且不用担忧容器状态,把 --rm 参数加入 run 命令后面,这将结束不少你保存了的容器,而且清理它们。ubuntu

示例:docker run --rm -i -t busybox /bin/bashtomcat

不在 Shell 上运行命令

若是你使用须要Shell 的扩展项的 docker run 命令处理某些事情,好比 docker run --rm busybox ls '/var/log/*', 这个命令将失败。这个失败的缘由我花了工夫才弄明白。这个陷阱在这里:你原来没有 Shell , 而 ```* 是 Shell 的扩展项,所以你须要一个能使用的 Shell 。正确方法为:bash

docker run --rm busybox sh -c 'ls /var/log/*'

Boot2Docker 和 LapTops 处理 DNS 问题的方法

因为这个缘由, Boot2Docker 会占用 DNS 服务器很长一段时间。当你在尝试建立镜像的时候,可能会获得离谱的错误。若是你在 Ubuntu 或者 CentOS 上看到下面的提示:服务器

cannot lookup archive.ubuntu.com

聪明的作法是中止,而后启动 boot2docker 。maven

boot2docker-cli down && boot2docker-cli up

这样问题就解决了。

Volumes 解决 docker logsdocker copy 问题

若是你想在一个容器中监控另外一个容器中的日志文件和文件的使用,你能够看看 volumes ,例如,检查 tomcat 是否启动:

tomcat_id=$(docker run -d -v /var/log/tomcat6 wouterd/tomcat6)
# Give Tomcat some time to wake up...
sleep 5
while ! docker run --rm --volumes-from ${tomcat_id} busybox /bin/sh -c "grep -i -q 'INFO: Server startup in' /var/log/tomcat6/catalina*.log" ; do
    echo -n "."
    sleep 5
done

你还能够在一个 Dockerfile中指定 volumes ,这个在我前面的博客文章中结合 Docker 连载了。

Docker Inspect 结合 Go Templates 的好处

命令 docker inspect 容许使用 Go Templates 来格式化inspect 命令的输出信息若是你擅长这个,你能获取不少 docker 容器命令行的脚本输出信息。这是一个获取正在运行的容器 IP 的示例:

container_ip=$(docker inspect --format '{{.NetworkSettings.IPAddress}}' ${container_id})

这里有一个笨的技巧,用于获得匹配全部暴露(exposed)的端口 host:port ,而且把他们输入一个 java properties 文件:

sut_ip=${BOOT_2_DOCKER_HOST_IP}
template='{{ range $key, $value := .NetworkSettings.Ports }}{{ $key }}='"${BOOT_2_DOCKER_HOST_IP}:"'{{ (index $value 0).HostPort }} {{ end }}'
tomcat_host_port=$(docker inspect --format="${template}" ${container_id})
for line in ${tomcat_host_port} ; do
    echo "${line}" >> ${work_dir}/docker_container_hosts.properties
done

敬请阅读

My post on continuous integration using docker and maven

注:如需转载,请注明出处。因为我的的翻译水平问题,同时欢迎各位读者修正翻译的错误,而且就 Docker 问题进行讨论。