本站起源——Docker & Ghost
1.安装docker
避开 Ubuntu 自带的旧版仓库(apt install docker.io),直接安装 Docker 官方维护的版本
1.1 卸载冲突包
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done1.2 配置 Docker 官方仓库
我们需要添加 Docker 的官方 GPG 密钥和软件源,确保后续可以通过 apt 直接更新。
- 更新索引并安装必要工具:
sudo apt-get update
sudo apt-get install ca-certificates curl- 添加官方 GPG 密钥:
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc- 添加软件源:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null1.3 安装 Docker 核心组件
这一步会同时安装 Docker 引擎和现代版的 Docker Compose(作为插件存在)。
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-comp[DLC] Docker 核心概念速览
在正式搭建 Ghost 之前,请记住这三个核心概念的逻辑关系:
- Image (镜像): 相当于“类”或者“安装包”,是只读的模板。
- Container (容器): 相当于“对象”或者“正在运行的系统实例”。你可以从一个镜像启动多个容器。
- Volume (数据卷): 相当于“外挂硬盘”。容器删除后内部数据会消失,所以数据库文件必须放在数据卷里。
1.4 创建项目目录
建议养成习惯,每个 Docker 项目都放在独立的文件夹里:
mkdir -p ~/ghost-blog
cd ~/ghost-blog1.5 编写配置文件
使用 nano 或你熟悉的编辑器(作为 LazyVim 用户,你也可以直接用 vim)创建配置文件:
vim docker-compose.ymlservices:
# 数据库服务
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: some_strong_password # 建议修改这个密码
MYSQL_DATABASE: ghost_db
volumes:
- ./mysql:/var/lib/mysql
# Ghost 博客服务
ghost:
image: ghost:5-alpine
restart: always
depends_on:
- db
ports:
- "2368:2368"
environment:
# 替换为你的服务器公网 IP
url: http://你的服务器公网 IP:2368
database__client: mysql
database__connection__host: db
database__connection__user: root
database__connection__password: some_strong_password # 必须与上面的密码一致
database__connection__database: ghost_db
volumes:
- ./content:/var/lib/ghost/content注意:密码不要设置为纯数字,容易被识别为整数参数解析:
depends_on: 告诉 Docker 先启动数据库,再启动 Ghost。database__connection__host: db: 这里的db对应上面数据库服务的名字,Docker 会自动解析 IP,非常方便。./mysql和./content: 所有的文章数据和数据库文件都会存在你当前目录下的这两个文件夹里。
1.6 一键启动!
在 ~/ghost-blog 目录下执行:Bash
sudo docker compose up -d注:-d 表示后台运行。
[DLC2] 验证与排故
- 查看容器是否都活着的:
sudo docker compose ps- 你应该能看到
ghost和db两个容器的STATUS都是Up。 - 访问博客: 在浏览器输入
http://服务器ip:2368即可看到你的博客。 输入http://服务器ip:2368/ghost即可进入管理员初始化界面。 - 如果还是打不开(看日志):
sudo docker compose logs -f ghost如果看到 Ghost is running 字样,说明内部已经成功,如果打不开可能是服务器运营商的防火墙/安全组没放开 2368 端口。
2.反向代理设置
使用 Nginx Proxy Manager (NPM)。它不仅功能强大,而且提供了一个非常直观的网页界面,可以点点鼠标就搞定域名转发和 SSL 证书(HTTPS)。
2.1 准备工作:修改 Ghost 配置
因为有了反向代理后,用户将通过域名(或 80 端口)访问,我们需要先告诉 Ghost 它的“身份”变了。编辑你之前的 docker-compose.yml:
- 修改
url:从http://IP:2368改为http://你的域名(如果没有域名,暂时先不改,或者改回http://IP)。 - 移除 Ghost 的端口映射:为了安全,我们不再把
2368暴露给外网,而是让 Nginx 在内部访问它。
2.2 编写升级版的 docker-compose.yml
我们将 Nginx Proxy Manager 加入到同一个配置文件中,让它们在同一个虚拟网络里。
vim docker-compose.ymlservices:
# --- 反向代理服务 ---
nginx-proxy:
image: 'jc21/nginx-proxy-manager:latest'
restart: always
ports:
- '80:80' # 标准 HTTP 端口
- '443:443' # 标准 HTTPS 端口
- '81:81' # NPM 管理后台端口
volumes:
- ./npm/data:/data
- ./npm/letsencrypt:/etc/letsencrypt
# --- 数据库服务 ---
db:
image: mysql:8.0
restart: always
# 强制 MySQL 8 使用兼容旧版 Ghost 的认证插件
command: --default-authentication-plugin=mysql_native_password
environment:
# 必须加双引号,强制声明为字符串
MYSQL_ROOT_PASSWORD: some_strong_password
MYSQL_DATABASE: ghost_db
volumes:
- ./mysql:/var/lib/mysql
# --- Ghost 博客服务 ---
ghost:
image: ghost:5-alpine
restart: always
depends_on:
- db
#ports:
#- "2368:2368"
# 注意:这里去掉了 ports 映射,因为由 Nginx 内部转发
environment:
url: https://你的域名
database__client: mysql
database__connection__host: db
database__connection__user: root
# 这里也必须加双引号
database__connection__password: some_strong_password
database__connection__database: ghost_db
volumes:
- ./content:/var/lib/ghost/content 2.3 重启服务
执行以下命令应用新配置:
sudo docker compose up -d2.4 在界面中配置反向代理
现在,你的服务器上运行着一个“管理后台”,专门负责领路。
- 访问管理后台:浏览器打开
http://你的服务器IP:81。 - 默认登录:
- Email:
admin@example.com - Password:
changeme - (登录后会强制要求你修改邮箱和密码)
- Email:
- 添加代理规则 (Add Proxy Host):
- Domain Names: 输入你的域名(例如
blog.yourname.com)。 - Scheme: 选择
http。 - Forward Host Name: 输入
ghost(因为在同一个 Docker 网络,Nginx 可以直接通过服务名找到它)。 - Forward Port: 输入
2368。 - 开启常用开关: 勾选
Block Common Exploits。 - 常用选项: 开启
Block Common Exploits和Websockets Support
- Domain Names: 输入你的域名(例如
2.5 一键开启 HTTPS (可选)
如果你已经有了域名并且解析到了这台服务器:
- 在刚才的配置弹窗中点击 SSL 选项卡。
- 在 SSL Certificate 下拉框选择 Request a new SSL Certificate。
- 开启 Force SSL (强制跳转 HTTPS)。
- 勾选 I Agree to the Let's Encrypt Terms of Service。
- 点击保存。NPM 会自动帮你申请证书并配置好 HTTPS 续期。
2.6 初始化你的 Ghost 博客
一切配置妥当后,你就可以彻底告别 IP 和端口号了!
- 在浏览器直接访问:
https://你的域名/ghost - 你会看到一个精美的初始化页面,在这里设置你的站点标题、管理员名字和登录密码。
[DLC] 进阶建议:检查磁盘空间
由于你的系统盘只有 30GB,运行 Docker 时建议养成定期检查的习惯。
- 查看占用:
docker system df - 清理无用镜像:
docker image prune -a(这会删除所有未被使用的镜像,释放空间)