Docker 入門教學|Image、Container、Dockerfile 與網站部署實戰

Docker 入門教學|Image、Container、Dockerfile 與網站部署實戰

Docker 入門是學習現代網站部署、DevOps 與容器化架構的重要起點。 Docker 可以將應用程式、相依套件與部分執行環境設定封裝在 Image 中,再由 Image 建立 Container,讓開發、測試與正式環境更容易維持一致。

對 Linux Server 管理員而言,Docker 特別適合部署 Nginx、Apache、PHP、MySQL、Redis 以及其他網站服務。 不過 Docker 並不是單純「把程式放進盒子裡」這麼簡單,還涉及 Image、Container、Volume、Network、Port 與 Dockerfile 等重要概念。

先記住四個核心概念: Image 是模板、Container 是執行中的實例、Dockerfile 是建立 Image 的規則、Registry 是儲存與分享 Image 的地方。

Docker 入門與核心概念

Docker 是一套容器化平台。與傳統虛擬機器不同,Container 不需要為每個應用程式建立完整的 Guest Operating System,而是與 Host 共用主機的 Kernel。 因此 Container 通常具有啟動速度快、部署方便與資源使用方式較輕量等特性。

需要注意的是,Container 並不是完全獨立的虛擬機器。 Docker 提供的是程序層級的隔離環境,因此 Host Kernel、本身的權限設定、Network 與 Storage 設定仍然非常重要。

Image、Container、Dockerfile 與 Registry

項目 說明
Image 建立 Container 的唯讀模板,包含應用程式與相關檔案
Container 由 Image 建立並執行的實例
Dockerfile 描述如何建構 Docker Image 的設定檔
Registry 儲存與分享 Docker Image 的服務,例如 Docker Hub 或私有 Registry
Volume 提供較持久的資料儲存方式,常用於資料庫或需要保留的應用程式資料
Network 控制 Container 之間以及 Container 與外部網路的通訊

Image 是什麼?

Image 可以理解成建立 Container 的模板。 例如使用 Nginx Image,就可以建立一個或多個 Nginx Container。 同一個 Image 可以建立多個不同的 Container 實例。

Container 是什麼?

Container 是 Image 的執行實例。 它可以啟動、停止、重新啟動或刪除。 Container 本身通常不應被當作永久資料儲存位置,需要保存的重要資料應使用 Volume 或主機掛載。

Dockerfile 是什麼?

Dockerfile 是一個文字檔,用來描述如何一步一步建立 Image。 例如可以指定基礎 Image、安裝套件、複製程式碼,以及設定 Container 啟動時要執行的指令。

Registry 是什麼?

Registry 是用來儲存與分享 Container Image 的地方。 Docker Hub 是常見的公開 Registry,也可以在企業內部架設 Private Registry。

Docker 常用基本指令

剛開始學 Docker,先掌握以下幾個基本指令,就能完成最基本的 Image 與 Container 管理。

查看 Docker 版本

docker version

下載 Image

docker pull nginx:latest

建議在正式環境使用明確的版本 Tag,而不要完全依賴 latest。 這樣可以避免未來 Image 更新後,部署結果與之前不同。

查看本機 Image

docker image ls

啟動 Container

docker run -d --name web -p 8080:80 nginx:latest

這裡的:

  • -d:以背景模式執行
  • --name web:指定 Container 名稱
  • -p 8080:80:將 Host Port 8080 映射到 Container Port 80
  • nginx:latest:指定使用的 Image

查看執行中的 Container

docker ps

查看所有 Container

docker ps -a

停止 Container

docker stop web

啟動已停止的 Container

docker start web

查看 Container Log

docker logs web

刪除 Container

docker rm web

如果 Container 正在執行,通常應先停止,再進行刪除。

傳統部署與 Docker 差異

傳統 Linux 網站部署通常直接在 Host 作業系統中安裝 Apache、Nginx、PHP、MySQL 等服務。 Docker 則將不同應用程式拆分成 Container,讓應用程式環境更加容易重建與移動。

比較項目 傳統部署 Docker 部署
環境管理 直接安裝在 Host 使用 Image 與 Container
版本管理 較依賴 Host 套件 可透過 Image Tag 管理版本
環境重建 需要重新安裝與設定 可依 Dockerfile 重新建立 Image
部署速度 通常需要較多手動步驟 建立 Image 後可快速啟動 Container
隔離方式 服務直接運行在 Host 應用程式可分別運行於不同 Container

Docker 的主要優勢不是「一定比較安全」,而是環境一致性、部署便利性、可重建性與服務隔離。 實際安全性仍取決於 Image 來源、Container 權限、Network、防火牆以及 Host 作業系統的安全設定。

使用 Nginx 實際部署網站

下面使用 Nginx 做最簡單的 Docker 部署範例。

第一步:下載 Image

docker pull nginx:latest

第二步:建立 Container

docker run -d \
  --name web \
  -p 8080:80 \
  nginx:latest

第三步:確認 Container

docker ps

第四步:測試網站

在瀏覽器輸入:

http://伺服器IP:8080

如果 Nginx Container 正常運作,就可以看到 Nginx 預設頁面。

第五步:查看 Log

docker logs web

如果網站無法正常啟動,可以先從 Container 狀態與 Log 開始排查。

Docker Port、Volume 與 Network

Port

Docker Container 裡的服務 Port 與 Host Port 是不同概念。

docker run -d -p 8080:80 nginx:latest

代表:

位置Port
Host8080
Container80

因此使用者存取 Host 的 8080 Port,Docker 才會把連線轉送到 Container 的 80 Port。

Volume

Container 本身可以刪除與重建,因此需要長期保存的資料通常應該使用 Volume。 例如 MySQL、PostgreSQL 或其他資料庫,不能單純依靠 Container 本身保存正式資料。

docker volume create mysql_data

docker volume ls

Network

如果網站由 Nginx、PHP、MySQL、Redis 等多個 Container 組成,可以使用 Docker Network 讓 Container 互相通訊。

docker network create app_net

docker network ls

例如將 Container 加入同一個 Network:

docker run -d --name web --network app_net nginx:latest

正式網站通常還會使用 Docker Compose 管理多個服務,使 Web、PHP、Database 與其他元件能一起部署與管理。

Dockerfile 基礎教學

如果只使用 Docker Hub 上的現成 Image,可以使用 docker pull。 但如果網站有自己的程式碼與環境,就應該建立 Dockerfile。

簡單 Dockerfile

FROM nginx:latest

COPY ./website /usr/share/nginx/html

建立好 Dockerfile 後,可以使用:

docker build -t my-website:1.0 .

查看 Image:

docker image ls

再使用自訂 Image 建立 Container:

docker run -d \
  --name my_web \
  -p 8080:80 \
  my-website:1.0

在正式環境中,建議使用明確的 Image Tag,例如 1.0,方便知道目前部署的是哪一個版本。

Docker 新手常見錯誤

Container 啟動後立即停止

docker ps -a
docker logs my_container

先確認程式為什麼退出,而不是一直重新建立 Container。

Port 已被使用

sudo ss -lntp | grep :8080

確認是哪個服務正在使用 Host Port,再決定釋放 Port 或改用其他 Port。

Docker 磁碟空間不足

df -h
docker system df

先確認 Image、Container、Build Cache 與 Volume 的使用量,再決定清理哪些資源。 不要在沒有確認資料的情況下直接刪除 Volume。

Container 無法連線外部網站

可以先從 Container 內部確認 DNS 與 Network:

docker exec -it my_container cat /etc/resolv.conf
docker network inspect bridge

FAQ 常見問題

Docker 是什麼?

Docker 是容器化平台,可以將應用程式與所需環境封裝成 Image,再透過 Image 建立 Container,方便部署、測試與管理。

Docker Container 和虛擬機器有什麼差別?

Container 通常與 Host 共用 Linux Kernel,而虛擬機器通常包含自己的 Guest Operating System。因此 Container 一般可以較快速啟動,但兩者的隔離方式與使用情境不同。

Docker Image 和 Container 差在哪?

Image 是建立 Container 的模板,Container 是 Image 的執行實例。同一個 Image 可以建立多個 Container。

Docker 適合網站部署嗎?

適合。Docker 常用於網站、API、資料庫、背景服務與開發測試環境。不過正式環境仍需要妥善處理 Volume、Backup、Network、Security 與監控。

docker pull nginx 和 docker pull nginx:latest 一樣嗎?

當未指定 Tag 時,Docker 通常會使用預設的 latest Tag。正式環境建議使用明確的版本或經過測試的 Image Tag,以提高部署的可重現性。

Docker 會比傳統安裝更安全嗎?

不能單純這樣判斷。Docker 可以提供程序與環境隔離,但安全性仍取決於 Image、Container 權限、Network、Host 系統與整體安全架構。

MySQL 放在 Docker 裡需要 Volume 嗎?

正式環境通常需要。資料庫的資料應使用適當的 Volume 或外部儲存機制保存,避免 Container 重建時造成資料遺失。

Docker 新手應該先學哪些指令?

建議先熟悉 docker pull、docker run、docker ps、docker logs、docker stop、docker start、docker rm、docker image ls、docker volume 與 docker network。

總結: Docker 入門的核心並不是記住大量指令,而是先理解 Image、Container、Dockerfile、Registry、Volume、Network 與 Port 之間的關係。 掌握這些概念後,再進一步學習 Docker Compose、反向代理、資料庫、Volume、Backup 與容器監控,就可以建立更完整的網站部署環境。