從燒錄系統、首次開機、SSH、套件更新,到 Nginx、Ollama、Docker、Docker Compose 與 MariaDB / phpMyAdmin / LAMP 實作。
適合大學課程、實驗課、IoT 專題前導教學,也適合作為學生的課後操作手冊。
| 系統 | 適合情境 | 說明 |
|---|---|---|
| Raspberry Pi OS | 入門教學、一般應用 | 官方支援最好,硬體相容性高 |
| Ubuntu Server | 伺服器課程、Docker、雲端服務 | 偏文字介面,適合遠端管理與部署 |
| Ubuntu Desktop | 需要圖形桌面教學 | 資源消耗較高,不一定適合長期伺服器用途 |
Raspberry Pi 5Ubuntu Server 24.04 LTS 或 Raspberry Pi OS Literpi5-iotAsia/Taipeiwhoami
hostname
pwd
ip a
ssh 使用者名稱@樹莓派IP位址
# 例如
ssh minhuang@192.168.1.120
ping rpi5-iot.local
主機名稱.local 連線。第一次登入後,幾乎一定要先做更新。
sudo apt update
sudo apt upgrade -y
sudo apt full-upgrade -y
sudo apt autoremove -y
sudo apt autoclean
sudo apt install -y \
git curl wget vim nano htop tree unzip zip \
net-tools dnsutils ca-certificates gnupg lsb-release \
software-properties-common apt-transport-https
sudo reboot
update 是更新套件清單,upgrade 是升級已安裝套件,兩者功能不同。passwd
timedatectl
sudo timedatectl set-timezone Asia/Taipei
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
uname -a
cat /etc/os-release
free -h
df -h
vcgencmd measure_temp
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
curl http://localhost
也可直接在瀏覽器輸入樹莓派 IP,例如 http://192.168.1.120。
cd /var/www/html
ls -al
echo '<h1>Hello Raspberry Pi 5</h1>' | sudo tee /var/www/html/index.html
sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart nginx
雖然 Ubuntu 套件庫裡也有 docker 套件,但正式部署建議使用 Docker 官方安裝方式。
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker version
sudo docker run hello-world
sudo usermod -aG docker $USER
newgrp docker
docker ps
新版 Docker Compose 多半已整合為 plugin,指令是 docker compose,不是舊版的 docker-compose。
docker compose version
compose.yamldocker compose up -ddocker compose ps 查看狀態docker compose logs -f 查看日誌mkdir -p ~/docker/mariadb-phpmyadmin
cd ~/docker/mariadb-phpmyadmin
nano compose.yaml
services:
mariadb:
image: mariadb:11
container_name: mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: iotdb
MYSQL_USER: iotuser
MYSQL_PASSWORD: iotpass123
volumes:
- mariadb_data:/var/lib/mysql
ports:
- "3306:3306"
phpmyadmin:
image: phpmyadmin:latest
container_name: phpmyadmin
restart: unless-stopped
environment:
PMA_HOST: mariadb
PMA_PORT: 3306
UPLOAD_LIMIT: 256M
ports:
- "8080:80"
depends_on:
- mariadb
volumes:
mariadb_data:
docker compose up -d
docker compose ps
docker compose logs -f
http://樹莓派IP:8080rootroot123456mkdir -p ~/docker/lamp-stack/www
cd ~/docker/lamp-stack
cat > ~/docker/lamp-stack/www/index.php <<'EOF'
<?php
phpinfo();
?>
EOF
services:
web:
image: php:8.2-apache
container_name: lamp-web
restart: unless-stopped
ports:
- "8081:80"
volumes:
- ./www:/var/www/html
depends_on:
- db
db:
image: mariadb:11
container_name: lamp-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: lampdb
MYSQL_USER: lampuser
MYSQL_PASSWORD: lamp123456
volumes:
- lamp_db_data:/var/lib/mysql
ports:
- "3307:3306"
phpmyadmin:
image: phpmyadmin:latest
container_name: lamp-pma
restart: unless-stopped
environment:
PMA_HOST: db
PMA_PORT: 3306
ports:
- "8082:80"
depends_on:
- db
volumes:
lamp_db_data:
docker compose up -d
http://樹莓派IP:8081http://樹莓派IP:8082正式教學時可延伸到自製 Dockerfile。
FROM php:8.2-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql
mkdir -p ~/docker/lamp-custom/www
cd ~/docker/lamp-custom
nano Dockerfile
FROM php:8.2-apache
RUN apt-get update && apt-get install -y \
libpng-dev libjpeg-dev libfreetype6-dev zip unzip
RUN docker-php-ext-install mysqli pdo pdo_mysql
RUN a2enmod rewrite
services:
web:
build: .
container_name: custom-lamp-web
restart: unless-stopped
ports:
- "8083:80"
volumes:
- ./www:/var/www/html
depends_on:
- db
db:
image: mariadb:11
container_name: custom-lamp-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: customdb
MYSQL_USER: customuser
MYSQL_PASSWORD: custompass123
volumes:
- custom_db_data:/var/lib/mysql
volumes:
custom_db_data:
docker compose up -d --build
Ollama 可在本機執行大型語言模型,但 Raspberry Pi 5 的速度與模型大小需審慎選擇。
curl -fsSL https://ollama.com/install.sh | sh
sudo systemctl enable ollama
sudo systemctl start ollama
sudo systemctl status ollama
ollama --version
ollama pull llama3.2
# 或較小模型
ollama pull qwen2.5:0.5b
ollama run llama3.2
curl http://localhost:11434/api/tags
這部分很適合當作進階示範,讓學生理解內外網服務映射。
sudo nano /etc/nginx/sites-available/ollama_proxy
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:11434;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
sudo ln -s /etc/nginx/sites-available/ollama_proxy /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
| 指令 | 用途 |
|---|---|
docker ps | 查看執行中的容器 |
docker ps -a | 查看所有容器 |
docker images | 查看本機映像檔 |
docker logs 容器名稱 | 查看容器日誌 |
docker exec -it 容器名稱 bash | 進入容器互動操作 |
docker compose up -d | 背景啟動服務 |
docker compose down | 關閉 compose 服務 |
docker compose restart | 重啟服務 |
docker compose logs -f | 即時查看服務輸出 |
systemctl status nginx
systemctl status ollama
docker ps
sudo ss -tulpn
docker compose config
sudo nginx -t
htop
free -h
df -h
phpinfo() 的 LAMP 環境只要完成這份教學內容,學生基本上已經掌握從單板電腦安裝、Linux 伺服器管理、Web 服務部署、容器化與本地 AI 服務的完整入門路徑。
這不只是 Raspberry Pi 教學,也是一條很好的現代 IoT 與邊緣運算課程起點。