學習Docker(2017-9-30)
銜接上一篇的內容,繼續學習 Docker 的相關知識 主人部落格
虛懸映象
中間層映象
列出部分映象
docker images 會列出所以映象,當新增多個映象只好幾個引數
以特定格式顯示
docker images -q 顯示所有映象的id資訊
下面的命令會直接列出映象結果,並且只包含映象 ID 和倉庫名:
docker images -format "{{.ID}}:{{.Repository}}"
或者打算以表格等距顯示,並且有標題行,和預設一樣,不同自己定義列:
docker images --format "table {{.ID }}\t{{.Repository}}\t{{.Tag}}"
利用 Commit 理解映象構成
回顧知識:映象是多層儲存,每一層是前一層的基礎上進行的修改;而容器也是多層儲存,是在以映象為基礎層,在其基礎上加一層作為容器執行時的儲存層
我們定製一個 Web 伺服器為例子,來講解映象是如何構建的。
docker run --name webserver -d -p 80:80 nginx
這條命令會用nginx映象啟動一個容器,名稱為webserver,並且映射了80埠,如果使用的是 Docker for Windows 直接 通過 loclhost 訪問。如果使用的是 Docker Toolbox ,或者是在虛擬機器、雲伺服器上安裝的 Docker ,則需要將 loclhost 換位虛擬機器地址或者雲伺服器的地址
出現問題圖片
docker: Error response from daemon: Conflict. The container name "/webserver"
is already in use by container
"9ea8beeb72c9f62b300ce1628f9a1660b37091636c8fc95774a3cb682b8b0819".
You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
問題:上述命令下載nginx 映象後,再次報錯?
解決:上述出錯資訊是你不能使用80埠,所以我們修改了埠,解決後的命令如下
docker run --name webserver -d -p 81:80 nginx
如果你的機器執行失敗,使用docker ps -l
檢視正在執行的映象,然後docker kill commit_ID
結束並刪除docker rm commit_ID
,然後在使用上面的命令,成功後返回一個 id
最後通過localhost:81訪問
我們可以通過docker exec
命令進入容器,修復其內容
docker exec -it webserver bash
解釋:我們以互動式終端方式進入 webserver 容器,並執行了 bash 命令, 也就是獲得一個可以操作的 Shell。
然後,我們用 Hello ,Docker! 內容覆蓋/usr/share/nginx/html/index.html
的內容
我們修改了容器的檔案,也就是改動了容器的儲存層。我們可以通過 docker diff 命令看到具體的改動
docker diff webserver
現在我們定製好了變化,將其儲存下來形成映象。Docker 提供了一個 docker commit 命令, 可以將容器的儲存層儲存下來成為映象。 換句話說,就是在原有映象的基礎上,在疊加容器的儲存層,並構成新的映象
docker commit [選項] <容器ID或容器名>[<倉庫名>[:<標籤>]]
docker commit \
--author "didiaoyuan <[email protected]>" \
--message "修改了預設網頁" \
webserver \
nginx:v2
現在我們可以在 docker images 中看到這個修改後的映象:
docker images nginx
(注意在生成新nginx:v2的時候注意拼寫錯誤,本人在這上面卡了一會!)
通過docker history
檢視映象內的歷史變化
docker history nginx:v2
然後我們允許新的映象
docker run --name web2 -d -p 82:80 nginx:v2
慎用 docker commit
大部分引用書上的解釋和自己的理解,文書出處與 GitBook《Docker 從入門與實踐》
雖然,上面解釋 docker commit 可以直觀的理解映象的分層概念,但是實際上不會使用 commit 來生成映象,而是使用 dockerfile 生成映象。
原因:
1. 如果你仔細發現 docker diff webserver 的結果,會發現,除了我們修改的 index.html 檔案外還有許多檔案被改動了或者新增。如果是安裝了軟體包、編譯構建,那會產生大量的無關內容被新增進來,會導致映象十分臃腫。
2. 使用 docker commit 對映象的操作都是暗箱操作,生成的映象都是黑箱映象,因為除了製作人知道怎麼生成,別人都不清楚,何況時間久了製作人也不清楚具體的操作,所以這種操作維護起來很難。
3. 回顧之前的分層儲存概念,除當前層外,之前的層是不會發生變化的,就是任何改變結果僅僅是在當前層進行操作(標記、新增、修改..)而不會改動上一層,使用 commit 製作映象,以及後期修改,每一層都會讓映象更臃腫一次,所刪除的上一層的東西不會消失,會一直如影隨形的跟著這個映象,只會讓這個映象更加臃腫。