iT邦幫忙

2026 iThome 鐵人賽

DAY 26
0
IT Operation

從零開始的 Linux 維運與 Bash 自動化實戰 30 天系列 第 26 篇

Day 26:Docker 基礎 (二) — 撰寫 Dockerfile 打包第一個自訂 Image

  • 分享至 

  • xImage
  •  

上一篇文章成功在 Ubuntu 虛擬機中安裝了 Docker,並拉取了官方的 Nginx Image 啟動第一個容器。然而在實際的 DevOps 開發與維運情境中,我們不能永遠只使用官方預設的環境。為了將自己撰寫的應用程式、設定檔與相依套件打包成可跨環境推力的標準化單元,我們必須學會使用 Dockerfile 打造專屬的自訂 Image。

什麼是 Dockerfile
Dockerfile 是一個無副檔名的純文字文字檔,裡面記載了一連串用來建構 Image 的指令。Docker Engine 會讀取這個藍圖,從指定的基礎鏡像(Base Image)開始,一層一層地堆疊(Layering)並編譯出新的唯讀鏡像。

Dockerfile的基本指令

  • FROM:指定基礎鏡像(如 nginx:alpine)。
  • COPY:將宿主機(Host)上的檔案或目錄複製到容器內的指定路徑。
  • EXPOSE:聲明容器運行時預計對外開放的網路連接埠(Port)。
  • RUN:在打包 Image 的編譯階段執行的 Bash 指令(例如安裝系統套件)。
  • CMD:指定容器啟動時預設要執行的命令。

實作
https://ithelp.ithome.com.tw/upload/images/20260925/20183847b5tKZ67sLo.png
撰寫 Dockerfile 與啟動 Build 流程

  • 建立測試檔案:建立 day26-docker 資料夾,並寫入一個印有 Hello from Day 26 Custom Docker Image! 的 index.html 網頁檔。
  • 編寫 Dockerfile:以 cat << 'EOF' 指令寫入三行核心藍圖:
    • FROM nginx:alpine:指定使用輕量化的 Alpine Linux Nginx 為基底。
    • COPY index.html /usr/share/nginx/html/index.html:將剛剛建立的網頁檔覆蓋進容器內的預設網頁目錄。
    • EXPOSE 80:聲明容器內部監聽 80 Port。
  • 觸發打包:執行 docker build -t my-custom-nginx:v1 . 開始自動建置專屬 Image。

https://ithelp.ithome.com.tw/upload/images/20260925/20183847UKXxxa58h6.png
Image 下載編譯與體積檢視

  • 自動拉取與堆疊 Layer:Docker 自動去 Docker Hub 拉取 nginx:alpine 基礎層,並依序執行 COPY 與 EXPOSE 指令,成功編譯出識別碼為 32e69e6a1141 的新 Image。
  • 體積對比亮點:執行 docker images 查看成果時可以看到:
    • 官方預設的 nginx:latest:67.9MB
    • 你自訂的 my-custom-nginx:v1(基於 Alpine):僅 29MB(體積縮小了超過一半,能有效加快部署速度並提升安全性)。

https://ithelp.ithome.com.tw/upload/images/20260925/20183847x3NugTJz6k.png
啟動自訂容器與 HTTP 連線測試

  • 背景啟動容器:執行 docker run -d --name custom-app -p 8081:80 my-custom-nginx:v1,將 VM 的 8081 Port 映射到容器內部的 80 Port,並回傳容器 Hash ID。
  • HTTP 請求驗證:執行 curl http://localhost:8081,終端機成功輸出 Hello from Day 26 Custom Docker Image!!這證明你寫入的網頁內容已經被成功打包進 Image 並由 Nginx 正常對外提供服務。

上一篇
Day 25:Docker 容器化基礎——環境安裝與第一個 Nginx 容器運行
下一篇
Day 27:Docker Volume — 容器資料持久化與共享
系列文
從零開始的 Linux 維運與 Bash 自動化實戰 30 天 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言