Docker是一个容器化平台,它允许你将应用程序及其依赖项打包到轻量级、可移植的容器中。容器类似于虚拟机,但更加高效。
核心概念:
Docker Compose是用于定义和运行多容器Docker应用程序的工具。通过YAML文件配置服务,一条命令即可启动整个应用栈。
优势:
Caddy是一个现代化的Web服务器,具有以下特点:
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
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
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
bash展开代码# 检查Docker版本
docker --version
# 检查Docker Compose版本
docker compose version
# 测试Docker是否正常工作
docker run hello-world
这种方式适合测试环境或内网使用。
bash展开代码# 创建VanBlog部署目录
mkdir -p ~/vanblog-deploy
cd ~/vanblog-deploy
创建 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
bash展开代码# 启动所有服务(后台运行)
docker compose up -d
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs -f vanblog
启动成功后,可以通过以下方式访问:
http://localhost:801
http://你的IP地址:801
(如:http://192.168.3.20:801
)bash展开代码# 拉取最新镜像
docker pull kevinchina/deeplearning:vanblog-latest
# 停止现在的服务并重新启动服务
docker compose down && docker compose up -d
这种方式适合生产环境,提供HTTPS加密和域名访问。
在开始之前,你需要:
your-blog.com
)nslookup your-domain.com
验证DNS解析记录是否生效)bash展开代码mkdir -p ~/vanblog-production
cd ~/vanblog-production
mkdir caddy-proxy
创建 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 }
创建 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
重要: 在启动前,请修改以下配置:
your-domain.com
替换为你的实际域名your-email@example.com
替换为你的实际邮箱bash展开代码# 检查配置文件语法
docker compose config
# 启动所有服务
docker compose up -d
# 查看服务状态
docker compose ps
# 查看Caddy日志(重要:观察证书申请过程)
docker compose logs -f caddy-proxy
# 查看VanBlog日志
docker compose logs -f vanblog
http://your-domain.com
,应该自动跳转到HTTPShttps://your-domain.com
,应该显示VanBlog界面vanblog-network
展开代码用户请求 → Caddy (443/80) → VanBlog (80) → MongoDB (27017)
详细流程:
Docker容器本身是无状态的,数据持久化通过Volume挂载实现:
展开代码宿主机目录 容器内目录 用途 ./data/static → /app/static 图片文件存储 ./data/mongo → /data/db MongoDB数据 ./log → /var/log 应用日志 ./caddy/data → /root/.local/share/caddy SSL证书存储
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!