對於 Docker 用戶來講,最好的狀況是不須要本身建立鏡像。幾乎全部經常使用的數據庫、中間件、應用軟件等都有現成的 Docker 官方鏡像或其餘人和組織建立的鏡像,咱們只須要稍做配置就能夠直接使用。docker
使用現成鏡像的好處除了省去本身作鏡像的工做量外,更重要的是能夠利用前人的經驗。特別是使用那些官方鏡像,由於 Docker 的工程師知道如何更好的在容器中運行軟件。數據庫
固然,某些狀況下咱們也不得不本身構建鏡像,好比:ubuntu
找不到現成的鏡像,好比本身開發的應用程序。安全
須要在鏡像中加入特定的功能,好比官方鏡像幾乎都不提供 ssh。ssh
因此本節咱們將介紹構建鏡像的方法。同時分析構建的過程也可以加深咱們對前面鏡像分層結構的理解。學習
Docker 提供了兩種構建鏡像的方法:code
docker commit 命令中間件
Dockerfile 構建文件開發
docker commitit
docker commit 命令是建立新鏡像最直觀的方法,其過程包含三個步驟:
運行容器
修改容器
將容器保存爲新的鏡像
舉個例子:在 ubuntu base 鏡像中安裝 vi 並保存爲新鏡像。
第一步, 運行容器
-it
參數的做用是以交互模式進入容器,並打開終端。412b30588f4a
是容器的內部 ID。
安裝 vi
確認 vi 沒有安裝。
安裝 vi。
保存爲新鏡像
在新窗口中查看當前運行的容器。
silly_goldberg
是 Docker 爲咱們的容器隨機分配的名字。
執行 docker commit 命令將容器保存爲鏡像。
新鏡像命名爲 ubuntu-with-vi
。
查看新鏡像的屬性。
從 size 上看到鏡像由於安裝了軟件而變大了。
重新鏡像啓動容器,驗證 vi 已經能夠使用。
以上演示瞭如何用 docker commit 建立新鏡像。然而,Docker 並不建議用戶經過這種方式構建鏡像。緣由以下:
這是一種手工建立鏡像的方式,容易出錯,效率低且可重複性弱。好比要在 debian base 鏡像中也加入 vi,還得重複前面的全部步驟。
更重要的:使用者並不知道鏡像是如何建立出來的,裏面是否有惡意程序。也就是說沒法對鏡像進行審計,存在安全隱患。
既然 docker commit 不是推薦的方法,咱們幹嗎還要花時間學習呢?
緣由是:即使是用 Dockerfile(推薦方法)構建鏡像,底層也 docker commit 一層一層構建新鏡像的。學習 docker commit 可以幫助咱們更加深刻地理解構建過程和鏡像的分層結構。
下一節咱們學習如何經過 Dockerfile 構建鏡像。