關於我常用的 Docker 小提示

在使用 Docker 佈署時一些還不錯用的小提示。手邊有一個小小的服務,到後來越來越需要穩定與多功能應付一些狀況,開始去注意 Docker 在起一個 container 時,搭配一些指令或許可以事半功倍。

以下的提示有些片段,可以單獨的使用。

docker -d, Ctrl p + Ctrl q

docker attach 進入一個 detached(-d) container 時,處理完事情準備離開,可以使用 Ctrl p + Ctrl q 離開,當然也可以更懶惰一點就是直接關閉視窗。

docker run -p 127.0.0.1:8080:8800

先說一下這個使用情境,最外面的一層會使用 nginx 來接聽 Port 80,進到 container 層用 Port 8080 來接,最後是 container 內的 web app 用 8800 來聽(可能就直接起一個 flask 之類的)。

但常常會有人直接用 docker run -p 8080:8800 來跑,如果最外主機沒有類似 AWS EC2 的 security group 限制 inbound 或是防火牆之類的,這樣也會把 Port 8080 也變成一個 Public Port。

所以養成習慣,統一都由 nginx 來接應,container 都順手補上 127.0.0.1。

docker run -restart=’always’

雖然 docker 1.12 daemon flag 新增 --live-restore 可以避免 daemon 關掉時 container 不會跟著一起被關掉(像是每次 upgrade docker 都會發生)或是有時候主機莫名其妙被重開機(!?)

順手加上這個,永保 container 生生不息。

Delete all <none> images

常常會因為重新 build image,相同名稱舊的 image 會變成 <none>,透過以下的指令可以移除所有 <none> 的 image(不包含還有 container 在使用的 image)

docker rmi $(docker images -f "dangling=true" -q)

可以新增一個 alias 快速用。

Remove unused volumes

其實在刪除一個 container 時,常常都會忘記要加上 -v or --volumes 的參數,所以就會在 docker/volumes 留下一些沒用的 volumes,經年累月後就可能留下超多垃圾,這時候可以透過這指令刪除無用的 volumes。

docker volume ls -qf dangling=true | xargs -r docker volume rm

當然,或是以後使用 docker rm 時都記得加上 -v。

docker run --log-opt

在 docker/container /{container_id} 底下會有一個 {container_id}-json.log,如果是跑一個不太會或是不希望重開的 container 時,這檔案會越來越肥。

有兩個不錯用的參數可以一起使用:

--log-opt max-size=[0-9+][k|m|g]
--log-opt max-file=[0-9+]

設定每包的大小與保留多少個最新的包。

Do docker stop before docker rm

不確定大家怎樣關掉一個不要用的 container,以前我都直接下 docker rm 的指令,但後來發現,這樣會把跑得一半的程式無預警的中斷,不太好,所以現在都會搭配 docker stop 再 rm。

像是在跑 queue 相關的服務時,docker stop 會執行退出的程序,然後關閉。

docker run --add-host

如果服務有一個 domain,很確定它歸屬在哪一台主機(同區段)或是根本就是同一台的話,可以使用 --add-host 參數,直接走 Private IP,有時候還可以節省流量費用(網內不用錢)。

docker run --name

之前有看過類似這樣的設定:

docker run -d --name redis:REDIS_MASTER redis

然後實際在程式裡面使用 REDIS_MASTER 當 host 的時候就掛了,有些套件會把這段視為網址,自動全部轉成小寫,所以還是全部都用小寫的命名規則。

docker swarm mode

v1.12 新功能 swarm mode 我覺得還不錯用,尤其是 docker service update 裡的 --update-delay, --update-parallelism 可以實現批次更新!

目前手邊有一個很小很小的靜態服務,主要是回傳很少變動的參數值,我就把申請到的機器都用 docker service 串起來然後佈署出去,反正有些主機閒閒的。

寫在最後

以上就是目前我在公司用很多 docker 的小小提示分享,docker 是滿好用的,不管是用在服務或是開發上,但還是有些奇奇怪怪的問題目前是無解(其他同事遇到、還好我沒遇到 XD),有時間再整理。