使用 Docker 部署个人网站的完整流程
从零开始用 Docker Compose 部署个人网站,包括 Nginx 反向代理和 HTTPS 配置。
为什么要容器化
之前个人网站都是直接在服务器上装 Nginx、Node.js 这些,手动配置各种依赖。每次升级系统或者迁移服务器,都要重新配一遍环境,非常麻烦。而且不同服务之间的依赖可能会冲突,排查起来很头疼。
容器化之后,每个服务跑在独立的容器里,互不干扰。Docker Compose 一条命令就能启动所有服务,迁移也只需要把镜像和配置文件搬过去就行。
Dockerfile 编写
静态站点
静态站点的 Dockerfile 很简单,直接用 Nginx 官方镜像,把构建产物 COPY 进去:
FROM nginx:alpine
COPY out /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf动态服务
Node.js 服务的 Dockerfile 稍微复杂一些,利用 Docker 的层缓存优化构建速度:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]先 COPY package.json 安装依赖,再 COPY 源码。这样依赖不变时不需要重新安装,构建速度快很多。
Docker Compose 编排
把所有服务写在一个 docker-compose.yml 里:
services:
web:
build: .
ports:
- "3000:3000"
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- /etc/letsencrypt:/etc/letsencrypt:ro
depends_on:
- webNginx 作为反向代理,把 80/443 端口的请求转发到后端服务。HTTPS 证书用 Certbot 在宿主机申请,通过 volume 挂载到 Nginx 容器里。
部署脚本
写了一个简单的部署脚本,一键更新:
#!/bin/bash
git pull origin main
docker compose build
docker compose up -d
echo "Deploy complete"整个过程不到一分钟,比之前手动部署方便多了。
后续优化
目前的方案还有一些可以改进的地方:
- 加 CI/CD,push 代码自动部署
- 用 Traefik 替代 Nginx,自动申请 HTTPS 证书
- 加日志收集,方便排查问题
- 加监控告警,服务挂了能及时知道
不过对个人站点来说,当前的方案已经够用了。
相关推荐
互动