本文档说明如何使用 Docker 部署 CJYDocs 文档管理系统。
# 1. 构建镜像
docker build -t cjydocs:latest .
# 2. 运行容器
docker run -d \
--name cjydocs \
-p 3000:3000 \
-v $(pwd)/docs:/app/docs \
-v $(pwd)/index.md:/app/index.md \
--restart unless-stopped \
cjydocs:latest
# 3. 查看日志
docker logs -f cjydocs
# 4. 停止容器
docker stop cjydocs
# 5. 删除容器
docker rm cjydocs
Dockerfile 采用多阶段构建优化镜像大小:
-v $(pwd)/docs:/app/docs # 文档存储目录
-v $(pwd)/index.md:/app/index.md # 文档结构配置
# 自定义样式
-v $(pwd)/public/css/style.css:/app/public/css/style.css
# 自定义前端脚本
-v $(pwd)/public/js:/app/public/js
| 变量名 | 默认值 | 说明 |
|---|---|---|
NODE_ENV |
production |
Node.js 运行环境 |
PORT |
3000 |
应用监听端口 |
| 容器端口 | 宿主机端口 | 说明 |
|---|---|---|
3000 |
3000 |
HTTP 服务端口 |
可以修改 docker run 命令中的端口映射:
# 映射到宿主机 8080 端口
docker run -d -p 8080:3000 ...
所有文档存储在 ./docs 目录,通过卷挂载持久化:
# 宿主机目录结构
docs/
├── 分类1/
│ ├── 文档A.md
│ └── 文档B.md
└── 分类2/
└── 文档C.md
在宿主机修改文档后,容器内立即生效(有5秒缓存)。
index.md 定义文档结构,修改后刷新浏览器即可看到变化。
docker ps | grep cjydocs
docker exec -it cjydocs sh
docker logs -f cjydocs
# 1. 停止并删除旧容器
docker stop cjydocs
docker rm cjydocs
# 2. 重新构建镜像
docker build --no-cache -t cjydocs:latest .
# 3. 启动新容器
docker run -d \
--name cjydocs \
-p 3000:3000 \
-v $(pwd)/docs:/app/docs \
-v $(pwd)/index.md:/app/index.md \
--restart unless-stopped \
cjydocs:latest
# 备份整个 docs 目录
tar -czf docs_backup_$(date +%Y%m%d).tar.gz docs/ index.md
# 从容器中导出数据
docker cp cjydocs:/app/docs ./docs_backup/
docker cp cjydocs:/app/index.md ./docs_backup/
# 解压备份
tar -xzf docs_backup_20231201.tar.gz
# 重启容器使更改生效
docker restart cjydocs
可以使用 Docker 命令行参数限制容器资源:
docker run -d \
--name cjydocs \
--cpus="1" \ # 最多使用 1 个 CPU 核心
--memory="512m" \ # 最多使用 512MB 内存
-p 3000:3000 \
-v $(pwd)/docs:/app/docs \
-v $(pwd)/index.md:/app/index.md \
--restart unless-stopped \
cjydocs:latest
Dockerfile 中已配置健康检查,每 30 秒自动检查一次应用状态。
查看健康状态:
docker inspect --format='{{.State.Health.Status}}' cjydocs
可以通过 Docker 命令行参数配置日志:
docker run -d \
--name cjydocs \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
-p 3000:3000 \
-v $(pwd)/docs:/app/docs \
-v $(pwd)/index.md:/app/index.md \
--restart unless-stopped \
cjydocs:latest
这样配置后,总日志占用不超过 30MB (10MB × 3 个文件)。
如果使用 Nginx 作为反向代理:
server {
listen 80;
server_name docs.example.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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;
}
}
如果需要多个容器通信,可以创建自定义网络:
# 创建网络
docker network create app-network
# 运行容器时连接到网络
docker run -d \
--name cjydocs \
--network app-network \
-p 3000:3000 \
-v $(pwd)/docs:/app/docs \
-v $(pwd)/index.md:/app/index.md \
cjydocs:latest
# 其他容器也连接到同一网络
docker run -d \
--name nginx \
--network app-network \
-p 80:80 \
nginx:alpine
# 查看详细日志
docker logs cjydocs
# 检查端口占用
netstat -an | grep 3000
# Windows: netstat -an | findstr 3000
# 检查卷挂载权限
ls -la docs/
# 进入容器手动测试
docker exec -it cjydocs sh
wget -O- http://localhost:3000/api/structure
docker exec cjydocs ls -la /app/docsdocker restart cjydocsdocker stats cjydocs通过 Docker 命令行传递环境变量:
docker run -d \
--name cjydocs \
-e NODE_ENV=production \
-e PORT=3000 \
-p 3000:3000 \
-v $(pwd)/docs:/app/docs \
-v $(pwd)/index.md:/app/index.md \
--restart unless-stopped \
cjydocs:latest
使用 Let's Encrypt + Nginx 反向代理,或使用 Traefik。
设置定时任务备份 docs/ 和 index.md。
镜像扫描: 使用 docker scan 扫描镜像漏洞
docker scan cjydocs:latest
A: 修改 docker run 命令中的端口映射:
docker run -d -p 8080:3000 ... # 宿主机使用 8080 端口
A: 直接在宿主机 docs/ 目录下添加文件,并更新 index.md,无需重启容器。
A: 使用 docker exec:
docker exec cjydocs ls -la /app/docs
A: 查看实时资源使用:
docker stats cjydocs