Docker 與容器是什麼? 為什麼需要? 如何快速開始使用?
2026年8月13日
先前有讀者在內容許願中提到 E+ 中似乎沒有關於 Docker 與容器 (container) 相關的內容,對此我們接下來會陸續有一系列的文章,從 Docker 與容器的基本介紹,到實戰的運用。
在開頭的第一篇文章中,我們會先介紹 Docker 與容器到底是什麼? 為什麼現在有那麼多專案都會用? 具體來說 Docker 與容器解決了什麼問題? 此外,我們也會透過一個最簡單的案例,讓過去還沒接觸過 Docker 的人能快速開始。
Docker 與容器是什麼? 為什麼要用 Docker?
相信多數人聽過 Docker 是一套用來建置與執行容器化應用程式的平台與工具,不過容器究竟是什麼? 事實上,容器這個概念與實體世界中會看到的貨櫃很相似,都是像箱子一樣 (在英文上,貨櫃的英文跟容器的英文都是 container,所以很常看到實體貨櫃會出現在 Docker 相關的圖上)。但不同的地方在於,在軟體世界的容器,是裝著應用程式。
在這個箱子中,應用程式會有一套相對獨立的執行環境,包含主機名稱、IP 位址、磁碟機等等。不過這些其實都是由 Docker 創建出來的虛擬資源;透過 Docker 的管理,這些資源能夠被組合成一個讓應用程式得以被執行的環境。

在一台電腦中,多個容器會使用同一個 CPU 與記憶體等硬體資源,並共享底層的作業系統核心。不過,每個容器仍有自己的程序、檔案系統與網路環境,因此容器中的應用程式可以彼此隔離。

Docker 解決了什麼問題?
在看完上面 Docker 實際做的事情後,可能還沒辦法很直觀感受到其價值所在,或者 Docker 這項技術解決了什麼問題,讓我們在這個段落進一步說明。
在上面對於 Docker 的介紹中,有提到容器提供一個讓應用程式得以被執行的環境,這邊的環境是個關鍵。在做軟體開發時,寫程式只是其中一環,要讓程式碼跑起來,會需要有相對應的執行環境。由於使用的機器、安裝套件的版本,以及各種因素的不同,很可能某個專案能在你同事用的電腦跑起來,但是在你的電腦上跑不起來。
過去在沒有使用 Docker 的狀況下,有些人入職新團隊後,光是要讓專案能夠跑起來,就得花很多時間。在安裝環境時遇到問題,去找同事協助解決時,很常會聽到類似以下的話「這個專案的 Node.js 版本要 18,但你裝到 Node.js 22 所以跑不起來」,或是「這個的 Postgres 版本不同,才導致行為的不一致」。
透過容器,我們能把一個應用程式需要的執行環境包起來,讓它可以用相對一致的方式,在不同機器上跑。因此,在使用 Docker 的狀況下,當團隊有新成員加入,要建置、部署、管理專案時,不管用哪一台機器,機器裡的某個依賴是哪個版本,只要透過 Docker,新成員抓下原始碼後,執行一個指令,就能在本機把所有東西建置並跑起來,從此不再擔心要花很多時間建置環境 (備註:前提是團隊已經妥善準備好 Dockerfile、Compose 設定與必要的初始化流程,這些概念我們在後面的文章會談)。
因為這個特性,讓現代的應用程式,可以很輕易地跑在雲端、跑在資料中心,甚至是無伺服器函式 (serverless function) 中。不管應用背後選擇什麼架構或技術棧,都能夠透過 Docker 來建置、部署與管理。
為什麼 Docker 出現前的解決方案會被 Docker 取代?
Docker 容器創建出的執行環境,讓多個應用程式即使背後用的依賴版本不同,也不會有衝突、能同時運行,不會因為兩個應用程式用的 Node.js 版本不同,就無法和平共處。這件事在 Docker 出現前,業界其實已經有技術在解決了。
在 Docker 之前比較廣泛被使用的方法,是透過虛擬機器 (VM)。在概念上,虛擬機器跟容器其實很類似,都是提供一個箱子,讓應用程式能在裡頭執行。不過兩者的差異在於,虛擬機器的箱子中包含作業系統,所以兩個虛擬機器彼此不會共享主機的作業系統。

由於一套作業系統可能就會佔用好幾 GB 的記憶體,也會消耗大量 CPU 時間,不共享作業系統就代表原本能給應用程式使用的資源,被作業系統占據。這就導致同樣的資源,在使用虛擬機器的狀況下,能同時跑的應用程式數量下降。
對比之下,同樣提供隔離環境,由於 Docker 容器會共享執行容器的機器上的作業系統,所以容器本身相對輕量。給定同樣的硬體,能夠執行的應用系統,會比用虛擬機器多不少。
從一個最簡單的案例開始用 Docker
如果要在本機當中使用 Docker,最簡單的方式是先安裝 Docker Desktop,或是社群中的替代方案。以我們自己的經驗來說,因為是使用 Mac,OrbStack 這個替代方案,會是很不錯的選擇;除了更輕量更快、多數平常需要用到的功能都有涵蓋外,個人版使用還是免費的。
在下載並安裝完 Docker Desktop 或替代方案後,接著可以在終端機中輸入
docker --version
接著就會看到類似下面的這一段
Docker version xx.x.x, build xxxxx
要測試看看能跑起 Docker,可以在終端機用以下指令
docker run hello-world
這時如果是第一次用 Docker,可能會看到這個訊息
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
下載完成後就會看到類似以下的訊息
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
最後我們可以執行 docker container ls --all,就會看到類似下方的訊息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
XXXXXXXXXXXX hello-world "/hello" 3 seconds ago Exited (0) 2 seconds ago goofy_ride
回顧一下剛剛做了什麼
在上述的流程中,我們執行了 docker run hello-world 這個指令。我們可以把這個指令拆成三個部分來看。第一個是 docker 是 Docker 的命令列工具,也就是在終端機裡用來跟 Docker 溝通的入口,未來如果要請 Docker 做任何事,都可以用這個開頭。
第二個是 run。run 會「建立並啟動一個容器」。換句話說,這個指令不只是執行而已,如果本機沒有需要的映像檔 (image),就會先下載 (所以會看到 Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 這一段);接著根據映像檔建立一個新的容器;最後啟動這個容器裡面預設要執行的程式。
而第三個 hello-world 則是映像檔 (image) 的名稱。映像檔是在 Docker 中最重要的概念之一。我們可以把映像檔理解成「容器的模板」,裡面可能包含作業系統的基本檔案 (但不包含獨立作業系統核心)、程式語言環境、系統套件、應用程式程式碼,以及預設要執行的命令。Docker 會根據這個模板,建立出一個可以執行的容器。
在實際執行完後,我們就會看到 Hello from Docker! This message shows that your installation appears to be working correctly. 開頭的輸出,這就代表你的 Docker 安裝看起來可以正常運作。
在往下的訊息可以看到背後 Docker 完成的幾件事情
- 第一步是
The Docker client contacted the Docker daemon.,也就是 Docker 的客戶端 (docker這個命令列工具),會聯繫 Docker 背後真正負責做事的常駐程式 (daemon)。 - 第二步是
The Docker daemon pulled the "hello-world" image from the Docker Hub,也就是 Docker 的常駐程式會去 Docker Hub 抓取hello-world這個映像檔。Docker Hub 是 Docker 官方提供的容器映像檔登錄服務,定位類似於 Docker 世界裡的套件中心 (就像 npm registry 之於 Node、RubyGems 之於 Ruby、crates.io 之於 Rust 的角色),在 Docker Hub 中有許多別人上傳的映像檔,可以抓取下來使用。 - 第三步是
The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.,這邊就是前面有提到的,Docker 會根據映像檔來創建容器。 - 最後一步是
The Docker daemon streamed that output to the Docker client, which sent it to your terminal.。Docker 會把容器產生的輸出結果,透過串流的方式傳給 Docker 的客戶端。
要理解最後一步,會需要先認識 Docker CLI 與 Docker daemon 這兩個元件。Docker daemon(dockerd)是在背景執行的常駐程序,負責建立和管理映像檔、容器、網路等等。Docker CLI(docker)則是使用者操作的命令列工具,它會透過 Docker API,把 docker run 等指令傳送給 daemon 執行。
(備註:大家平常可能常聽到的 Docker 引擎 (Docker Engine) 是包含 Docker daemon、Docker API 與 Docker CLI 的統稱)。
映像檔與容器的關係
在上面我們有提到映像檔 (image) 這個概念,由於在 Docker 中,映像檔與容器是最重要的概念,因此在這篇文章最後,我們會進一步討論之間的關係。
前面提到可以把映像檔理解成容器的模板;反過來說,容器則可以理解成從映像檔跑起來的實例。如果要比喻,映像檔像蛋糕模具,容器就是真的烤出來的蛋糕。我們可以用同一個映像檔跑出很多個容器。
如果今天想要跑一個有 Node.js 20 版本的執行環境,我們可以用 docker run node:20 這個指令。如果在終端機輸入這個指令,Docker 就會去下載 node:20 的映像檔,並啟動該容器。
因此舉例來說,大家可以在終端機中輸入
docker run -it node:20
就能夠在終端機開啟一個 Node.js 20 版本的執行環境,然後就能直接在終端機使用 Node.js。例如下面這個截圖,在輸入完 docker run -it node:20 後,會得到 Welcome to Node.js v20.20.2,接著就能在終端機寫 JavaScript 程式。
!CleanShot 2026-06-20 at [email protected]
這邊我們加上了 -it ,對 node 這個官方映像檔來說,如果今天沒有加上 -it,容器會啟動一下後就馬上結束。因為如果沒有一個可以互動的終端機環境,從容器的角度來看就會覺得「沒有輸入、也不是互動模式,那我沒事做」於是就會結束 (備註:這並不代表所有容器都必須加上 -it。例如執行網站伺服器或資料庫的容器,只要主要程序仍在運作,容器就會繼續執行)。
這個 -it 是由以下兩個參數組合而成
i是 interactive,意思是保持標準輸入開啟,讓使用者可以跟容器互動。換句話說,如果想要在容器裡輸入東西,就需要加上這個參數。t是 tty,意思是配置一個 pseudo-TTY。可以理解成讓這個容器裡的命令列環境比較像正常終端機,可以顯示提示字元、支援互動操作。
所以 docker run -it node:20 會等同於 docker run --interactive --tty node:20。
前面談到,映像檔像是模板,可以用映像檔建立多個同樣環境的容器。所以假如開啟多個終端機,每個都輸入 docker run -it node:20,就能夠在本機起多個彼此獨立的 Node.js 20 版執行環境。
進一步說,我們可以開一個終端機分頁輸入 docker run -it node:20 ,然後另一個終端機分頁輸入 docker run -it node:18,然後第三個終端機分頁輸入 docker run -it node:22,就能在本機起三個不同版本的 Node.js 執行環境,彼此獨立不會互相干擾。
還記得最開頭提到,過去很多工程團隊有新成員加入,在安裝開發環境時會遇到版本問題,所以導致環境裝不好,或者遇到衝突。但透過 Docker 起不同的容器,即使本機是 Node.js 18 版,也完全不用擔心專案要求 Node.js 20 版會有衝突的問題。
總結
在這篇文章我們初步介紹了為什麼需要 Docker,以及用一個最簡單的 hello-world 案例,介紹了如何在本機中使用 Docker,也了解了包含映像檔、容器等不同概念彼此之間的關係。
上面有提到假如跑 docker run node:20,Docker 引擎會去 Docker Hub 這個官方提供的公開映像檔倉庫抓取對應的映像檔。但 Docker 的映像檔不只是存在於 Docker Hub,假如自己想要客製化某個開發環境,也可以自己建置映像檔。在這個系列的下一篇文章,我們將會接著討論如何做這件事。
加入 E+ 會員方案
如果你覺得這篇分享有幫助,想閱讀更深入的內容,歡迎加入 E+ 會員。除了有會員專屬的深度文與影片,探討前後端開發、AI 工程、職涯發展,同時有 Discord 社群一同交流與成長。
許多 E+ 會員透過所任職公司的教育訓練補助 (E+ 會開立有統編的發票),不用花自己的錢,也能每週透過深度主題文與社群交流,拓展技術視野、加速職涯成長。