🚀 快速部署 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.pem
和 privkey.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 博客!如果有更多问题或需要进一步优化(如负载均衡、监控等),欢迎随时提问!🌟