前幾天,我都在了解 TypeScript + Express 的 API。
雖然已經可以正常執行,但問題是——
如果我換一台電腦,要怎麼確保環境一樣、程式能跑?
這時候就輪到 Docker 登場了。
它的核心理念就是:讓「應用程式 + 執行環境」打包在一起跑。
我用生活化的比喻來講:
傳統部署方式 | Docker 部署方式 |
---|---|
像搬家要重新組家具、買材料、裝修 | 像把整個房間塞進貨櫃,直接運走 |
依賴作業系統(例如 Node 版本、DB 安裝) | 自己封裝環境,跑在哪都一樣 |
容易「在我電腦可以啊」 | 保證「哪裡都一樣」 |
Docker 的本質是一種 容器化技術,讓程式在獨立的「小世界」裡運行,不會互相干擾。
名稱 | 意思 |
---|---|
Image(映像) | 一個「環境模板」,像程式的藍圖(包含系統、套件、設定) |
Container(容器) | 從 Image 建立出來的實體,真的在執行的程式 |
Docker Hub / Registry | Image 的雲端倉庫(像 GitHub 但是放映像) |
Dockerfile | 用來描述怎麼「建造」一個 Image 的設定檔 |
Mac、Windows、Linux 都可以使用 Docker Desktop。
安裝完成後,打開終端機輸入:
docker --version
看到類似輸出就成功:
Docker version 27.0.3, build a89b842
我們先來跑一個最簡單的 nginx:
docker run -d -p 8080:80 nginx
意思是:
-d
:背景執行(detached)-p 8080:80
:把主機的 8080 port 對應到容器內的 80 port打開瀏覽器輸入:
👉 http://localhost:8080
你會看到熟悉的 nginx 預設頁面 🎉
指令 | 說明 |
---|---|
docker ps |
查看目前正在執行的容器 |
docker ps -a |
查看所有容器(包含停止的) |
docker images |
查看本地映像 |
docker logs <container_id> |
查看容器日誌 |
docker exec -it <container_id> bash |
進入容器內操作 |
docker stop <container_id> |
停止容器 |
docker rm <container_id> |
刪除容器 |
docker rmi <image_id> |
刪除映像 |
實際操作:
docker ps
docker exec -it <id> bash
進入 nginx 容器後你可以試著查看內容:
ls /usr/share/nginx/html
docker pull node:18-alpine
這會下載一個輕量級的 Node.js 環境。
執行看看:
docker run -it node:18-alpine node
會進入 Node REPL:
> console.log("Hello from Docker!");
Hello from Docker!
這代表你在一個完全乾淨的 Node 環境中執行 JS 程式 🎯
整個流程可以這樣想像:
Dockerfile → build → Image → run → Container
一張圖快速記起來👇
[Dockerfile] 定義怎麼打包環境
│
▼
[Image] 產生可重複使用的「模板」
│
▼
[Container] 執行中的實體(可以有很多個)
測試完要清空環境,可以用:
docker system prune -a
會刪除所有未使用的容器與映像。
今天的感覺就像第一次打開「部署的傳送門」⚙️
以前我只會跑 npm run dev
,
現在我可以讓程式在一個獨立環境中執行,完全不依賴電腦設定。
ps
、exec
、logs
、run
Docker 給我的第一印象就是:乾淨、有秩序、可複製。
明天 Day 29,我要自己寫一份 Dockerfile,
讓我的 TypeScript API 也能跑進容器裡 🚀