Docker 进阶实战案例

本文分享如何通过 Docker 部署 Hexo 博客、Java 应用与 Python (Flask) 应用。内容包含场景解析、完整流程、实践经验、常见问题与资源推荐,适合需要将项目生产化容器部署的开发者。


一、用 Docker 部署 Hexo 博客(静态网站最佳实践)

背景与意义

传统网页需环境兼容、手工上传,Docker 容器可实现“快速部署 + 多云一致性”。

1. 准备静态资源

本地 Hexo 博客根目录执行:

1
hexo clean && hexo g

生成的 public/ 目录下全是已渲染好的静态文件。

2. 新建 Dockerfile,集成 Nginx

在 Hexo 根目录新建:

1
2
3
4
FROM nginx:alpine
COPY public/ /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/conf.d/default.conf # 可选自定义配置
EXPOSE 80

nginx.conf 示例(可选,自定义 SEO/缓存):

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
client_max_body_size 20m;
}

3. 构建镜像并运行

1
2
docker build -t my-hexo-blog .
docker run -d -p 80:80 --name blog my-hexo-blog
  • 如果用于线上推荐加 nginx 反向代理,或挂载静态目录、https、gzip 压缩等高级配置。
  • 挂载本地: -v $(pwd)/public:/usr/share/nginx/html:ro
  • 自动重启: --restart unless-stopped

常见部署问题与对策

  • _资源 404_:路径区分大小写或nginx配置问题
  • _自动化更新_:结合 CI/CD 工具(比如 Github Actions + Docker Hub + 云服务器 webhook 自动拉取)
  • _CDN加速_:可云商配置域名解析到 CDN,再由 CDN 回源 Docker 容器

二、Docker 化 Java Web 应用(Spring Boot 典型案例)

业务场景解析

微服务/java后端生产级方案,快速迭代上线、安全一致、支持多环境。

1. 完整 Spring Boot 应用 jar 包

1
mvn clean package -DskipTests # 生成target/demo.jar

2. Dockerfile 全参数示例

1
2
3
4
5
6
7
FROM openjdk:17-jdk-alpine
ARG JAR_FILE=target/demo.jar
COPY ${JAR_FILE} app.jar
ENV SPRING_PROFILES_ACTIVE=prod
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 CMD curl -f http://localhost:8080/actuator/health || exit 1
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
  • HEALTHCHECK 利于容器编排平台如 k8s、compose 自动监控
  • SPRING_PROFILES_ACTIVE 支持多环境一镜多用
  • 外部映射配置
    -v $(pwd)/config:/config 结合 spring.config.additional-location
  • 挂载日志目录-v /data/logs:/logs

3. 构建与运行

1
2
docker build -t springboot-demo .
docker run -d --restart unless-stopped -p 8080:8080 springboot-demo

常见生产问题与建议

  • JVM参数: 可通过 -e JAVA_OPTS="-Xms512m -Xmx1024m" 灵活配置内存
  • 端口占用: 优先用容器自定义端口如 -p 18080:8080
  • 数据持久化: 业务数据别存容器,要外部数据库、云存储

三、用 Docker 部署 Python Flask 项目(Web API/工具典型)

背景与好处

Python 运行环境差异大,依赖多,容器化后“一次搞定,多处运行”,适合API、快速上线工具类项目。

1. 多依赖项目目录结构

1
2
3
4
5
my-flask-app/
├── app.py
├── requirements.txt
├── Dockerfile
└── static/

requirements.txt

1
2
3
Flask==2.2.2
Flask-RESTful
requests

app.py 样例

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, jsonify
import requests
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello Docker Flask!'
@app.route('/api/ping')
def ping():
return jsonify({'msg': 'pong'})
if __name__ == '__main__':
app.run(host='0.0.0.0')

2. Dockerfile(升级加强版)

1
2
3
4
5
6
FROM python:3.11-slim
WORKDIR /app
COPY . /app
RUN pip install --upgrade pip && pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
EXPOSE 5000
CMD ["python", "app.py"]
  • 国内部署建议加镜像源加速
  • 多服务可用 gunicorn 或 uwsgi 托管:
    1
    CMD ["gunicorn", "-w", "4", "-b", ":5000", "app:app"]

3. 启动命令进阶

1
2
docker build -t flask-demo .
docker run -d --restart=always -p 8000:5000 flask-demo

常见安全&性能建议

  • 禁止 debug 模式上线
  • 限制源IP,或部署至内网并加负载均衡
  • 业务大并发建议用 gunicorn/uwsgi + nginx 反代

四、Docker Compose 编排 - 多服务联动

场景举例+拓扑说明(以博客+mysql为例,可扩展redis/Nginx反代)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.7'
services:
blog:
image: my-hexo-blog
ports:
- "80:80"
depends_on:
- db
db:
image: mysql:8.0
restart: always
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./nginx-conf:/etc/nginx/conf.d
depends_on:
- blog
  • depends_on 可顺序保证,比如 db 先于 blog,nginx 最后。
  • 各服务可独立端口方便本地/云平台调试
  • nginx 可做统一证书/SSL,流量转发管理静态和API
  • 推荐数据和配置文件都挂载为 volume,防配置丢失

启动:

1
docker compose up -d
  • 关闭/删除服务:docker compose down,数据卷根据实际决定是否保留

五、实际运维建议&常见排错

  • 容器日志查看:
    docker logs <容器名或ID> [-f]
  • 在线进入容器调试:
    docker exec -it <容器名> /bin/sh(alpine/部分镜像无 bash)
  • 自动重启设置:
    --restart unless-stopped (推荐生产环境)
  • 端口、用户权限问题:
    尤其云服务器记得安全组与主机防火墙(如 ufw, firewalld)打开目标端口
  • 磁盘占用清理:
    docker system prune -af + 清理无用 volume/image/container
  • 数据持久化:
    数据型文件一律 volume 映射到主机专用目录
  • 定时备份:
    可结合主机 crontab + docker exec 导出数据库/重要文件
  • _镜像加速&源_:
    国内推荐 Docker 官方镜像加速器&各云厂商加速

六、常见问题答疑&进阶实用资源

Q1:如何让应用自动升级?

  • 结合 Github Actions/Drone/Jenkins 等持续集成,实现 push 镜像自动重建和上线。

Q2:如何安全迁移数据?

  • 总是“挂载外部 volume”,主机目录定期快照;数据库用 dump 工具热备份。

Q3:生产推荐用什么监控方案?

  • 可选 Docker 官方 metrics,或独立用 Prometheus+Grafana,log可直推 ELK。

Q4:如何一套代码多环境复用?

  • 容器环境变量 + 多版本镜像 + 挂载独立配置。

Q5:出问题找不到人?社区哪里活跃?

进阶学习推荐

  • Awesome Docker
  • Docker + K8s 部署微服务
  • 制作属于自己的基础镜像(multi-stage build)
  • 持续集成 CI/CD(如 Github Actions、Gitlab CI)

七、结语

通过本文丰富的实战案例和经验小结,你可以在各类云平台、开发和运维场景下,快速上手并高效维护 Docker 化项目。想进一步了解 Kubernetes、容器安全和自动化运维,欢迎关注后续分享!