🚀 快速部署 Ghost 博客!(Docker 教程)🌟

欢迎体验这篇充满活力的教程!我们将通过 Docker 单独部署 Ghost 博客,并结合 Nginx 和 MySQL 实现一个完整的博客系统。本教程不使用 Docker Compose,而是通过 docker run 命令分开部署每个服务。此外,我们还会为你介绍如何配置 Docker 加速镜像(registry-mirror),解决国内拉取镜像慢的问题。🎉


🎯 前置条件

在开始之前,请确保你的系统满足以下条件:

  • 已安装 Docker(建议使用最新版本)。
  • 有一台服务器或本地环境(本教程使用公网 IP 1.2.3.4 作为示例)。
  • 熟悉基本的 Linux 命令和 Docker 操作。

🛠️ 配置 Docker 加速镜像

由于 Docker Hub 在国内访问速度较慢,我们可以通过配置 Docker 的 registry-mirror 来加速镜像拉取。本教程使用 https://docker.1ms.run 作为镜像加速地址。

1. 编辑 Docker 配置文件

在 Linux 系统上,Docker 的配置文件通常位于 /etc/docker/daemon.json。如果文件不存在,可以创建一个。

运行以下命令编辑文件:

sudo nano /etc/docker/daemon.json

2. 添加加速配置

在文件中添加以下内容:

{
  "registry-mirrors": [
    "https://docker.1ms.run"
  ]
}

保存文件并退出(在 nano 中,按 Ctrl+O 保存,Ctrl+X 退出)。

3. 重启 Docker 服务

应用配置需要重启 Docker 服务:

sudo systemctl restart docker

4. 验证加速配置

运行以下命令,检查配置是否生效:

docker info --format '{{.RegistryConfig.Mirrors}}'

如果输出中包含 https://docker.1ms.run,说明加速配置成功!🚀


🌐 创建自定义网络

为了让 Nginx、MySQL 和 Ghost 容器在同一网络中通信,我们需要创建一个自定义网络 custom。运行以下命令:

docker network create custom

如果网络已经存在,可以跳过此步骤。


🗄️ 部署 MySQL 容器

MySQL 是 Ghost 的数据库后端,我们将在服务器上部署一个 MySQL 容器。本教程使用 mysql:latest 镜像,并设置统一密码 1234qwer(包含一个点)。

1. 运行 MySQL 容器

运行以下命令部署 MySQL 容器:

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_DATABASE=ghost \
  -e MYSQL_USER=ghost \
  -e MYSQL_PASSWORD=1234qwer \
  -e MYSQL_ROOT_PASSWORD=1234qwer \
  -v mysql_data:/var/lib/mysql \
  --network custom \
  --restart unless-stopped \
  mysql:latest

2. 命令说明

  • mysql:latest:使用最新的 MySQL 镜像(生产环境中建议使用固定版本,如 mysql:8.0)。
  • --network custom:将 MySQL 容器加入自定义网络 custom
  • -e MYSQL_PASSWORD=1234qwer:设置 MySQL 用户密码。
  • -e MYSQL_ROOT_PASSWORD=1234qwer:设置 MySQL root 用户密码。
  • -v mysql_data:/var/lib/mysql:挂载数据卷,持久化 MySQL 数据。
  • --restart unless-stopped:容器在手动停止前会自动重启。

3. 创建数据卷

如果这是第一次运行 MySQL 容器,需要先创建数据卷:

docker volume create mysql_data

4. 注意事项

  • 网络通信:在自定义网络 custom 中,Ghost 可以通过容器名称 mysql 直接访问 MySQL,无需公网 IP 或端口映射。
  • 端口暴露:如果你需要在外部访问 MySQL(例如通过 MySQL 客户端),保留了 -p 3306:3306。如果不需要外部访问,可以去掉此参数以提高安全性。

📝 部署 Ghost 容器

Ghost 是我们的博客核心,我们将在服务器上部署一个 Ghost 容器。本教程使用 ghost:latest 镜像,并设置文件映射路径为 /dockerdata/ghost:/var/lib/ghost/content

1. 创建文件映射路径

在运行 Ghost 容器之前,确保主机上的 /dockerdata/ghost 目录已存在。如果不存在,可以先创建:

sudo mkdir -p /dockerdata/ghost

2. 运行 Ghost 容器

运行以下命令部署 Ghost 容器:

docker run -d \
  --name ghost \
  -p 2368:2368 \
  -v /dockerdata/ghost:/var/lib/ghost/content \
  -e url=http://1.2.3.4 \
  -e database__client=mysql \
  -e database__connection__host=mysql \
  -e database__connection__user=ghost \
  -e database__connection__password=1234qwer \
  -e database__connection__database=ghost \
  --network custom \
  --restart unless-stopped \
  ghost:latest

3. 命令说明

  • ghost:latest:使用最新的 Ghost 镜像(生产环境中建议使用固定版本,如 ghost:5)。
  • -v /dockerdata/ghost:/var/lib/ghost/content:挂载 Ghost 的内容目录,持久化数据。
  • -e url=http://1.2.3.4:设置博客的访问地址(替换为你的实际 IP 或域名)。
  • -e database__connection__host=mysql:设置 MySQL 主机为 mysql(自定义网络中 MySQL 容器的名称)。
  • --network custom:将 Ghost 容器加入自定义网络 custom
  • --restart unless-stopped:容器在手动停止前会自动重启。

4. 注意事项

  • URL 配置:确保 url 与实际访问地址一致。如果未来启用 HTTPS,需改为 https://your-domain.com
  • 密码中的特殊字符:密码 1234qwer 包含一个点(.),在 Docker 环境中通常不会有问题。如果遇到解析问题,可以用引号包裹,例如 -e database__connection__password="1234qwer"

🌍 部署 Nginx 容器

Nginx 作为反向代理,可以优化访问体验并支持未来的 HTTPS 配置。我们将在服务器上部署一个 Nginx 容器,并挂载配置文件目录 /dockerdata/nginx/conf.d

1. 创建 Nginx 配置文件目录

在运行 Nginx 容器之前,确保主机上的 /dockerdata/nginx/conf.d 目录已存在。如果不存在,可以先创建:

sudo mkdir -p /dockerdata/nginx/conf.d

2. 创建 Nginx 配置文件

/dockerdata/nginx/conf.d 目录中创建一个配置文件 ghost.conf,内容如下(仅支持 HTTP):

server {
    listen 80;
    server_name 1.2.3.4;  # 替换为你的 IP 或域名

    location / {
        proxy_pass http://ghost:2368;  # 使用容器名称 ghost
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3. 运行 Nginx 容器

运行以下命令部署 Nginx 容器:

docker run -d \
  --name nginx \
  -p 80:80 \
  -v /dockerdata/nginx/conf.d:/etc/nginx/conf.d \
  --network custom \
  --restart unless-stopped \
  nginx:latest

4. 命令说明

  • nginx:latest:使用最新的 Nginx 镜像(生产环境中建议使用固定版本,如 nginx:1.25)。
  • -v /dockerdata/nginx/conf.d:/etc/nginx/conf.d:挂载 Nginx 配置文件目录。
  • --network custom:将 Nginx 容器加入自定义网络 custom,可以通过容器名称 ghost 访问 Ghost。
  • --restart unless-stopped:容器在手动停止前会自动重启。

5. 注意事项

  • 配置文件:确保 /dockerdata/nginx/conf.d 目录中至少有一个有效的 .conf 文件(如 ghost.conf),否则 Nginx 可能启动失败。

防火墙:确保主机的 80 端口已开放(通过防火墙或云服务器的安全组)。
示例(Ubuntu 使用 ufw):

sudo ufw allow 80
sudo ufw enable

🧪 测试和验证

部署完成后,我们需要验证服务是否正常运行。

1. 验证 MySQL 连接

在服务器上运行以下命令,测试是否能连接到 MySQL:

docker run --rm -it --network custom mysql:latest mysql -h mysql -u ghost -p

输入密码 1234qwer 后,如果能成功登录,说明 MySQL 连接正常。

2. 验证 Ghost 服务

访问 http://1.2.3.4,确认 Ghost 博客正常运行。如果页面加载失败,可以检查 Ghost 日志:

docker logs ghost

3. 验证 Nginx 服务

访问 http://1.2.3.4,确认 Nginx 正确代理到 Ghost。如果代理失败,可以检查 Nginx 日志:

docker logs nginx

4. 初始化 Ghost

访问 http://1.2.3.4/ghost 进入 Ghost 管理后台,按照提示完成初始化设置(创建管理员账户等)。


🔒 启用 HTTPS(可选)

如果你计划启用 HTTPS(推荐用于生产环境),需要获取 SSL 证书并修改 Nginx 配置。以下是步骤:

1. 获取 SSL 证书

使用 Certbot 或其他工具为你的域名生成 SSL 证书。以下是示例步骤(假设你有域名 your-domain.com):

将证书复制到挂载目录:

sudo mkdir -p /dockerdata/nginx/ssl
sudo cp /etc/letsencrypt/live/your-domain.com/fullchain.pem /dockerdata/nginx/ssl/
sudo cp /etc/letsencrypt/live/your-domain.com/privkey.pem /dockerdata/nginx/ssl/

使用 Certbot 生成证书:

sudo certbot certonly --standalone -d your-domain.com

生成的证书通常存放在 /etc/letsencrypt/live/your-domain.com/ 目录下,包含 fullchain.pemprivkey.pem

安装 Certbot(以 Ubuntu 为例):

sudo apt update
sudo apt install certbot python3-certbot-nginx

2. 修改 Nginx 配置文件

编辑 /dockerdata/nginx/conf.d/ghost.conf,添加 HTTPS 支持,内容如下:

server {
    listen 80;
    server_name your-domain.com;  # 替换为你的域名
    return 301 https://$host$request_uri;  # 重定向 HTTP 到 HTTPS
}

server {
    listen 443 ssl;
    server_name your-domain.com;  # 替换为你的域名

    ssl_certificate /etc/nginx/ssl/fullchain.pem;  # SSL 证书路径
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;  # SSL 私钥路径

    location / {
        proxy_pass http://ghost:2368;  # 使用容器名称 ghost
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3. 修改 Nginx 容器

停止并删除当前的 Nginx 容器,然后运行修改后的命令,添加 443 端口和 SSL 证书挂载:

docker stop nginx
docker rm nginx
docker run -d \
  --name nginx \
  -p 80:80 \
  -p 443:443 \
  -v /dockerdata/nginx/conf.d:/etc/nginx/conf.d \
  -v /dockerdata/nginx/ssl:/etc/nginx/ssl \
  --network custom \
  --restart unless-stopped \
  nginx:latest

4. 更新 Ghost 的 URL

确保 Ghost 的 url 环境变量设置为 https://your-domain.com,停止并重新运行 Ghost 容器:

docker stop ghost
docker rm ghost
docker run -d \
  --name ghost \
  -p 2368:2368 \
  -v /dockerdata/ghost:/var/lib/ghost/content \
  -e url=https://your-domain.com \
  -e database__client=mysql \
  -e database__connection__host=mysql \
  -e database__connection__user=ghost \
  -e database__connection__password=1234qwer \
  -e database__connection__database=ghost \
  --network custom \
  --restart unless-stopped \
  ghost:latest

5. 测试 HTTPS 访问

访问 https://your-domain.com,确认博客正常运行。如果遇到证书错误,确保防火墙已开放 443 端口:

sudo ufw allow 443

🛠️ 管理容器

以下是常用的容器管理命令:

1. 查看容器状态

docker ps

2. 查看容器日志

Nginx 日志:

docker logs nginx

Ghost 日志:

docker logs ghost

MySQL 日志:

docker logs mysql

3. 停止容器

停止 Nginx 容器:

docker stop nginx

停止 Ghost 容器:

docker stop ghost

停止 MySQL 容器:

docker stop mysql

4. 启动容器

启动 Nginx 容器:

docker start nginx

启动 Ghost 容器:

docker start ghost

启动 MySQL 容器:

docker start mysql

5. 删除容器

删除 Nginx 容器:

docker rm nginx

删除 Ghost 容器(数据卷不会被删除):

docker rm ghost

删除 MySQL 容器(数据卷不会被删除):

docker rm mysql

6. 删除数据卷(谨慎操作)

删除 Ghost 数据卷(注意:Ghost 使用的是文件映射 /dockerdata/ghost,无需删除数据卷):

# 不需要运行此命令,直接删除 /dockerdata/ghost 目录即可
sudo rm -rf /dockerdata/ghost

删除 MySQL 数据卷:

docker volume rm mysql_data

🎉 总结

通过以上步骤,你已经成功使用 Docker 部署了一个完整的 Ghost 博客系统,包括 MySQL、Ghost 和 Nginx!🚀 如果你需要生产环境,强烈建议:

  • 使用固定版本的镜像。
  • 配置 HTTPS 和域名。
  • 定期备份数据库。

希望这篇教程能帮助你快速上手 Ghost 博客!如果有更多问题或需要进一步优化(如负载均衡、监控等),欢迎随时提问!🌟