★★★在Debian 11、12系统,用docker搭建Caddy + PHP动、静态网站

★★★在Debian 11、12系统,用docker搭建Caddy + PHP动、静态网站

wszx01
2025-08-22 / 0 评论 / 0 阅读

在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

评论 (0)

取消