作者: xiaoziqi

  • Docker Compose 基礎部署筆記:把服務整理成可重啟的系統

    一、前言

    在伺服器上部署服務時,如果每個服務都用手動指令啟動,日後維護會變得很麻煩。 Docker Compose 可以將多個服務寫在同一份設定檔中,讓服務啟動、停止、重建與管理變得更清楚。

    這篇文章整理 Docker Compose 的基本使用概念,以及在部署 WordPress、資料庫或其他服務時需要注意的地方。

    二、Docker Compose 是什麼?

    Docker Compose 是用來管理多個 Docker container 的工具。透過一份 docker-compose.yml,可以描述服務名稱、映像檔、環境變數、volume、port 與重啟策略。

    例如一個 WordPress 網站通常至少需要:

    • WordPress 容器
    • MariaDB 或 MySQL 資料庫容器

    使用 Compose 後,可以用一個指令啟動整組服務:

    docker compose up -d

    三、常見設定項目

    1. services

    services 用來定義要啟動的服務,每個服務通常會對應一個 container。

    2. image

    image 表示要使用哪個 Docker image,例如 wordpressmariadbnginx

    3. volumes

    volumes 用來保存資料。如果沒有設定 volume,container 被刪除後資料可能也會消失。

    例如 WordPress 的網站檔案和資料庫資料都應該使用 volume 保存。

    4. ports

    ports 用來設定主機與 container 的連接埠對應。

    127.0.0.1:8081:80

    這代表只有本機可以透過 8081 存取 container 的 80 port,外部無法直接連入。 如果要對外提供服務,可以再由 Nginx 反向代理。

    5. restart

    restart: unless-stopped 可以讓服務在主機重開機後自動啟動,除非使用者手動停止它。

    四、常用指令

    啟動服務:

    docker compose up -d

    停止服務:

    docker compose down

    查看容器狀態:

    docker ps

    查看 log:

    docker logs container_name --tail=80

    五、部署時的注意事項

    • 資料庫密碼不要寫得太簡單。
    • 重要資料要使用 volume 保存。
    • 不需要對外開放的 port 應綁定在 127.0.0.1。
    • 服務名稱要清楚,方便日後維護。
    • 修改 Compose 檔案後,要重新啟動服務。

    六、實際應用

    這次 WordPress 架設就使用 Docker Compose 建立兩套 WordPress 與兩套資料庫。 每個網站都有自己的 WordPress container 和 database container,這樣可以讓網站彼此隔離,避免其中一個網站出問題時影響另一個。

    這種方式很適合小型伺服器或個人專案使用,因為它兼顧了部署方便與基本隔離。

    七、心得

    Docker Compose 的重點不是讓服務變得更複雜,而是讓部署流程變得可重複、可管理。

    當服務越來越多時,如果沒有統一管理方式,伺服器會很快變得混亂。 使用 Compose 可以讓每個服務的設定被明確記錄下來,也方便之後備份、遷移或重建。

  • TensorFlow 避坑安裝指南:從虛擬環境到 GPU 偵測

    一、前言

    TensorFlow 是常見的深度學習框架,但在本機安裝時,經常會遇到 Python 版本、CUDA、cuDNN、NVIDIA Driver 與虛擬環境相容性的問題。

    這篇文章整理 TensorFlow 安裝時需要注意的地方,避免在環境建置階段花太多時間踩坑。

    二、為什麼建議使用虛擬環境?

    Python 套件之間常常有版本相依問題。如果所有套件都安裝在同一個全域環境,之後很容易因為更新某個套件而讓其他專案壞掉。

    因此在安裝 TensorFlow 前,建議先建立獨立的虛擬環境。這樣每個專案都能有自己的 Python 版本與套件版本。

    conda create -n tf-env python=3.10
    conda activate tf-env

    三、安裝前需要確認的項目

    • Python 版本是否符合 TensorFlow 支援範圍。
    • NVIDIA Driver 是否正常安裝。
    • 是否需要 GPU 版本。
    • CUDA 與 cuDNN 版本是否相容。
    • 是否在正確的虛擬環境中執行指令。

    很多安裝失敗不是因為 TensorFlow 本身壞掉,而是版本搭配錯誤。

    四、安裝 TensorFlow

    在虛擬環境啟動後,可以使用 pip 安裝 TensorFlow:

    pip install tensorflow

    安裝完成後,可以用以下指令確認 TensorFlow 是否能正常載入:

    python -c "import tensorflow as tf; print(tf.__version__)"

    五、檢查 GPU 是否可用

    如果目標是使用 GPU 加速,需要確認 TensorFlow 是否偵測到 GPU。

    python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"

    如果輸出是空列表,代表 TensorFlow 沒有偵測到 GPU。這時候需要檢查 NVIDIA Driver、CUDA、cuDNN 或套件版本是否正確。

    六、常見問題

    1. Python 版本太新或太舊

    TensorFlow 對 Python 版本有支援範圍。如果 Python 版本不符合,可能會出現找不到套件或安裝失敗的情況。

    2. 裝在錯誤的環境

    有時候看起來已經安裝成功,但執行程式時仍然顯示找不到 TensorFlow。這通常是因為安裝和執行使用的是不同 Python 環境。

    3. GPU 沒有被偵測到

    GPU 不能使用時,通常要先確認 nvidia-smi 是否正常。如果連 nvidia-smi 都無法顯示顯卡資訊,就代表問題可能在驅動程式。

    七、建議流程

    1. 建立乾淨的虛擬環境。
    2. 確認 Python 版本。
    3. 安裝 TensorFlow。
    4. 測試 import 是否正常。
    5. 確認 GPU 是否被偵測。
    6. 再開始建立專案。

    八、心得

    TensorFlow 安裝最麻煩的地方不是指令本身,而是版本相容性。 如果一開始就先確認 Python、Driver、CUDA 與套件版本,可以避免很多不必要的錯誤。

    環境建置雖然看起來只是準備工作,但對 AI 專案來說非常重要。穩定的環境可以減少後續開發時的干擾,讓注意力集中在模型與資料處理上。

  • 從零開始架設 WordPress 網站:Linux Server、Docker、Nginx 與 HTTPS 實作紀錄

    一、前言

    這次的目標是在自己的 Linux Server 上架設 WordPress 網站,並讓網站能夠透過正式網址與 HTTPS 對外存取。 原本以為只是安裝 WordPress,但實際做起來才發現,完整架站會牽涉到 Docker、資料庫、Nginx 反向代理、DDNS、SSL 憑證與防火牆設定。

    這篇文章會記錄整個架設流程,以及過程中遇到的問題與解決方式,作為之後維護網站或重新部署時的參考。

    二、整體架構

    這次採用的方式是讓 WordPress 與資料庫在 Docker 容器中執行,外部連線則由 Nginx 負責接收與轉發。

    Internet
      ↓
    Cloudflare / No-IP DNS
      ↓
    Router Port Forwarding
      ↓
    Linux Server
      ↓
    Nginx Reverse Proxy
      ↓
    Docker WordPress + MariaDB

    這樣做的好處是每一層職責清楚。WordPress 不直接暴露在外部網路,而是只開在本機的 127.0.0.1,再由 Nginx 對外提供服務。

    三、使用 Docker Compose 建立 WordPress

    WordPress 需要 PHP 執行環境與資料庫。為了避免直接在主機上安裝一堆套件,這次使用 Docker Compose 來建立 WordPress 與 MariaDB。

    WordPress 容器使用 127.0.0.1 綁定,例如:

    127.0.0.1:8081
    127.0.0.1:8082

    這代表外部不能直接連到 WordPress 容器,必須透過 Nginx 反向代理。這樣可以降低服務直接暴露的風險,也方便日後管理多個網站。

    四、Nginx 反向代理

    Nginx 會根據使用者輸入的網域名稱,將請求轉發到不同的內部服務。 例如:

    wp.xiaoziqi.com → 127.0.0.1:8081
    wp.sihhao.com   → 127.0.0.1:8082

    透過這種方式,即使多個網站都在同一台伺服器上,也可以使用不同網域分流到不同網站。

    Nginx 設定完成後,可以使用以下指令檢查設定是否正確:

    sudo nginx -t

    確認沒有錯誤後,再重新載入 Nginx:

    sudo systemctl reload nginx

    五、動態 IP 與 DDNS

    家用網路通常不是固定 IP,公網 IP 可能會變動。如果 DNS 只手動填一次 IP,之後 IP 改變時網站就會失效。

    因此這次使用 DDNS 的方式,讓網域可以自動更新到目前的公網 IP。若使用 Cloudflare,可以透過 API Token 撰寫更新腳本;若使用 No-IP,也能透過 hostname 綁定動態 IP。

    六、HTTPS 憑證設定

    網站若只有 HTTP,瀏覽器會顯示不安全,因此這次使用 Certbot 申請 Let’s Encrypt 憑證。

    sudo certbot --nginx -d wp.xiaoziqi.com

    申請完成後,再使用以下指令測試自動續期:

    sudo certbot renew --dry-run

    如果 dry-run 成功,代表之後憑證可以自動續期,不需要每三個月手動處理。

    七、遇到的問題

    1. WordPress 回傳 500 Internal Server Error

    一開始在 Docker Compose 中加入額外設定時,因為 PHP 的 $_SERVER 被 Docker Compose 誤判為環境變數,導致產生錯誤的 wp-config.php

    解法是將 Compose 裡的 $_SERVER 寫成 $$_SERVER,避免 Docker Compose 提前展開變數。

    2. 靜態首頁與 WordPress 首頁衝突

    曾經為了快速展示作品集,將 index.html 放進 WordPress 根目錄。這樣雖然能快速顯示靜態頁面,但會影響 WordPress 原本的首頁路由。

    後來比較合理的方式是讓 WordPress 作為主網站,靜態作品集改放在其他路徑,例如:

    https://wp.xiaoziqi.com/portfolio/

    八、成果與心得

    完成後,網站可以透過 HTTPS 正常存取,也能進入 WordPress 後台發佈文章。文章網址則使用自訂永久連結,整理在 /knowledge/ 路徑下。

    這次最大的收穫是,架站不是只有安裝 WordPress,而是要理解 DNS、Router、Nginx、Docker、資料庫與 HTTPS 之間的關係。 當每一層都能正常運作時,網站才算真正能被穩定存取。