雖然有點突然,但是我今天想來談談 container。對於大部分的人來說,講到 container 就會想到 docker,然而實際上,docker 並不是可以跟 container 互動的工具的唯一選項。在這個領域裡面,其實還有著很多其他的選項,像是 Buildah、Podman 和 Skopeo 三個工具就很常被拿來一起跟 docker 做比較。
關於 container 本身的概念我就不細談了,畢竟我的了解也不深,網路上就有不少講得更為深入的文章(像是這篇),下面我就簡單介紹一下,平常的開發流程中可以使用的替代工具吧。
首先就來講講這幾個工具到底是什麼吧,這三個都是 RedHat 開發的工具,因此常常被放在一起說明。
首先是 buildah,他是一套專門為了 build image 設計的工具,在使用我想他跟 docker 最大的不同就是,我們再也不需要 root 跟 daemon 了。並且 buildah 不一定要使用 Dockerfile 來 build image,還可以有其他的選項。
而 podman 主要是專注在運行 container 上面,他跟 docker 有幾乎一樣的 CLI 命令,並且一樣是不需要 root 跟 daemon 的。另外還有一點,如同它的名字所示,podman 還提供了一些對 pod 操作的功能,因此在使用 k8s 的環境下,能夠獲得一些方便。
最後是 skopeo,他有點像是原本的 docker inspect
的替代品,但可以做到更多事。像是我曾經遇到的一個需求就是,需要修改遠端 registry 的 image tag,透過 docker CLI 的話,我需要先把 image 拉下來打新的 tag 再推上去,然而 skopeo 是可以直接做到遠端更新 tag 的。
講到 build image 的話,我想另一個也很常聽到的選項是 Kaniko,一個由 Google 釋出的工具,同樣也是以不需要 daemon 作為特色。不過比較特別的是它是專門設計用來跑在 k8s 叢集或是 container 內的。
今天會突然想要講講這個是因為,前幾天寫到在 CI pipeline 內 build image 這件事,當初是使用 docker 完成的,然而其實這種做法有機會帶來一些安全性的問題(網路上應該可以找得到一些討論,像是這個),還有 docker 長期為人詬病的 root 跟 daemon 問題(雖然現在 docker 有提供 rootless mode,但還不是預設)等等,都會在 CI 的流程造成一些問題。
後來我才想到曾經看過有其他工具可以替代,因此在這邊紀錄一下,供大家參考。