当前位置: 首页 > ds >正文

Dockerfile讲解与示例汇总

容器化技术已经成为应用开发和部署的标准方式,而Docker作为其中的佼佼者,以其轻量、高效、可移植的特性,深受开发者和运维人员的喜爱。本文将从实用角度出发,分享各类常用服务的Docker部署脚本与最佳实践,希望能帮助各位在容器化之路上少走弯路。

无论你是刚接触Docker的新手,还是寻求优化部署方案的老手,相信这篇文章都能为你提供一些有价值的参考。

Nginx部署:静态资源服务与反向代理

Nginx作为高性能的Web服务器和反向代理,是容器化部署中的常客。以下是一个实用的Nginx容器化配置,特别适合前端应用部署和API网关场景。

Dockerfile

FROM nginx:1.21-alpine# 设置时区为中国时区
ENV TZ=Asia/Shanghai# 创建非root用户nginx
RUN addgroup -g 101 -S nginx \&& adduser -S -D -H -u 101 -h /var/cache/nginx -s /sbin/nologin -G nginx -g nginx nginx \&& apk --no-cache add tzdata \&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \&& echo $TZ > /etc/timezone \# 清理临时文件,减小镜像体积&& rm -rf /var/cache/apk/*# 自定义Nginx配置
COPY nginx.conf /etc/nginx/nginx.conf
COPY default.conf /etc/nginx/conf.d/default.conf# 创建必要的目录并设置正确的权限
RUN mkdir -p /usr/share/nginx/html /var/log/nginx \&& chown -R nginx:nginx /usr/share/nginx/html /var/log/nginx /etc/nginx/conf.d \&& chmod -R 755 /usr/share/nginx/html /var/log/nginx# 使用非root用户运行
USER nginx# 暴露默认的HTTP和HTTPS端口
EXPOSE 80 443# 启动nginx
CMD ["nginx", "-g", "daemon off;"]

这个Dockerfile构建了一个基于Alpine的轻量级Nginx镜像,并进行了一些安全性和性能的优化。

部署命令

# 构建镜像
docker build -t my-nginx:v1.0 -f ops/nginx/Dockerfile .# 运行容器(挂载静态资源和配置)
docker run -d --name web-server \-p 80:80 -p 443:443 \-v /path/to/html:/usr/share/nginx/html \-v /path/to/conf:/etc/nginx/conf.d \-v /path/to/logs:/var/log/nginx \--restart always \my-nginx:v1.0

使用技巧

  1. 配置文件挂载:将Nginx配置文件挂载到容器外部,方便修改配置而无需重建镜像
  2. 日志持久化:将日志目录挂载出来,便于问题排查和日志分析
  3. 静态资源更新:前端代码可以直接更新挂载目录,无需重启容器
  4. 性能优化:根据实际场景调整worker进程数和连接数

在实际生产环境中,我们经常会将Nginx作为整个系统的入口,配合后端服务实现负载均衡和流量控制。

Java应用容器化部署

Java应用在企业级开发中占据重要地位,将Spring Boot等Java应用容器化可以显著提升部署效率和环境一致性。

Dockerfile

FROM openjdk:8-jre-slim# 设置工作目录
WORKDIR /app# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# 创建非root用户
RUN groupadd -r javauser && useradd -r -g javauser javauser# 创建日志和配置目录
RUN mkdir -p /app/logs /app/config \&& chown -R javauser:javauser /app# 复制预先构建好的jar文件到容器中
COPY app.jar /app/app.jar
RUN chown javauser:javauser /app/app.jar# 切换到非root用户
USER javauser# 设置环境变量
ENV JAVA_OPTS="-Xms512m -Xmx1024m"
ENV SPRING_PROFILES_ACTIVE="prod"# 暴露应用端口
EXPOSE 8080# 启动应用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

为什么选择openjdk:8-jre-slim而非openjdk:8?

在我们的Dockerfile中,选择了openjdk:8-jre-slim作为基础镜像,这是经过深思熟虑的决定。以下是两者的比较:

特性openjdk:8-jre-slimopenjdk:8
镜像大小约170-180MB约500MB以上
包含组件仅JRE,用于运行Java应用完整JDK,包含编译、调试工具
基础系统基于Debian精简版基于完整Debian
启动时间更快较慢
安全面较小较大

使用jre-slim版本的优势:

  1. 镜像体积更小:体积减少60%以上,节省存储空间、网络带宽,加快部署速度
  2. 资源占用更少:移除了不必要的组件,降低了内存占用
  3. 更高的安全性:减少了潜在的攻击面,遵循最小权限原则
  4. 更适合微服务架构:轻量级容器更符合微服务的设计理念

什么情况下应考虑使用完整的openjdk:8:

  1. 当应用在运行时需要进行动态编译(如使用JIT)
  2. 需要在容器中进行开发或调试
  3. 应用依赖于JDK中的特定工具(如javac、jmap等)

在我们的生产实践中,对于绝大多数后端服务,jre-slim版本已经完全满足需求,同时带来了显著的资源效率提升。正如DevOps的核心理念一样,我们始终追求"恰到好处"的资源配置,而非过度配置。

部署命令

# 构建镜像
docker build -t my-java-app:v1.0 -f ops/java/Dockerfile .# 运行容器
docker run -d --name java-service \-p 8080:8080 \-v /path/to/logs:/app/logs \-v /path/to/config:/app/config \-e JAVA_OPTS="-Xms512m -Xmx1024m" \-e SPRING_PROFILES_ACTIVE=prod \--restart always \my-java-app:v1.0

使用技巧

  1. 内存优化:通过环境变量调整JVM参数,适配不同规格的容器
  2. 配置外部化:将配置文件挂载到容器外,支持不同环境的配置管理
  3. 健康检查:添加健康检查端点,便于容器编排平台进行自动故障恢复
  4. JVM调优:根据应用特性,调整GC策略和内存分配

在我们的生产环境中,Java应用通常会配合服务注册中心(如Nacos或Eureka)实现微服务架构,容器化部署让服务扩缩变得更加灵活。

Python应用容器化部署

Python因其简洁高效的特性,在数据处理、AI和Web开发等领域广受欢迎。容器化Python应用可以有效解决"在我机器上能运行"的问题。

Dockerfile

FROM python:3.9-slim# 设
http://www.xdnf.cn/news/2853.html

相关文章:

  • C#进阶学习(十六)C#中的迭代器
  • VASP 教程:VASP 结合 phonopy 计算硅的声子谱
  • Electron 入门指南
  • [minilibc] 库文件的调用放置
  • 案例篇:如何用tcpdump和Wireshark识别潜在威胁
  • 大学之大:韩国科学技术研究院2025.4.28
  • Python依据卫星TLE轨道根数,计算可见时间窗口
  • Web 基础与Nginx访问统计
  • SECS-I vs HSMS-SS vs HSMS-GS 通信控制对比明细表
  • TypeScript 实用类型深度解析:Partial、Pick、Record 的妙用
  • SQL常用数据清洗语句
  • Python爬虫学习路径与实战指南 02
  • 苍穹外卖10
  • React学习
  • Spring系列四:AOP切面编程第四部分
  • 计网分层体系结构(包括OSI,IP,两者对比和相关概念)
  • 免费LUT网站
  • 花费7元训练自己的GPT 2模型
  • 4月28日信息差全景:国际局势、科技突破与市场震荡一、国际政治与安全:俄乌冲突关键转折
  • 利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件
  • Python面试问题
  • 贪心算法-2208.将数组和减半的最小操作数-力扣(LeetCode)
  • 遥控器的智能跟踪与多路径优化模块要点!
  • 【网络编程】TCP/IP四层模型、MAC和IP
  • MySQL 的ANALYZE与 OPTIMIZE命令
  • 使用 ELK 实现全链路追踪:从零到一的实践指南
  • pycharm 配置路径映射 将本地文件映射(mapping)到远程服务器上
  • [Spring] Seata详解
  • Missashe考研日记-day29
  • 6.进程概念(中)