(四)構建鏡像
? 對于 Docker 用戶來說,最好的情況是不需要自己創建鏡像,幾乎所有常用的資料庫、中間件、應用軟體等都有現成的 Docker 官方鏡像或其他人和組織創建的鏡像,我們只需要稍作配置就可以直接使用,
? 使用現成鏡像的好處除了省去自己做鏡像的作業量外,更重要的是可以利用前人的經驗,特別是使用那些官方鏡像,因為 Docker 的工程師知道如何更好的在容器中運行軟體,
當然,某些情況下我們也不得不自己構建鏡像,比如:
- 找不到現成的鏡像,比如自己開發的應用程式,
- 需要在鏡像中加入特定的功能,比如官方鏡像幾乎都不提供 ssh,
所以本節我們將介紹構建鏡像的方法,同時分析構建的程序也能夠加深我們對前面鏡像分層結構的理解,
Docker 提供了兩種構建鏡像的方法:
- docker commit 命令
- Dockerfile 構建檔案
(1)docker commit
docker commit 命令是創建新鏡像最直觀的方法,其程序包含三個步驟:
- 運行容器
- 修改容器
- 將容器保存為新的鏡像
舉個例子:在 ubuntu base 鏡像中安裝 vi 并保存為新鏡像,
①第一步, 運行容器
root@cuiyongchao:~# docker run -it ubuntu
root@43f6f25cace2:/# vim
bash: vim: command not found
-it 引數的作用是以互動模式進入容器,并打開終端,43f6f25cace2 是容器的內部 ID,
②安裝vim
root@43f6f25cace2:/# apt-get update
root@43f6f25cace2:/# apt-get install vim -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
③保存為新的鏡像
在新的視窗查看當前運行的容器,
root@cuiyongchao:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43f6f25cace2 ubuntu "/bin/bash" 10 minutes ago Up 10 minutes gifted_bassi
root@cuiyongchao:~#
gifted_bassi 是 Docker 為我們的容器隨機分配的名字,
執行 docker commit 命令將容器保存為鏡像,新鏡像命名為 ubuntu-with-vi,
root@cuiyongchao:~# docker commit gifted_bassi ubuntu-with-vi
sha256:218e302a1e28aef0d66fc17f28114783ac3acc118f233e39708335cec5e42c6c
root@cuiyongchao:~#
查看新鏡像的屬性:
root@cuiyongchao:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-with-vi latest 218e302a1e28 26 seconds ago 167MB
ubuntu latest d70eaf7277ea 3 days ago 72.9MB
從 size 上看到鏡像因為安裝了軟體而變大了,從新鏡像啟動容器,驗證 vi 已經可以使用,
root@cuiyongchao:~# docker run -it ubuntu-with-vi
root@82c636a6c4ff:/# which vim
/usr/bin/vim
root@82c636a6c4ff:/#
以上演示了如何用 docker commit 創建新鏡像,然而,Docker并不建議用戶通過這種方式構建鏡像,原因如下:
-
這是一種手工創建鏡像的方式,容易出錯,效率低且可重復性弱,比如要在 debian base 鏡像中也加入 vi,還得重復前面的所有步驟,
-
更重要的:使用者并不知道鏡像是如何創建出來的,里面是否有惡意程式,也就是說無法對鏡像進行審計,存在安全隱患,
既然 docker commit 不是推薦的方法,我們干嘛還要花時間學習呢?原因是:即便是用 Dockerfile(推薦方法)構建鏡像,底層也 docker commit 一層一層構建新鏡像的,學習 docker commit 能夠幫助我們更加深入地理解構建程序和鏡像的分層結構,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/196052.html
標籤:其他
上一篇:容器技術(三)鏡像分層【6】
