docker鏡像和容器的區(qū)別在于鏡像是靜態(tài)模板,而容器是運行實例。具體來說:1. 鏡像是只讀的,包含應(yīng)用所需的所有文件、依賴和配置,相當(dāng)于打包好的軟件安裝包;2. 容器是基于鏡像創(chuàng)建的可讀寫實例,是實際運行程序的載體;3. 鏡像不會占用運行資源,只有啟動鏡像生成容器后,才會真正運行程序;4. 使用docker run命令可以從鏡像啟動容器,并通過參數(shù)如-d后臺運行、-p端口映射、-v目錄掛載、–name指定名稱、-e設(shè)置環(huán)境變量進(jìn)行配置;5. 容器停止后數(shù)據(jù)不會丟失,但若刪除容器則數(shù)據(jù)可能丟失,可通過-v掛載宿主機(jī)目錄實現(xiàn)數(shù)據(jù)持久化保存。
docker鏡像和容器的區(qū)別其實可以簡單理解成“藍(lán)圖”和“房子”的關(guān)系。鏡像是一個靜態(tài)的模板,包含了運行某個應(yīng)用所需的所有文件、依賴和配置;而容器則是根據(jù)這個鏡像實際運行起來的一個實例,是真正跑起來的程序。
你可以把鏡像想象成一個封裝好的系統(tǒng)快照,它本身不會變化,也不會占用運行資源。只有當(dāng)你用docker run命令啟動它時,才會生成一個容器,這個容器才是你真正操作的對象。
鏡像 vs 容器:它們到底差在哪?
鏡像(Image) 是只讀的,比如你從 Docker Hub 拉下來的 Ubuntu、nginx 這些,都是鏡像。它們是構(gòu)建容器的基礎(chǔ)。你可以把它理解為一個打包好的軟件安裝包。
容器(Container) 是可讀寫的,并且在運行狀態(tài)中。它是由鏡像創(chuàng)建出來的具體實例。比如你運行了一個 nginx 鏡像,就生成了一個 nginx 容器,你可以進(jìn)到這個容器里執(zhí)行命令、修改配置、查看日志等。
舉個例子:
- 你寫了個 Python 應(yīng)用,打成了一個鏡像叫 myapp:latest。這個鏡像無論傳給誰,內(nèi)容都是一樣的。
- 別人拿到這個鏡像后,用 docker run 啟動,就會得到一個屬于他自己的容器,他在里面做的修改不會影響原始鏡像。
docker run 命令怎么用?常見參數(shù)有哪些?
docker run 是用來從鏡像創(chuàng)建并啟動容器的核心命令。基本格式是:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
幾個常用參數(shù)說明一下:
- -d:后臺運行容器。如果你不加這個,容器會占據(jù)當(dāng)前終端窗口。
- -p:端口映射。比如 -p 8080:80 表示把宿主機(jī)的 8080 端口映射到容器的 80 端口。
- -v:掛載目錄。例如 -v /host/data:/container/data,這樣容器里的數(shù)據(jù)會直接使用宿主機(jī)上的文件。
- –name:給容器起個名字,方便后續(xù)管理。比如 –name mynginx。
- -e:設(shè)置環(huán)境變量,比如 -e mysql_ROOT_PASSWORD=123456。
舉個簡單的例子:
docker run -d -p 80:80 --name mynginx nginx
這條命令的意思就是:以后臺方式運行一個基于 nginx 鏡像的容器,把宿主機(jī)的 80 端口映射到容器的 80 端口,并給這個容器命名為 mynginx。
容器停止后,數(shù)據(jù)會不會丟?
這個問題很常見。默認(rèn)情況下,容器停止后,你在容器里做的修改還是存在的,只要容器沒有被刪除。但如果你運行完就刪了容器(比如用了 –rm 參數(shù)),那數(shù)據(jù)就沒了。
如果你希望數(shù)據(jù)持久化保存,可以用 -v 把宿主機(jī)的一個目錄掛載到容器里,這樣即使容器刪了,數(shù)據(jù)還在宿主機(jī)上。
比如運行 MySQL 容器時,通常都會把數(shù)據(jù)目錄掛載出來:
docker run -d --name mysql -v /mydata/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
這樣就算容器出問題或者重建了,數(shù)據(jù)還在 /mydata/mysql 里。
基本上就這些。鏡像和容器的關(guān)系搞清楚之后,再配合 run 的各種參數(shù),就能靈活地管理你的應(yīng)用了。剛上手的時候可能會覺得概念多,但用幾次就自然明白了。