原文 Some Docker Tips and Tricks 由 Wouter 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/bash
tomcat
若是你使用須要Shell 的擴展項的 docker run
命令處理某些事情,好比 docker run --rm busybox ls '/var/log/*'
, 這個命令將失敗。這個失敗的緣由我花了工夫才弄明白。這個陷阱在這裏:你原來沒有 Shell , 而 ```* 是 Shell 的擴展項,所以你須要一個能使用的 Shell 。正確方法爲:bash
docker run --rm busybox sh -c 'ls /var/log/*'
因爲這個緣由, Boot2Docker 會佔用 DNS 服務器很長一段時間。當你在嘗試建立鏡像的時候,可能會獲得離譜的錯誤。若是你在 Ubuntu 或者 CentOS 上看到下面的提示:服務器
cannot lookup archive.ubuntu.com
聰明的作法是中止,而後啓動 boot2docker 。maven
boot2docker-cli down && boot2docker-cli up
這樣問題就解決了。
docker logs
和 docker 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 來格式化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 問題進行討論。