一些Docker的技巧與祕訣

原文 Some Docker Tips and Tricks 由 Wouter Danes 編寫

Docker 可能一開始讓你望而生畏,但確實是一個非常偉大的工具。用 Shells 工作令人煩擾,並且有陷阱。鑑於我花了很多時間才弄明白它,所以我想寫這篇文章來避免你們做無用功。這篇文章列舉了一些快速技巧、祕訣和單行腳本,幫助你更有效地使用 Docker 。

移除所有的容器和鏡像(大掃除)

用一行命令大掃除:

  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 kill $(docker ps -q) ; docker rm $(docker ps -a -q) 

退出時刪除容器

如果你僅僅想在一個容器中快速的運行一個命令,然後退出,並且不用擔心容器狀態,把 --rm 參數加入 run 命令後面,這將結束很多你保存了的容器,並且清理它們。

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

不在 Shell 上運行命令

如果你使用需要Shell 的擴展項的 docker run 命令處理某些事情,比如 docker run --rm busybox ls '/var/log/*', 這個命令將失敗。這個失敗的原因我花了工夫才弄明白。這個陷阱在這裏:你原來沒有 Shell , 而 ```* 是 Shell 的擴展項,因此你需要一個能使用的 Shell 。正確方法爲:

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

Boot2Docker 和 LapTops 處理 DNS 問題的方法

由於這個原因, Boot2Docker 會佔用 DNS 服務器很長一段時間。當你在嘗試創建鏡像的時候,可能會得到離譜的錯誤。如果你在 Ubuntu 或者 CentOS 上看到下面的提示:

cannot lookup archive.ubuntu.com

聰明的做法是停止,然後啓動 boot2docker 。

boot2docker-cli down && boot2docker-cli up

這樣問題就解決了。

Volumes 解決 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 的好處

命令 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

發佈了160 篇原創文章 · 獲贊 21 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章