《从零开始Docker化:把我的Hexo博客装进容器》
一、为什么要做这件事?
我之前的博客是直接在服务器上用手动部署的:
- 安装Nginx
- 把Hexo生成的静态文件复制到 /var/www/html
这样做有几个痛点:
1.环境依赖:万一服务器重装系统,又要重新配置一遍
2.迁移麻烦:换服务器时要重新搭建环境
3.版本冲突:不同项目可能依赖不同版本的软件
所以我要,把博客打包成一个独立的“箱子”,到哪都能一键运行。
二、Docker核心概念速成
概念对比表
| 概念 | 通俗理解 | 类比 |
|---|---|---|
| 镜像 | 应用的安装包 | 类似Windows的ISO文件 |
| 容器 | 镜像运行后的实例 | 类似用ISO装好的操作系统 |
| Dockerfile | 制作镜像的配方 | 类似安装说明书 |
目标: 写一个Dockerfile,把我的博客做成镜像,然后用容器运行。
三、安装Docker
# 更新包索引
apt update
# 安装依赖
apt install -y apt-transport-https ca-certificates curl
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# 添加Docker仓库
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装Docker
apt update
apt install -y docker-ce
# 启动Docker
systemctl start docker
systemctl enable docker
# 验证安装
docker --version
应该看到类似:Docker version 24.0.7, build 24.0.7
如果看到版本号,说明Docker安装成功!

四、配置镜像加速(国内用户必做)
1.在国内拉取Docker镜像会很慢,需要配置镜像加速器:
#创建配置文件
vim /etc/docker/daemon.json
写入以下内容:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn"
]
}
2.重启Docker:
systemctl daemon-reload
systemctl restart docker
# 验证加速器生效
docker info | grep -A 5 "Registry Mirrors"

五、准备博客文件
1. 找一下你的public目录(Hexo生成的静态文件)
find / -name "public" -type d 2>/dev/null
大概率是在 /root/myblog/public 或者 /home/myblog/public。

我的Hexo博客目录在 /home/mytechblog,静态文件在 public 文件夹下:
2.确认博客文件存在
# 确认博客文件存在
ls -la /home/mytechblog/public
# 应该看到 index.html 等文件

六、编写Dockerfile
1.在博客根目录创建Dockerfile:
cd /home/mytechblog
vim Dockerfile
写入以下内容:
# 使用轻量级的nginx基础镜像
FROM nginx:alpine
# 维护者信息
LABEL maintainer="zjj"
# 删除nginx默认网页
RUN rm -rf /usr/share/nginx/html/*
# 复制博客静态文件到nginx目录
COPY public/ /usr/share/nginx/html/
# 暴露80端口
EXPOSE 80
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]
2.每一行的作用:
-
FROM nginx:alpine:基于只有5MB的alpine版本nginx
-
RUN rm -rf …:清空默认页面,防止覆盖
-
COPY public/ …:把博客文件放进镜像
-
EXPOSE 80:声明容器使用80端口
-
CMD …:容器启动时运行nginx
七、构建Docker镜像
# 在Dockerfile所在目录执行
docker build -t my-hexo-blog:v1 .
参数说明:
- -t:给镜像打标签(名字:版本)
- .:使用当前目录的Dockerfile
构建过程中会看到这些:

构建成功后,查看镜像:
docker images

八、运行容器
首先,为了避免端口冲突,建议先停止之前手动运行的 Nginx:
systemctl stop nginx
# 或者如果你是用 Docker 运行的旧容器,先停止并删除它
# docker stop my-blog-container
# docker rm my-blog-container
接下来,我们运行容器。这里会逐步增加参数,让你理解每个参数的用途。
1.基础运行
docker run -d -p 80:80 --name my-blog-container my-hexo-blog:v1
-
-d:后台运行容器。
-
-p 80:80:将宿主机的 80 端口映射到容器的 80 端口。
-
–name:为容器命名,方便管理。
2. 增加容器重启策略(推荐)
如果服务器重启了,或者容器因为某些原因异常退出,我们希望容器能自动重启,保证博客在线。
docker run -d -p 80:80 --restart always --name my-blog-container my-hexo-blog:v1
–restart always:这是一个非常实用的参数。它确保:
-
容器意外退出时,Docker 会自动重启它。
-
服务器(Docker 守护进程)重启后,容器也会自动启动。
-
工作场景:部署任何希望“永远在线”的服务时,都应加上此参数。
3. 增加资源限制(生产环境必备)
在一台服务器上运行多个容器时,为了防止某个容器“吃掉”所有资源,导致系统崩溃,我们需要给它设置资源上限。
docker run -d -p 80:80 --restart always \
--memory="512m" --cpus="0.5" \
--name my-blog-container my-hexo-blog:v1
-
–memory=“512m”:限制容器最多使用 512 MB 内存。
-
–cpus=“0.5”:限制容器最多使用 0.5 个 CPU 核心。
-
工作场景:这是高密度部署或生产环境的黄金法则。可以避免“吵闹的邻居”问题,保证服务器稳定。
4. 挂载数据卷(方便更新博客)
你的博客静态文件 (public/) 是构建在镜像里的。如果以后文章更新了,需要重新构建镜像吗?其实有更灵活的办法:使用数据卷,将宿主机的博客文件目录直接挂载到容器中。
docker run -d -p 80:80 --restart always \
--name my-blog-container \
-v /home/mytechblog/public/:/usr/share/nginx/html/ \
my-hexo-blog:v1
-
-v /宿主机路径:/容器内路径:将宿主机的文件夹“挂载”到容器内部。容器内的 /usr/share/nginx/html/ 看到的其实就是你宿主机 /home/mytechblog/public/ 的内容。
-
巨大优势:以后你只需在宿主机上用 hexo g 重新生成静态文件,容器内的网站内容会实时更新,无需重启容器,更不用重新构建镜像!这完全解决了原文章提到的“迁移麻烦”和“重装系统”问题,因为数据和环境彻底分离了。
5. 终极组合:生产环境启动命令
结合以上所有最佳实践,一个健壮的、可用于生产环境的启动命令如下:
docker run -d -p 80:80 \
--restart always \
--memory="512m" --cpus="0.5" \
-v /home/mytechblog/public/:/usr/share/nginx/html/:ro \
--name my-blog-container \
my-hexo-blog:v1
新增的小优化 :ro 表示将挂载的目录设置为 只读 (read-only),进一步提升容器安全性,防止容器内进程意外修改你的博客文件。
九、验证与后续管理
运行上述命令后,用 docker ps 查看容器状态。你的博客应该已经可以通过服务器 IP 访问了。
- 查看容器资源使用情况:
docker stats my-blog-container
- 查看容器日志:
docker logs my-blog-container
总结与进阶思考
通过这个优化过程,我们不仅仅是在“运行容器”,而是在以工程化的思维部署应用。你现在掌握的不仅是 Docker 基础命令,更是:
1.自愈能力(–restart always)
2.资源管控(–memory, --cpus)
3.数据持久化与热更新(-v 数据卷)
4.安全实践(:ro 只读挂载)
这些参数和思路,可以应用到任何你未来需要容器化的 Web 应用上(比如 Nginx、Tomcat、Node.js 应用)。希望这次的优化能帮你的博客部署得更专业、更省心!
更多推荐
所有评论(0)