1. 程式人生 > >dockerfile 與 docker-compose的關係

dockerfile 與 docker-compose的關係

先簡單理解 docker 的使用過程,它分為映象構建與容器啟動。

映象構建:即建立一個映象,它包含安裝執行所需的環境、程式程式碼等。這個建立過程就是使用 dockerfile 來完成的。

容器啟動:容器最終執行起來是通過拉取構建好的映象,通過一系列執行指令(如埠對映、外部資料掛載、環境變數等)來啟動服務的。針對單個容器,這可以通過 docker run 來執行。

而如果涉及多個容器的執行(如服務編排)就可以通過 docker-compose 來實現,它可以輕鬆的將多個容器作為 service 來執行(當然也可僅執行其中的某個),並且提供了 scale (服務擴容) 的功能。

簡單總結:

1.dockerfile: 構建映象;

2.docker run: 啟動容器;

3.docker-compose: 啟動服務;

從頭說起。 假如你不用 docker ,搭建 wordpress 怎麼弄?先找臺 server ,假設其 OS 為 Ubuntu ,然後按照文件一步步敲命令,寫配置,對吧? 用 docker 呢? 隨便找臺 server ,不管什麼作業系統,只要支援 docker 就行, docker run ubuntu, docker 會從官方源里拉取最新的 Ubuntu 映象,可以認為你開了個 Ubuntu 虛擬機器,然後一步步安裝,跟上面一樣。

但是這樣安裝有個顯著的缺點,一旦 container 被刪,你做的工作就都沒了。當然可以用 docker commit 來儲存成映象,這樣就可以複用了。

但是映象一般比較大,而且只分享映象的話,別人也不知道你這映象到底包含什麼,這些問題都不利於分享和複用。 一個直觀的解決方案就是,寫個指令碼把安裝過程全部記錄下來,這樣再次安裝的時候,執行指令碼就行了。 Dockerfile 就是這樣的指令碼,它記錄了一個映象的製作過程。 有了 Dockerfile, 只要執行 docker build . 就能製作映象,而且 Dockerfile 就是文字檔案,修改也很方便。

現在有了 wordpress 的映象,只需要 docker run 就把 wordpress 啟動起來了。

如果僅僅是 wordpress, 這也就夠了。但是很多時候,需要多個映象合作才能啟動一個服務,比如前端要有 nginx , 資料庫 mysql, 郵件服務等等,當然你可以把所有這些都弄到一個映象裡去,但這樣做就無法複用了。 更常見的是, nginx, mysql, smtp 都分別是個映象,然後這些映象合作,共同服務一個專案。 docker-compose 就是解決這個問題的。你的專案需要哪些映象,每個映象怎麼配置,要掛載哪些 volume, 等等資訊都包含在 docker-compose.yml 裡。 要啟動服務,只需要 docker-compose up 就行,停止也只需要 docker-compse stop/down

簡而言之, Dockerfile 記錄單個映象的構建過程, docker-compse.yml 記錄一個專案(project, 一般是多個映象)的構建過程。

你說有些教程用了 dockerfile+docker-compose, 是因為 docker-compose.yml 本身沒有映象構建的資訊,如果映象是從 docker registry 拉取下來的,那麼 Dockerfile 就不需要;如果映象是需要 build 的,那就需要提供 Dockerfile.

docker-compose是編排容器的。例如,你有一個php映象,一個mysql映象,一個nginx映象。如果沒有docker-compose,那麼每次啟動的時候,你需要敲各個容器的啟動引數,環境變數,容器命名,指定不同容器的連結引數等等一系列的操作,相當繁瑣。而用了docker-composer之後,你就可以把這些命令一次性寫在docker-composer.yml檔案中,以後每次啟動這一整個環境(含3個容器)的時候,你只要敲一個docker-composer up命令就ok了。

dockerfile的作用是從無到有的構建映象。它包含安裝執行所需的環境、程式程式碼等。這個建立過程就是使用 dockerfile 來完成的。Dockerfile - 為 docker build 命令準備的,用於建立一個獨立的 image ,在 docker-compose 裡也可以用來實時 build docker-compose.yml - 為 docker-compose 準備的指令碼,可以同時管理多個 container ,包括他們之間的關係、用官方 image 還是自己 build 、各種網路埠定義、儲存空間定義等