在Debian 11、12系统,用docker搭建Caddy + PHP动、静态网站
文件夹 home/html/web/web1
一、常规安装,一个网站,不用数据库【推荐用第二或第三个方式 多站点 方式安装,便于以后在vps上搭建更多网站】,方法可行。
目录结构 (建议)
/home/html/web/web1/
├── docker-compose.yml
├── Caddyfile
└── public/ # 网站文件 (index.php, index.html等)
1、更新系统
sudo apt update && sudo apt upgrade -y
2、安装 Docker 和 Docker Compose
sudo apt install -y docker.io docker-compose
3、创建网站目录
a、灵活安装
sudo mkdir -p /home/html/web/web1
cd /home/html/web/web1
或
b、简单安装【推荐】
创建目录结构
# 创建目录结构
sudo mkdir -p /home/html/web/web1/public
创建 Caddyfile,解析好域名的,:80可替换域名example.com
# 创建 Caddyfile
cat << 'EOF' | sudo tee /home/html/web/web1/Caddyfile
:80 {
root * /srv
php_fastcgi php:9000
file_server
}
EOF
创建测试 PHP 文件
# 创建测试 PHP 文件
cat << 'EOF' | sudo tee /home/html/web/web1/public/index.php
<?php
phpinfo();
EOF
4、编写 docker-compose.yml
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy_web1
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./public:/srv
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
image: php:8.2-fpm
container_name: php_web1
restart: unless-stopped
volumes:
- ./public:/srv
volumes:
caddy_data:
caddy_config:
5、编写 Caddyfile,如果第三步中已安装好域名的,此步省略
example.com {
root * /srv
php_fastcgi php:9000
file_server
}
6、放置测试文件,如果第三步中已放置测试文件,此步省略
echo "<?php phpinfo(); ?>" > /home/html/web/web1/public/index.php
7、启动服务
cd /home/html/web/web1
sudo docker-compose up -d
查看容器状态:
sudo docker ps
8、访问测试
打开浏览器访问 http://服务器IP/
如果绑定了域名(并改了 Caddyfile),访问 https://你的域名/
二、多站点 Caddyfile 模板【不用数据库】,以三个web1、web2、web3为例,更多个网站类推,方法可行
目录结构建议
/home/html/web/
├── web1/
│ ├── public/ # 网站1的文件
│ ├── Caddyfile.web1 # 网站1配置
├── web2/
│ ├── public/ # 网站2的文件
│ ├── Caddyfile.web2 # 网站2配置
├── web3/
│ ├── public/ # 网站3的文件
│ ├── Caddyfile.web3 # 网站3配置
└── docker-compose.yml # 统一的 compose
└── Caddyfile # 主配置,引用各站点
1、更新系统
sudo apt update && sudo apt upgrade -y
2、安装 Docker 和 Docker Compose
sudo apt install -y docker.io docker-compose
3、创建三个目录结构并给予权限【 更多网站类似添加 】
网站1
sudo mkdir -p /home/html/web/web1/public
sudo chmod -R 755 /home/html/web/web1/public
网站2
sudo mkdir -p /home/html/web/web2/public
sudo chmod -R 755 /home/html/web/web2/public
网站3
sudo mkdir -p /home/html/web/web3/public
sudo chmod -R 755 /home/html/web/web3/public
4、在文件夹 /home/html/web/ 创建统一的 docker-compose.yml【 更多网站类似添加 】
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy_main
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./web1/public:/srv/web1
- ./web2/public:/srv/web2
- ./web3/public:/srv/web3
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
image: php:8.2-fpm
container_name: php_main
restart: unless-stopped
volumes:
- ./web1/public:/srv/web1
- ./web2/public:/srv/web2
- ./web3/public:/srv/web3
volumes:
caddy_data:
caddy_config:
5、总控 Caddyfile【 更多网站类似添加 】
# Web1 - 用域名
web1.example.com {
root * /srv/web1
php_fastcgi php:9000
file_server
}
# Web2 - 用域名
web2.example.com {
root * /srv/web2
php_fastcgi php:9000
file_server
}
# Web3 - 用 IP + 端口(测试用)
:8080 {
root * /srv/web3
php_fastcgi php:9000
file_server
}
6、启动
cd /home/html/web
sudo docker-compose up -d
7、快速测试文件【 更多网站类似添加,个别vps可能添加不上,用上传方式 】
echo "<?php echo 'Hello Web1!'; ?>" | sudo tee /home/html/web/web1/public/index.php
echo "<?php echo 'Hello Web2!'; ?>" | sudo tee /home/html/web/web2/public/index.php
echo "<?php echo 'Hello Web3!'; ?>" | sudo tee /home/html/web/web3/public/index.php
三、如果 需要数据库 ,在方式二的基础上修改, docker-compose.yml 添加 db 项,web主目录下新建 php 文件夹,php 文件夹添加 Dockerfile 文件, 注意修改数据库相关密码
目录结构
/home/html/web/
├── web1/
│ └── public/ # 放 Typecho
├── web2/
│ └── public/
├── web3/
│ └── public/
├── docker-compose.yml
├── php/
│ └── Dockerfile
└── Caddyfile
1、统一的 docker-compose.yml 【 注意修改数据库相关密码 】
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy_main
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./web1/public:/srv/web1
- ./web2/public:/srv/web2
- ./web3/public:/srv/web3
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
build: ./php
image: php:8.2-fpm
container_name: php_main
restart: unless-stopped
volumes:
- ./web1/public:/srv/web1
- ./web2/public:/srv/web2
- ./web3/public:/srv/web3
depends_on:
- db
db:
image: mariadb:10.7
container_name: mariadb_web1
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpass123
MYSQL_DATABASE: typecho
MYSQL_USER: typecho
MYSQL_PASSWORD: typechopass
volumes:
- db_data:/var/lib/mysql
volumes:
caddy_data:
caddy_config:
db_data:
2、php/Dockerfile
FROM php:8.2-fpm
# 安装 MySQL 扩展
RUN docker-php-ext-install pdo_mysql mysqli
# 可选:安装 gd、zip 等(上传图片/压缩包可能用到)
RUN apt-get update && apt-get install -y libjpeg-dev libpng-dev libzip-dev \
&& docker-php-ext-install gd zip
WORKDIR /srv
访问 http://web1.example.com,进入安装向导。
数据库地址: db
数据库名: typecho
用户: typecho
密码: typechopass
2、安装 Typecho 命令,也可以下载修改好后上传
cd /home/html/web/web1/public
wget https://github.com/typecho/typecho/archive/refs/tags/v1.2.1.zip -O typecho-1.2.1.zip
unzip typecho-1.2.1.zip
mv typecho-1.2.1/* ./
rm -rf typecho-1.2.1 typecho-1.2.1.zip
3、启动
cd /home/html/web
sudo docker-compose up -d
四、如果搭建网站中需要两个数据库【三个数据库或更多数据库类推】,例如,安装两个Typecho
1、一个数据库服务,多个数据库
docker-compose.yml(推荐方案)
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy_main
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./web1/public:/srv/web1
- ./web2/public:/srv/web2
- ./web3/public:/srv/web3
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
image: php:8.2-fpm
container_name: php_main
restart: unless-stopped
volumes:
- ./web1/public:/srv/web1
- ./web2/public:/srv/web2
- ./web3/public:/srv/web3
depends_on:
- db
db:
image: mariadb:10.6
container_name: mariadb_main
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpass123
volumes:
- db_data:/var/lib/mysql
volumes:
caddy_data:
caddy_config:
db_data:
2、初始化两个数据库
启动容器后进入 MariaDB:
docker exec -it mariadb_main mysql -uroot -p
输入 rootpass123 后,创建两个数据库和用户:
CREATE DATABASE typecho1;
CREATE DATABASE typecho2;
CREATE USER 'typecho1'@'%' IDENTIFIED BY 'pass1';
CREATE USER 'typecho2'@'%' IDENTIFIED BY 'pass2';
GRANT ALL PRIVILEGES ON typecho1.* TO 'typecho1'@'%';
GRANT ALL PRIVILEGES ON typecho2.* TO 'typecho2'@'%';
FLUSH PRIVILEGES;
然后【实际安装时用 Pdo驱动SQLite适配器安装, SQLite原生函数适配器安装】:
web1 Typecho 安装时填:数据库名 typecho1,用户 typecho1,密码 pass1
web2 Typecho 安装时填:数据库名 typecho2,用户 typecho2,密码 pass2
五、最小化的 Typecho Dockerfile + docker-compose.yml 示例,放到 /home/html/web/web1/ 下就能直接跑【可以,本方法安装步骤 专门链接 】
目录结构(推荐)
/home/html/web/web1/
├── docker-compose.yml
├── Caddyfile
├── php/
│ └── Dockerfile
└── data/ (安装后数据库文件会自动生成)
1、docker-compose.yml
version: '3.9'
services:
caddy:
image: caddy:2-alpine
container_name: caddy_web1
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/srv
- caddy_data:/data
- caddy_config:/config
depends_on:
- php
php:
build: ./php
container_name: php_web1
volumes:
- ./site:/srv
depends_on:
- db
db:
image: mariadb:10.7
container_name: mariadb_web1
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: typecho1
MYSQL_USER: typecho
MYSQL_PASSWORD: typechopass
volumes:
- ./data:/var/lib/mysql
volumes:
caddy_data:
caddy_config:
2、Caddyfile文件
:80 {
root * /srv
php_fastcgi php:9000
file_server
}
或
# Web1 - 用域名
web1.example.com {
root * /srv/web1
php_fastcgi php:9000
file_server
}
3、php/Dockerfile
FROM php:8.1-fpm
RUN docker-php-ext-install pdo pdo_mysql mysqli
WORKDIR /srv
4、下载 Typecho,不是在web1文件夹,是在site文件夹
cd /home/html/web/web1
mkdir site
cd site
wget https://github.com/typecho/typecho/releases/download/v1.2.1/typecho.zip
unzip typecho.zip
rm typecho.zip
5、启动
cd /home/html/web/web1
docker-compose up -d
然后访问服务器 http://你的IP/或域名 就能进入 Typecho 安装页面【安装时uplads文件夹没权限,单独设置一下,config.inc.php文件也可能没创建权限,手动创建一个就行】。
数据库信息填写:
数据库地址:db
数据库名:typecho1
用户名:typecho
密码:typechopass
⚡ 如果你要再装第二个 Typecho(web2),只需要复制一份 /home/html/web/web1/ 为 /home/html/web/web2/,然后在 docker-compose.yml 里修改:
容器名(caddy_web2、php_web2、mariadb_web2)
数据库名(typecho2)
端口映射(比如 8080:80)
六、多个网站
web1、web2 → 各自安装一个 Typecho(需要数据库)
web3、web4 → 普通动态 PHP 网站(不需要数据库)
全部共用同一个 Caddy 容器,不同的域名 / 目录对应不同的网站
网站目录结构(在 /home/html/web/ 下)
web1/ ← Typecho 站点 1
web2/ ← Typecho 站点 2
web3/ ← 动态 PHP 站点
web4/ ← 动态 PHP 站点
1、在 /home/html/ 下创建目录:
mkdir -p /home/html/{web1,web2,web3,web4,db1_data,db2_data,caddy_data,caddy_config}
2、把 docker-compose.yml 和 Caddyfile 放在 /home/html/
3、下载 Typecho 程序包到 web1/ 和 web2/ 目录,解压
4、完整的 docker-compose.yml 示例
services:
caddy:
image: caddy:2
container_name: caddy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
- ./caddy_config:/config
- ./web1:/srv/web1
- ./web2:/srv/web2
- ./web3:/srv/web3
- ./web4:/srv/web4
depends_on:
- php
php:
image: php:8.2-fpm
container_name: php-fpm
restart: always
volumes:
- ./web1:/srv/web1
- ./web2:/srv/web2
- ./web3:/srv/web3
- ./web4:/srv/web4
working_dir: /srv
command: php-fpm
# Typecho 数据库 1
db1:
image: mariadb:10.6
container_name: db1
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: typecho1
MYSQL_USER: user1
MYSQL_PASSWORD: pass1
volumes:
- ./db1_data:/var/lib/mysql
# Typecho 数据库 2
db2:
image: mariadb:10.6
container_name: db2
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: typecho2
MYSQL_USER: user2
MYSQL_PASSWORD: pass2
volumes:
- ./db2_data:/var/lib/mysql
5、Caddyfile
放在 /home/html/Caddyfile,不同网站对应不同文件夹:
# web1 - Typecho 1
web1.example.com {
root * /srv/web1
php_fastcgi php:9000
file_server
}
# web2 - Typecho 2
web2.example.com {
root * /srv/web2
php_fastcgi php:9000
file_server
}
# web3 - 普通 PHP 动态站
web3.example.com {
root * /srv/web3
php_fastcgi php:9000
file_server
}
# web4 - 普通 PHP 动态站
web4.example.com {
root * /srv/web4
php_fastcgi php:9000
file_server
}
6、启动服务:
cd /home/html
docker-compose up -d
7、浏览器访问:
http://web1.example.com → 使用数据库 db1,连接参数:
数据库主机: db1
用户名: user1
密码: pass1
数据库: typecho1
http://web2.example.com → 使用数据库 db2,连接参数:
数据库主机: db2
用户名: user2
密码: pass2
数据库: typecho2
评论 (0)