先簡單理解 docker 的使用過程犀呼,它分為鏡像構(gòu)建與容器啟動魄眉。
鏡像構(gòu)建:即創(chuàng)建一個鏡像晰奖,它包含安裝運行所需的環(huán)境、程序代碼等致盟。這個創(chuàng)建過程就是使用 dockerfile 來完成的碎税。
容器啟動:容器最終運行起來是通過拉取構(gòu)建好的鏡像,通過一系列運行指令(如端口映射馏锡、外部數(shù)據(jù)掛載雷蹂、環(huán)境變量等)來啟動服務(wù)的。針對單個容器杯道,這可以通過 docker run 來運行匪煌。
而如果涉及多個容器的運行(如服務(wù)編排)就可以通過 docker-compose 來實現(xiàn),它可以輕松的將多個容器作為 service 來運行(當(dāng)然也可僅運行其中的某個),并且提供了 scale (服務(wù)擴(kuò)容) 的功能萎庭。
簡單總結(jié):
1.dockerfile: 構(gòu)建鏡像霜医;
2.docker run: 啟動容器;
3.docker-compose: 啟動服務(wù)驳规;
從頭說起肴敛。
假如你不用 docker ,搭建 wordpress 怎么弄吗购?先找臺 server 医男,假設(shè)其 OS 為 Ubuntu ,然后按照文檔一步步敲命令捻勉,寫配置镀梭,對吧?
用 docker 呢踱启? 隨便找臺 server 报账,不管什么操作系統(tǒng),只要支持 docker 就行禽捆, docker run ubuntu, docker 會從官方源里拉取最新的 Ubuntu 鏡像笙什,可以認(rèn)為你開了個 Ubuntu 虛擬機,然后一步步安裝胚想,跟上面一樣。
但是這樣安裝有個顯著的缺點芽隆,一旦 container 被刪浊服,你做的工作就都沒了。當(dāng)然可以用 docker commit 來保存成鏡像胚吁,這樣就可以復(fù)用了牙躺。
但是鏡像一般比較大,而且只分享鏡像的話腕扶,別人也不知道你這鏡像到底包含什么孽拷,這些問題都不利于分享和復(fù)用。
一個直觀的解決方案就是半抱,寫個腳本把安裝過程全部記錄下來脓恕,這樣再次安裝的時候,執(zhí)行腳本就行了窿侈。 Dockerfile 就是這樣的腳本炼幔,它記錄了一個鏡像的制作過程。
有了 Dockerfile, 只要執(zhí)行 docker build . 就能制作鏡像史简,而且 Dockerfile 就是文本文件乃秀,修改也很方便。
現(xiàn)在有了 wordpress 的鏡像,只需要 docker run 就把 wordpress 啟動起來了跺讯。
如果僅僅是 wordpress, 這也就夠了枢贿。但是很多時候,需要多個鏡像合作才能啟動一個服務(wù)刀脏,比如前端要有 nginx 萨咕, 數(shù)據(jù)庫 mysql, 郵件服務(wù)等等,當(dāng)然你可以把所有這些都弄到一個鏡像里去火本,但這樣做就無法復(fù)用了危队。
更常見的是, nginx, mysql, smtp 都分別是個鏡像,然后這些鏡像合作钙畔,共同服務(wù)一個項目茫陆。
docker-compose 就是解決這個問題的。你的項目需要哪些鏡像擎析,每個鏡像怎么配置簿盅,要掛載哪些 volume, 等等信息都包含在 docker-compose.yml 里。
要啟動服務(wù)揍魂,只需要 docker-compose up 就行桨醋,停止也只需要 docker-compse stop/down
簡而言之, Dockerfile 記錄單個鏡像的構(gòu)建過程现斋, docker-compse.yml 記錄一個項目(project, 一般是多個鏡像)的構(gòu)建過程喜最。
你說有些教程用了 dockerfile+docker-compose, 是因為 docker-compose.yml 本身沒有鏡像構(gòu)建的信息,如果鏡像是從 docker registry 拉取下來的庄蹋,那么 Dockerfile 就不需要瞬内;如果鏡像是需要 build 的,那就需要提供 Dockerfile.
docker-compose是編排容器的限书。例如虫蝶,你有一個php鏡像,一個mysql鏡像倦西,一個nginx鏡像能真。如果沒有docker-compose,那么每次啟動的時候扰柠,你需要敲各個容器的啟動參數(shù)粉铐,環(huán)境變量,容器命名耻矮,指定不同容器的鏈接參數(shù)等等一系列的操作驹吮,相當(dāng)繁瑣试躏。而用了docker-composer之后夜赵,你就可以把這些命令一次性寫在docker-composer.yml文件中,以后每次啟動這一整個環(huán)境(含3個容器)的時候倡缠,你只要敲一個docker-composer up命令就ok了。
dockerfile的作用是從無到有的構(gòu)建鏡像茎活。它包含安裝運行所需的環(huán)境昙沦、程序代碼等。這個創(chuàng)建過程就是使用 dockerfile 來完成的载荔。Dockerfile - 為 docker build 命令準(zhǔn)備的盾饮,用于建立一個獨立的 image ,在 docker-compose 里也可以用來實時 build
docker-compose.yml - 為 docker-compose 準(zhǔn)備的腳本懒熙,可以同時管理多個 container 丘损,包括他們之間的關(guān)系、用官方 image 還是自己 build 工扎、各種網(wǎng)絡(luò)端口定義徘钥、儲存空間定義等