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