好了,到了這一步,我們已經有了一個基於 Docker 的開發環境,但你可能會想:「這麼多配置,到底是怎麼運作的?」別擔心,今天我們要一起拆解這個 Docker 環境,深入了解 Nginx 如何作為反向代理,協調 Nuxt(前端)和 Laravel(後端)之間的關係。
首先,讓我們快速回顧一下整個 Docker 環境的架構:
docker-compose.yml 是整個 Docker 環境的核心,負責協調各個服務。我們來逐段解析這個檔案,了解每個設定的目的。
version: '3.8'
services:
# Laravel (backend)
backend:
build:
dockerfile: ./.docker-env/api/Dockerfile
container_name: laravel-app
restart: on-failure
volumes:
- ./api:/var/www/html
environment:
- APP_ENV=local
- APP_DEBUG=true
- DB_CONNECTION=mysql
- DB_HOST=db
- DB_PORT=3306
- DB_DATABASE=finance
- DB_USERNAME=root
- DB_PASSWORD=root
command: bash -c "if [ ! -f composer.json ]; then composer create-project --prefer-dist laravel/laravel .; fi && composer install && php-fpm"
depends_on:
- db
networks:
- app-network
別忘了:環境變數中的資料庫資訊要與資料庫服務的設定相匹配,否則 Laravel 可是會鬧脾氣的。
位於 .docker-env/api/Dockerfile,這個檔案定義了 Laravel 容器的環境。
# 使用 PHP 基礎映像檔
FROM php:8.2-fpm
# 安裝必要的系統套件和 PHP 擴展
RUN apt-get update && apt-get install -y \
git \
unzip \
libjpeg-dev \
libpng-dev \
libzip-dev \
&& docker-php-ext-install pdo_mysql zip
# 安裝 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 設定工作目錄
WORKDIR /var/www/html
# 複製專案檔案
COPY ../../api .
# 設置權限
RUN chown -R www-data:www-data /var/www/html
# Expose port and start PHP-FPM
EXPOSE 9000
CMD ["php-fpm"]
小技巧:有時候忘記安裝某個 PHP 擴展,結果功能跑不起來,那種感覺就像買了新電器卻沒電池。所以,提前確認所需的擴展,能省下不少時間。
位於 .docker-env/web/Dockerfile,定義了 Nuxt 容器的環境。
# 使用 Node.js 20 映像
FROM node:20-alpine
# 設定工作目錄
WORKDIR /app
# 複製 package.json
COPY package*.json ./
# 暴露端口
EXPOSE 3000
# 啟動命令將在 docker-compose.yml 中定義
Nginx 作為反向代理,負責將不同的請求導向正確的服務。我們需要兩個配置檔案:api.conf 和 web.conf。
server {
listen 80;
server_name api.localhost;
root /var/www/html/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass laravel-app:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
server {
listen 80;
server_name web.localhost;
location / {
proxy_pass http://nuxt-app:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
曾經有一次,我忘了在 Nginx 配置中設定 proxy_set_header,結果 WebSocket 連線一直失敗。那種抓不到 bug 的感覺,真的是讓人懷疑人生。所以,細節真的很重要!
在 docker-compose.yml 中,MariaDB 的配置如下:
# MySQL (MariaDB)
db:
image: mariadb:latest
container_name: mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: finance
MYSQL_USER: root
MYSQL_PASSWORD: root
volumes:
- "./.docker-env/.db_data/mysql:/var/lib/mysql"
networks:
- app-network
要確認 Laravel 是否成功連接到資料庫,可以在容器中執行遷移命令:
docker-compose exec backend php artisan migrate
如果看到遷移成功的訊息,表示 Laravel 與資料庫的連線正常。
以下是一些常用的 Docker 指令,方便你在開發過程中操作:
docker-compose up -d --build
docker-compose logs -f [service_name]
docker-compose exec [service_name] bash
docker-compose restart [service_name]
docker-compose down
恭喜你!我們已經深入了解了整個 Docker 環境的架構和配置。現在,你不僅知道「怎麼做」,還了解了「為什麼要這麼做」。這種理解將讓你在未來的開發中更加游刃有餘。
別害怕嘗試和錯誤,有時候問題的解答就藏在那些看似不起眼的細節中。就像我常說的,「調整了 N 個配置,只為了解決一個小問題,但這就是成長的過程」。
接下來,我們將進行第一階驗收,看看這一切是否如我們預期的那樣順利運行!