所以,我們昨天做了什麼事,只下了一個指令,就可以把整個網站內容下載下來,並且開啟通訊埠接收服務?
首先,先來讓我們看看我們下的指令代表什麼意思呢?
docker run -d -p 80:80 docker/getting-started
把整個命令合起來,整個命令就是:讓Docker 把位於 docker/getting-started 的 Container Image 抓取下來,以分離的模式執行並且將宿主 os 的 80 埠轉發至容器的 80 埠
再來讓我們看看昨天下完指令後,在終端機跑出來的內容
一開始,因為先前沒有執行過 getting-started 這個 container,因此顯示 unable to find image locally
,接著會自動從 Docker 的儲存庫下載這個 Container 的映像內容;docker/getting-started,代表從docker 這個人的儲存庫抓取名為 Getting-started 這個 Container 。
Docker 的儲存庫名字叫做 Docker Hub ,其運作模式可以以GitHub或GitLab理解,之後也會講解怎麼把自己做的Image 內容推上 Docker hub.
Docker 的 Container Image 包含了執行環境的一切資訊,包含相依套件 Dependencies 、設定檔Configurations,當我們把 Image 抓下來的時候,就可以直接利用 image 內部的資源執行容器,類似把一個環境直接建好。
因此,當我們將 image 拉(pull)完之後,相關的檔案包含網站內容、nginx設定資訊等等,都被一起下載到本機端,隨後被 Docker 啟動的 container,自然而然就包含以上資訊了,詳情可以先去看看getting-started這個映像的Dockerfile檔,Github
圖片來源:Docker overview | Docker Documentation
有了基本認知之後,就來套用專有名詞吧!
Docker 是 client-server 的架構,首先來講講 daemon
,或 dockerd
或docker engine
,也就是 Docker 在本機端的 server 部分,他負責 containers 的建置 (building) 、執行 (running) 和分配資源 (distributing),並接收來自 CLI
或 Docker API
的請求 (利用 REST API、UNIX socket或其他網路介面)。
假設今天使用者利用 CLI 下了 docker run -i -t ubuntu /bin/bash
這個指令,如果本機端還沒有 ubuntu 的 image,docker 會向 docker registry
抓取 ubuntu的映像;此步驟等同於 docker pull ubuntu
,
映像抓取完成之後,docker 會自動建立容器(或可以用手動指令docker container create
),並在容器中建立檔案系統 file system,以供後續的操作使用,
file system建立完之後,docker 會接著建立一個網路介面,因為我們有用 -t
和 -i
兩個參數,分別代表 terminal
和 interactively
,故docker 會接上 (Host OS的) 終端機,並可用鍵盤和
container 內的 bash 做互動。
打了那麼多,但好像還沒講到 Container 和 Image這兩個部分:
Container 為一個可執行的Image檔實體 (runnable image instance),可藉由 Docker CLI 或Docker API 去啟動、停止、移動或刪除容器,也可以連接儲存空間 (docker volume)進行資料的永久儲存
Image,他是 docker 中建立 container的唯讀樣板文件,而樣板文件的建置必須依賴Dockerfile的內容,因此透過Dockerfile的編寫,就可以控制Container的建置。
今天這篇文寫了docker run這個指令下了之後,背後做了什麼事,以及 Docker 的一些架構知識,下一篇文,將會進入Docker 的核心,也就是Image樣板檔案--Dockerfile 的內容。