[Docker]本機啟動Next.js專案、Mysql、Phpmyadmin

文、意如

專案架構建議如下

my-website/
├── app/                     # 放 Next.js 程式碼
├── Dockerfile               # Node 應用的建置
├── docker-compose.yml       # 整合 MySQL + phpMyAdmin + app


 

 

建立 Dockerfile

my-website/ 根目錄下建立 Dockerfile

# 使用 Node 環境
FROM node:18

# 設定容器內的工作目錄為你的 Next.js 應用程式根目錄
# 這邊的 /app 會對應到你主機的 C:\Yiru\Code\my-website\app
WORKDIR /app

# 1. 複製 Next.js 應用程式的 package.json 和 lockfiles
# 這些檔案位於主機的 C:\Yiru\Code\my-website\app
# 注意這裡的來源路徑是 app/,因為 Dockerfile 的上下文是 my-website/
COPY app/package*.json ./

# 2. 安裝 Next.js 應用程式的相依套件
# 這會在容器的 /app/node_modules 下安裝所有依賴,包括 @prisma/client 和所有 Query Engines
RUN npm install

# 3. 複製 Next.js 應用程式的所有程式碼和相關檔案
# 這裡會複製包括 src/、prisma/ 等所有在 C:\Yiru\Code\my-website\app 裡的內容
# 注意這裡的來源路徑也是 app/
COPY app/. .

# 4. 編譯 Next.js 專案
# 因為 WORKDIR 現在是 /app,所以 npm run build 會在正確的位置找到 package.json
RUN npm run build

# 創建用於圖片上傳的目錄並設置權限
# 假設你的上傳目錄在 /app/public/uploads/news (容器內路徑)
# 或者只是 /app/uploads/news (如果不在 public 下)
# 請根據你實際程式碼中上傳的路徑來調整
RUN mkdir -p /app/public/uploads/news && chown -R node:node /app/public/uploads && chmod -R 755 /app/public/uploads

# 開放 3000 port
EXPOSE 3000

# 啟動應用程式
CMD ["npm", "start"]
建立 docker-compose.yml
version: "3.9"
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=mysql://yiru:123456@db:3306/mywebsite
      - JWT_SECRET=${JWT_SECRET}
    depends_on:
      - db
    # 添加 Volumes 配置
    volumes:
     - ./app/public/uploads:/app/public/uploads

  db:
    image: mysql:8.0
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: yiru
      MYSQL_PASSWORD: 123456
      MYSQL_DATABASE: mywebsite
    volumes:
      - db_data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - "8080:80"
    environment:
      PMA_HOST: db
      PMA_USER: yiru
      PMA_PASSWORD: 123456
      PMA_ARBITRARY: 1

volumes:
  db_data:
.env 檔案內容(與 docker-compose 對應)
DATABASE_URL="mysql://yiru:123456@db:3306/mywebsite"
JWT_SECRET=隨便一串長 token
開始執行

在 my-website 根目錄中執行:

docker-compose up -d --build
 

你的 Next.js 專案 → http://localhost:3000

phpMyAdmin → http://localhost:8080

設定資料庫帳號

docker-compose exec db mysql -u root -pYOUR_PASSWORD
範例(假設你的密碼是 123456):
docker-compose exec db mysql -u root -p123456

登入mysql後,設定權限

GRANT ALL PRIVILEGES ON *.* TO 'yiru'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

這樣 yiru 就有權限建立 shadow DB。

然後再跑:

docker-compose exec app npx prisma migrate dev

專案中的資料表成功建立於mysql


 

Yiru@Studio - 關於我 - 意如