如果 Docker 啟動了,但資料庫連不上或 Web 專案無法讀取服務,問題往往出在鏡像架構、連線位置或資料卷設定。本文從 M 系列晶片 Mac 的 Docker Desktop 安裝開始,逐步驗證容器、部署 MySQL、Redis 與 Web 專案,並提供故障定位方法和部署檢查清單。
Docker 啟動了,但 MySQL 連不上,或 Web 專案讀不到 Redis?
判斷:適合。 Mac 上如何執行 Docker?M 系列晶片 Mac 可用 Docker Desktop 執行 Docker,再用 Docker Compose 編排 MySQL、Redis 和 Web 專案;先確認鏡像架構,再檢查連接埠、環境變數與資料卷。
本文適合首次在 M 系列晶片 Mac 建立 Docker 開發環境的開發者。 也適合需要同時跑資料庫與 Web 專案,或正在評估遠端 Mac 是否符合開發需求的團隊成員。
Mac 上如何執行 Docker:安裝與基本驗證
Docker Desktop 在 Mac 上透過 Linux 虛擬化環境執行 Linux 容器。Apple Silicon 與 Intel 主機的處理器架構不同,因此容器鏡像是否有相符平台版本,是安裝後第一個要確認的條件。Apple 的虛擬化框架文件說明了在虛擬機執行 Linux 的機制;Docker 也有說明如何檢查及建置多平台鏡像的官方文件。
安裝前先查看Docker Desktop for Mac 安裝與系統需求。依官方頁面確認 macOS 支援條件,並選取適用於 Apple 晶片的安裝檔;不要只憑「Mac 版」字樣判斷安裝包相符。
安裝順序如下:
- 從 Docker 官方文件連至下載頁,取得 Apple 晶片版本的安裝檔。
- 開啟安裝檔,依畫面指示將 Docker Desktop 放入「應用程式」。
- 從「應用程式」啟動 Docker Desktop,閱讀並確認首次啟動所要求的權限。
- 等待介面顯示 Docker Engine 已啟動,再開啟終端機檢查命令列。
- 執行以下命令確認用戶端和伺服器狀態:
docker version
docker info
docker compose version
docker version 應顯示用戶端與伺服器資訊;若只有用戶端區段,代表命令列尚未連上 Engine。docker compose version 則用來確認 Compose 命令可用。這些檢查不代表資料庫或 Web 專案已經運作,只能證明基本工具鏈已就緒。
接著檢查鏡像平台。以 MySQL 鏡像為例:
docker buildx imagetools inspect mysql:8.4
輸出中可查看鏡像清單提供的平台,再與MySQL 官方鏡像說明核對。拉取後也可查看本機鏡像資訊:
docker image inspect mysql:8.4 --format '{{.Os}}/{{.Architecture}}'
如果容器無法啟動,不要先加上 --platform 強行執行。先比對鏡像標籤、檢查結果和啟動日誌;多平台文件說明了平台選擇的作用,但特定鏡像是否支援,仍須以該鏡像的發布資訊為準。
環境選擇對照
- 本機 Docker Desktop:適配度高。 適合日常開發、反覆修改程式和在 Mac 上直接除錯;代價是 Docker 與其他工作負載共用本機資源,電腦休眠或關機時容器也不適合當作長期在線服務。
- 遠端 Mac:適配度視工作流程而定。 適合需要從其他位置連入開發環境,或不希望開發工作持續佔用手邊電腦的情況;須先核對遠端連線方式、所需資源及專案交付流程。
- 正式服務主機:不適合直接照抄本文設定。 範例是本機開發用,密碼、連接埠暴露方式、備份與權限都未按正式環境要求設計。
Compose 專案設定與服務啟動
以下範例假設專案目錄內有 compose.yaml,Web 程式放在 ./web,而 ./web/Dockerfile 能建置該程式。Web 專案須自行讀取範例中的 DATABASE_URL 與 REDIS_URL 環境變數;不同框架可能使用其他變數名稱,請按程式實作調整。
先在專案根目錄建立 .env:
MYSQL_ROOT_PASSWORD=CHANGE_ME_LOCAL_ONLY
MYSQL_DATABASE=appdb
MYSQL_USER=appuser
MYSQL_PASSWORD=CHANGE_ME_LOCAL_ONLY
以上是本機開發用佔位值,不可直接用於正式環境,也不要將含有真實密碼的 .env 提交至版本控制。
接著建立 compose.yaml:
services:
mysql:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?請設定 MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE:-appdb}
MYSQL_USER: ${MYSQL_USER:-appuser}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:?請設定 MYSQL_PASSWORD}
ports:
- "127.0.0.1:3306:3306"
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 5s
retries: 10
redis:
image: redis:7
command: ["redis-server", "--appendonly", "yes"]
ports:
- "127.0.0.1:6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10
web:
build:
context: ./web
environment:
DATABASE_URL: mysql://appuser:${MYSQL_PASSWORD}@mysql:3306/appdb
REDIS_URL: redis://redis:6379
ports:
- "127.0.0.1:8080:3000"
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
volumes:
mysql_data:
redis_data:
設定的用途如下:
services定義要啟動的容器。Compose 建立預設網路後,服務可以用服務名稱互相連線;Web 連資料庫時應用mysql,而不是localhost。Compose 服務設定文件說明服務、網路與相關欄位。environment將資料庫名稱及登入資訊交給 MySQL 容器。MYSQL_DATABASE等變數的初始化用途可參照MySQL Docker 入門文件。ports將 Mac 的本機埠映射至容器埠,並綁定127.0.0.1,避免範例服務直接監聽所有網路介面。MySQL 與 Redis 的鏡像連接方式可再核對官方 MySQL 鏡像說明及官方 Redis 鏡像說明。volumes把資料存於 Compose 管理的具名資料卷;刪除或重建容器時,資料卷與容器的生命週期不同。healthcheck檢查服務是否回應。depends_on搭配service_healthy,讓 Compose 按健康狀態安排相依服務啟動,而不只是按容器啟動先後處理;可參照Compose 啟動順序與健康檢查說明。
範例使用的 MySQL 標籤為 8.4,Redis 標籤為 7。標籤及鏡像支援平台可能隨發布更新;開始部署前,請依前述官方鏡像頁確認標籤與平台清單。Compose 的網路連線和埠映射行為可對照Docker Desktop 網路說明。
啟動前先讓 Compose 解析檔案,再建置及啟動服務:
docker compose config
docker compose up -d --build
docker compose ps
若 config 報告環境變數未設定,先檢查 .env 名稱和值。若服務狀態不健康或持續重新啟動,查看該服務日誌:
docker compose logs --tail=100 mysql
docker compose logs --tail=100 redis
docker compose logs --tail=100 web
--tail 的數值只是限制顯示的日誌行數,不影響容器設定。需要完整記錄時,移除該選項。
提醒: Compose 內的服務名稱只在 Compose 網路中作為連線位置。Mac 上的資料庫工具則應連到
127.0.0.1和映射出的本機埠;兩種連線位置不可混用。
連線驗證與中途常見問題
下列 FAQ 補足首次配置最容易混淆的判斷:安裝狀態、容器架構、Compose 連線位置,以及資料庫和快取服務的啟動依賴。
FAQ
Docker Desktop 安裝後,怎樣確認 Docker 真的可用?
查看 Docker Desktop 是否已啟動,再執行 docker version、docker info 與 docker compose version。用戶端與伺服器資訊都能正常顯示後,再啟動鏡像並檢查 docker compose ps 和服務日誌。若伺服器資訊缺失,先處理 Docker Engine 未啟動或命令列連線問題,暫時不要排查應用程式。
Compose 同時啟動 MySQL 和 Redis 時,Web 專案怎麼連線?
先確認各服務都有正確的環境變數、健康檢查和資料卷。容器內的 Web 程式以 mysql 和 redis 等 Compose 服務名稱連線;Mac 上的客戶端才透過 127.0.0.1 和映射埠連入。若程式啟動得比資料庫早,檢查健康狀態及啟動日誌,不要只因容器已建立就判定資料庫可用。
怎樣判斷鏡像是否相容 Apple Silicon?
執行 docker buildx imagetools inspect 查看鏡像平台清單,並對照鏡像官方文件與實際啟動輸出。清單能協助判斷平台,但不保證應用程式的每項相依套件都沒有問題。遇到架構錯誤,先確認映像標籤、平台及日誌,再決定是否採用官方建議的替代方式。
Web 專案部署後,怎樣分別驗證 MySQL、Redis 和資料持久化?
先用瀏覽器開啟 http://127.0.0.1:8080,確認 Web 程式回應;再執行 docker compose exec mysql mysql -uappuser -p appdb,輸入 .env 中的密碼測試 MySQL 登入。Redis 可用 docker compose exec redis redis-cli SET dev-check ok 寫入,再以 docker compose exec redis redis-cli GET dev-check 讀回。寫入一筆非敏感測試資料後執行 docker compose down,再執行 docker compose up -d 並重讀;若資料仍在,表示本例掛載的具名資料卷保留了資料。不要改用會移除資料卷的清理命令來做這項測試。
本機瀏覽器連不到 Web 頁面時,先執行 docker compose ps,確認 web 容器狀態與埠映射,再查看 docker compose logs web。若容器內程式只監聽 localhost,即使 Compose 有映射,外部連線仍可能失敗;請確認程式監聽容器的網路介面,並比對 Dockerfile 實際提供的埠與 Compose 設定。
部署問題可按以下順序定位:
- 鏡像架構不符: 用
docker buildx imagetools inspect查看平台清單,再執行docker compose logs查看啟動錯誤。若鏡像來源不是官方維護版本,先核對其文件和發布資訊。 - 連接埠已被佔用: 用
docker compose ps確認映射,並檢查 Mac 上是否已有其他服務使用該主機埠。可以改主機端的映射值,但容器內連接埠和應用程式監聽埠須保持一致。 - 環境變數錯誤: 執行
docker compose config檢查解析後的設定;遇到資料庫登入失敗,再比較 MySQL 初始化變數與 Web 程式實際讀取的變數名稱。 - 服務啟動次序或健康狀態異常: 執行
docker compose ps,查看狀態與健康檢查結果,再依序讀取 MySQL、Redis 和 Web 日誌。depends_on不會代替應用程式的重試處理;程式仍應妥善處理服務暫時不可用的情況。 - 資料卷不如預期: 用
docker volume ls查看 Compose 建立的資料卷,並檢查服務掛載路徑。若改了資料庫初始化環境變數,既有資料目錄可能仍保留先前初始化結果;先確認資料是否需要保留,再決定如何清理。
部署完成檢查清單與環境選擇
開始日常開發前,逐項確認:
- [ ] Docker Desktop 已啟動,
docker version顯示用戶端與伺服器資訊。 - [ ] 所用 MySQL、Redis 和 Web 鏡像的架構與標籤已核對;容器啟動日誌沒有架構錯誤。
- [ ]
docker compose ps顯示服務狀態正常,資料庫與 Redis 健康檢查通過。 - [ ] Web 專案使用 Compose 服務名稱連線資料庫與 Redis;Mac 上的工具使用本機埠映射。
- [ ] 瀏覽器能開啟 Web 頁面,MySQL 可登入,Redis 測試資料能寫入及讀回。
- [ ] 測試重建容器後,確認資料卷保留預期資料;
.env中的密碼沒有提交到版本控制。 - [ ] 正式環境另行設計密碼管理、網路暴露、備份與權限;沒有直接沿用本機範例。
若本機 Mac 足以執行專案,而且開發時可以讓它保持可用,Docker Desktop 通常是最直接的選擇。缺點是容器會與編輯器、瀏覽器及其他工作負載共用本機資源;電腦休眠會打斷持續連線;多人也需要自行管理環境一致性。若本機不便長時間運作,或團隊需要從不同位置進入 Mac 開發環境,可先查看 ZekVPS 的遠端 Mac 使用說明,再按實際需求評估 ZekVPS 遠端 Mac 方案頁面。租用適合臨時開發或遠端測試需求,不代表能取代所有本機工作;需要長期固定負載或實體介面的情況,仍應先確認環境是否合用。
把 Mac 開發環境搬上雲端,從容執行容器與專案
透過 ZekVPS 租用 M4 裸金屬 Mac mini,使用完整 macOS 與管理員權限,部署資料庫和 Web 專案更有彈性。
整臺實體 Mac 獨享,不與他人共用算力,適合長時間執行開發、測試與建置工作。
若你正準備把 MCP 或 Agent 從 Demo 推到日常運轉,先固定一台可快照的雲 Mac 節點往往比換第五個框架更有效。 查看 ZekVPS 雲端 Mac mini 套餐 — 把實驗環境和生產桌面拆開,部署會踏實很多。