一、为什么要做这件事?

我之前的博客是直接在服务器上用手动部署的:

  • 安装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 应用)。希望这次的优化能帮你的博客部署得更专业、更省心!

更多推荐