Website logo

Robert Chang

技術部落格

Docker - 啟動時做了些什麼?

過程解析

$ docker container run --publish 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
...

這邊第一行顯示出了 Docker 在本地端找不到 nginx:latest 這個映像檔,所以從 library/nginx 這邊拉了 nginx:latest 這個映像檔。

也就是從預設的映像檔儲存庫 ( DockerHub ) 中拉出了這個映像檔到本地端。

如果你本身也使用過 Git 這個工具,應該對於這個動作不感到陌生,只是這邊的儲存庫預設是 DockerHub 的 nginx 倉庫,所以你不需要指定從哪裡取得映像檔。

最基本的運作流程如下圖:

docker-container-running-flow

但上述的啟動流程並不包含了 --publish 80:80 這個部份,所以我們再把圖片變得更細節一些:

docker-container-complex-running-flow

讓我們再用文字搭配圖片敘述一次流程,解釋清楚發生了什麼事情:

圖片中的第一步:

會先確認本地端是否有指令中指定的映像檔,若是存在直接跳至第三步根據指令啟動容器;若是不存在,則是移動至第二步。

圖片中的第二步:

從預設的映像檔儲存庫中下載指令中指定的映像檔至本地端。

圖片中的第三步:

根據指令中的映像檔啟動容器。

圖片中的第四步:

根據指令中的額外參數加入設定。

但在真實的運作流程中,第三步以及第四步會是結合再一起啟動的,並不會分開執行,只是為了讓新手們更好理解整個容器啟動的流程才會這樣繪製圖片。

接著我們回到終端機的畫面,會發現其像是靜止一樣:

2022/08/08 06:56:32 [notice] 1#1: getrlimit(RLIMI....
2022/08/08 06:56:32 [notice] 1#1: start worker processes
2022/08/08 06:56:32 [notice] 1#1: start worker process 31
2022/08/08 06:56:32 [notice] 1#1: start worker process 32
2022/08/08 06:56:32 [notice] 1#1: start worker process 33
172.17.0.1 - - [08/Aug/2022:06:56:41 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" "-"

這是因為 nginx 的執行程序正在執行中,這時候我們只要按下 Ctrl + C 就會終止這個 nginx 的執行程序,在他停下來的那一刻,你的終端機又會回歸到正常的等待輸入的畫面。

結語

今天搭配了一些簡單的圖片來解釋從無到有啟動一個容器的過程,中間其實還有很多的細節,但礙於篇幅的關係,就用比較簡單地方式來讓大家理解!

明天將會介紹除了啟動容器之外的指令是什麼樣的效果,感謝大家收看。

上一篇文章Docker - 啟動 Container

下一篇文章Docker - Container 的相關指令 ( 上 )