本站起源——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; done

1.2 配置 Docker 官方仓库

我们需要添加 Docker 的官方 GPG 密钥和软件源,确保后续可以通过 apt 直接更新。

  1. 更新索引并安装必要工具:
sudo apt-get update
sudo apt-get install ca-certificates curl
  1. 添加官方 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
  1. 添加软件源:
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/null

1.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-blog

1.5 编写配置文件

使用 nano 或你熟悉的编辑器(作为 LazyVim 用户,你也可以直接用 vim)创建配置文件:

vim docker-compose.yml
services:
  # 数据库服务
  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] 验证与排故

  1. 查看容器是否都活着的:
sudo docker compose ps
  1. 你应该能看到 ghostdb 两个容器的 STATUS 都是 Up
  2. 访问博客: 在浏览器输入 http://服务器ip:2368 即可看到你的博客。 输入 http://服务器ip:2368/ghost 即可进入管理员初始化界面。
  3. 如果还是打不开(看日志):
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.yml
services:
  # --- 反向代理服务 ---
  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 -d

2.4 在界面中配置反向代理

现在,你的服务器上运行着一个“管理后台”,专门负责领路。

  1. 访问管理后台:浏览器打开 http://你的服务器IP:81
  2. 默认登录
    1. Email: admin@example.com
    2. Password: changeme
    3. (登录后会强制要求你修改邮箱和密码)
  3. 添加代理规则 (Add Proxy Host)
    1. Domain Names: 输入你的域名(例如 blog.yourname.com)。
    2. Scheme: 选择 http
    3. Forward Host Name: 输入 ghost(因为在同一个 Docker 网络,Nginx 可以直接通过服务名找到它)。
    4. Forward Port: 输入 2368
    5. 开启常用开关: 勾选 Block Common Exploits
    6. 常用选项: 开启 Block Common ExploitsWebsockets Support

2.5 一键开启 HTTPS (可选)

如果你已经有了域名并且解析到了这台服务器:

  1. 在刚才的配置弹窗中点击 SSL 选项卡。
  2. 在 SSL Certificate 下拉框选择 Request a new SSL Certificate
  3. 开启 Force SSL (强制跳转 HTTPS)。
  4. 勾选 I Agree to the Let's Encrypt Terms of Service
  5. 点击保存。NPM 会自动帮你申请证书并配置好 HTTPS 续期。

2.6 初始化你的 Ghost 博客

一切配置妥当后,你就可以彻底告别 IP 和端口号了!

  1. 在浏览器直接访问:https://你的域名/ghost
  2. 你会看到一个精美的初始化页面,在这里设置你的站点标题管理员名字登录密码

[DLC] 进阶建议:检查磁盘空间

由于你的系统盘只有 30GB,运行 Docker 时建议养成定期检查的习惯。

  • 查看占用docker system df
  • 清理无用镜像docker image prune -a (这会删除所有未被使用的镜像,释放空间)