快速部署VanBlog
编辑
2025-06-16
建站教程
00

目录

前置知识
什么是Docker?
什么是Docker Compose?
什么是Caddy?
环境准备
1. 安装Docker
Ubuntu/Debian系统:
CentOS/RHEL系统:
2. 安装Docker Compose
方法一:使用包管理器(推荐)
方法二:直接下载二进制文件
3. 验证安装
基础部署(不带HTTPS)
1. 创建项目目录
2. 创建Docker Compose配置文件
3. 启动服务
4. 访问应用
5. 更新镜像
生产部署(带Caddy和HTTPS)
1. 准备域名和DNS
2. 创建项目目录结构
3. 创建Caddy配置文件
4. 创建生产环境Docker Compose文件
5. 修改配置
6. 启动生产环境
7. 验证部署
启动原理解析
容器启动顺序
网络通信原理
数据持久化原理
HTTPS证书自动申请原理

前置知识

什么是Docker?

Docker是一个容器化平台,它允许你将应用程序及其依赖项打包到轻量级、可移植的容器中。容器类似于虚拟机,但更加高效。

核心概念:

  • 镜像(Image):应用程序的只读模板
  • 容器(Container):镜像的运行实例
  • 仓库(Registry):存储镜像的地方,如Docker Hub

什么是Docker Compose?

Docker Compose是用于定义和运行多容器Docker应用程序的工具。通过YAML文件配置服务,一条命令即可启动整个应用栈。

优势:

  • 简化多容器应用的管理
  • 环境隔离和一致性
  • 易于扩展和维护

什么是Caddy?

Caddy是一个现代化的Web服务器,具有以下特点:

  • 自动HTTPS:自动申请和续期SSL证书
  • 零配置:默认设置即可满足大多数需求
  • 反向代理:可以将请求转发到后端服务

环境准备

1. 安装Docker

Ubuntu/Debian系统:

bash
展开代码
# 更新包管理器 sudo apt update # 安装必要的包 sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定版仓库 echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker Engine sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io # 启动Docker服务 sudo systemctl start docker sudo systemctl enable docker # 将当前用户添加到docker组(避免每次使用sudo) sudo usermod -aG docker $USER # 重新登录以应用组更改,或执行: newgrp docker

CentOS/RHEL系统:

bash
展开代码
# 安装必要的包 sudo yum install -y yum-utils # 设置Docker仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker Engine sudo yum install docker-ce docker-ce-cli containerd.io # 启动Docker服务 sudo systemctl start docker sudo systemctl enable docker # 将当前用户添加到docker组 sudo usermod -aG docker $USER

2. 安装Docker Compose

方法一:使用包管理器(推荐)

bash
展开代码
# Ubuntu/Debian sudo apt install docker-compose-plugin # CentOS/RHEL sudo yum install docker-compose-plugin

方法二:直接下载二进制文件

bash
展开代码
# 下载最新版本的Docker Compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 添加执行权限 sudo chmod +x /usr/local/bin/docker-compose # 验证安装 docker-compose --version

3. 验证安装

bash
展开代码
# 检查Docker版本 docker --version # 检查Docker Compose版本 docker compose version # 测试Docker是否正常工作 docker run hello-world

基础部署(不带HTTPS)

这种方式适合测试环境或内网使用。

1. 创建项目目录

bash
展开代码
# 创建VanBlog部署目录 mkdir -p ~/vanblog-deploy cd ~/vanblog-deploy

2. 创建Docker Compose配置文件

创建 docker-compose.yml 文件:

yaml
展开代码
version: '3' services: vanblog: image: kevinchina/deeplearning:vanblog-latest restart: always environment: TZ: 'Asia/Shanghai' # 邮箱地址,用于通知(可选) EMAIL: 'your-email@example.com' # 设置为生产环境 NODE_ENV: 'production' # 设置版本号 VAN_BLOG_VERSION: 'v1.0.0' volumes: # 图床文件的存放地址,按需修改 - ${PWD}/data/static:/app/static # 日志文件 - ${PWD}/log:/var/log # Caddy 配置存储 - ${PWD}/caddy/config:/root/.config/caddy # Caddy 证书存储 - ${PWD}/caddy/data:/root/.local/share/caddy # 阿里云盘配置存储 - ${PWD}/aliyunpan/config:/root/.config/aliyunpan ports: # 前面的是映射到宿主机的端口号,可以修改 - 801:80 depends_on: - mongo mongo: # 某些机器不支持AVX指令集会报错,所以可选择使用v4版本 # image: mongo:4.4.16 image: mongo:latest restart: always environment: TZ: 'Asia/Shanghai' volumes: - ${PWD}/data/mongo:/data/db # MongoDB默认端口,通常不需要对外暴露 # ports: # - 27017:27017

3. 启动服务

bash
展开代码
# 启动所有服务(后台运行) docker compose up -d # 查看服务状态 docker compose ps # 查看服务日志 docker compose logs -f vanblog

4. 访问应用

启动成功后,可以通过以下方式访问:

  • 本地访问:http://localhost:801
  • 局域网访问:http://你的IP地址:801(如:http://192.168.3.20:801

5. 更新镜像

bash
展开代码
# 拉取最新镜像 docker pull kevinchina/deeplearning:vanblog-latest # 停止现在的服务并重新启动服务 docker compose down && docker compose up -d

生产部署(带Caddy和HTTPS)

这种方式适合生产环境,提供HTTPS加密和域名访问。

1. 准备域名和DNS

在开始之前,你需要:

  • 拥有一个域名(如:your-blog.com
  • 将域名的A记录指向你的服务器IP地址(配置DNS解析记录)
  • 确保域名解析生效(可在Linux机器上用指令 nslookup your-domain.com 验证DNS解析记录是否生效)

2. 创建项目目录结构

bash
展开代码
mkdir -p ~/vanblog-production cd ~/vanblog-production mkdir caddy-proxy

3. 创建Caddy配置文件

创建 caddy-proxy/Caddyfile

caddyfile
展开代码
# 全局配置:设置邮箱用于Let's Encrypt证书申请 { email your-email@example.com # 使用Let's Encrypt的生产环境 acme_ca https://acme-v02.api.letsencrypt.org/directory } # 主站配置:使用你的域名自动申请Let's Encrypt证书 your-domain.com { reverse_proxy vanblog:80 # 启用Gzip压缩 encode gzip # 设置安全头 header { # 启用HSTS Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" # 防止点击劫持 X-Frame-Options "SAMEORIGIN" # 防止XSS攻击 X-XSS-Protection "1; mode=block" # 防止MIME类型嗅探 X-Content-Type-Options "nosniff" } # 自动申请Let's Encrypt免费证书 # 如果使用Cloudflare:设置DNS为橙色云朵,SSL模式为"完全"或"完全(严格)" } # 可选:www重定向到主域名 www.your-domain.com { redir https://your-domain.com{uri} permanent } # 备用配置:如果域名有问题,可以注释掉上面的配置,启用下面的IP访问配置 # :443 { # reverse_proxy vanblog:80 # tls internal # 使用自签名证书 # } # HTTP重定向到HTTPS :80 { redir https://{host}{uri} permanent }

4. 创建生产环境Docker Compose文件

创建 docker-compose.yml

yaml
展开代码
version: '3.8' # 定义自定义网络 networks: vanblog-network: driver: bridge services: vanblog: image: kevinchina/deeplearning:vanblog-latest restart: always environment: TZ: 'Asia/Shanghai' # 邮箱地址,用于通知 EMAIL: 'your-email@example.com' # 设置为生产环境 NODE_ENV: 'production' # 设置版本号 VAN_BLOG_VERSION: 'v1.0.0' volumes: # 图床文件的存放地址,按需修改 - ${PWD}/data/static:/app/static # 日志文件 - ${PWD}/log:/var/log # Caddy 配置存储 - ${PWD}/caddy/config:/root/.config/caddy # Caddy 证书存储 - ${PWD}/caddy/data:/root/.local/share/caddy # 阿里云盘配置存储 - ${PWD}/aliyunpan/config:/root/.config/aliyunpan # 移除端口映射,因为现在通过caddy-proxy访问 networks: - vanblog-network depends_on: - mongo healthcheck: test: ["CMD", "curl", "-f", "http://localhost:80"] interval: 30s timeout: 10s retries: 3 caddy-proxy: image: caddy:latest restart: always ports: - "443:443" - "80:80" volumes: - ${PWD}/caddy-proxy/Caddyfile:/etc/caddy/Caddyfile - ${PWD}/caddy-proxy/data:/data - ${PWD}/caddy-proxy/config:/config networks: - vanblog-network environment: TZ: 'Asia/Shanghai' depends_on: - vanblog mongo: # 某些机器不支持AVX指令集会报错,所以可选择使用v4版本 # image: mongo:4.4.16 image: mongo:latest restart: always environment: TZ: 'Asia/Shanghai' # 可选:设置MongoDB认证(生产环境推荐) # MONGO_INITDB_ROOT_USERNAME: admin # MONGO_INITDB_ROOT_PASSWORD: your-strong-password volumes: - ${PWD}/data/mongo:/data/db networks: - vanblog-network healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 30s timeout: 10s retries: 3

5. 修改配置

重要: 在启动前,请修改以下配置:

  • your-domain.com 替换为你的实际域名
  • your-email@example.com 替换为你的实际邮箱

6. 启动生产环境

bash
展开代码
# 检查配置文件语法 docker compose config # 启动所有服务 docker compose up -d # 查看服务状态 docker compose ps # 查看Caddy日志(重要:观察证书申请过程) docker compose logs -f caddy-proxy # 查看VanBlog日志 docker compose logs -f vanblog

7. 验证部署

  1. 检查HTTP重定向:访问 http://your-domain.com,应该自动跳转到HTTPS
  2. 检查HTTPS:访问 https://your-domain.com,应该显示VanBlog界面
  3. 检查证书:在浏览器中查看证书信息,应该是Let's Encrypt签发的有效证书

启动原理解析

容器启动顺序

  1. 网络创建:Docker Compose首先创建自定义网络 vanblog-network
  2. MongoDB启动:数据库服务首先启动,为应用提供数据存储
  3. VanBlog启动:等待MongoDB就绪后启动博客应用
  4. Caddy启动:最后启动反向代理服务,处理HTTPS和域名访问

网络通信原理

展开代码
用户请求 → Caddy (443/80) → VanBlog (80) → MongoDB (27017)

详细流程:

  1. 用户通过域名访问网站
  2. Caddy接收请求,自动处理HTTPS证书
  3. Caddy将请求反向代理到VanBlog容器的80端口
  4. VanBlog应用处理业务逻辑,与MongoDB交互
  5. 响应沿原路返回给用户

数据持久化原理

Docker容器本身是无状态的,数据持久化通过Volume挂载实现:

展开代码
宿主机目录 容器内目录 用途 ./data/static → /app/static 图片文件存储 ./data/mongo → /data/db MongoDB数据 ./log → /var/log 应用日志 ./caddy/data → /root/.local/share/caddy SSL证书存储

HTTPS证书自动申请原理

  1. 域名验证:Let's Encrypt通过HTTP-01挑战验证域名所有权
  2. 证书申请:Caddy自动向Let's Encrypt申请证书
  3. 证书部署:证书自动配置到Caddy
  4. 自动续期:Caddy在证书到期前自动续期
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!