Docker Java 开发者必须掌握的 Docker 命令大全

前言

作为一名 Java 工程师,掌握 Docker 已经成为现代软件开发中的必备技能。无论是用于本地开发环境搭建、微服务部署,还是 CI/CD 流程的构建,Docker 都能显著提升我们的开发效率和部署一致性。本文将重点介绍 Java 开发人员在日常工作中最需要掌握的 Docker 命令,并结合实际开发场景进行详细解析。

一、镜像构建与管理:打造 Java 应用容器

1. 多阶段构建优化 Java 镜像

对于 Java 应用,多阶段构建可以大幅减小镜像体积,消除不必要的依赖。

dockerfile 复制代码
# Dockerfile 示例
FROM maven:3.8.4-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn package -DskipTests

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

构建命令:

bash 复制代码
# 构建镜像
docker build -t my-java-app:1.0 .

# 查看镜像层大小
docker history my-java-app:1.0

# 扫描镜像安全漏洞
docker scan my-java-app:1.0

重要参数解释:

  • -t:指定镜像名称和标签
  • .:构建上下文路径
  • --no-cache:禁用缓存构建,确保依赖最新

2. 镜像管理技巧

bash 复制代码
# 列出镜像
docker images

# 过滤显示 Java 相关镜像
docker images | grep -E '(openjdk|java|maven)'

# 删除特定镜像
docker rmi my-java-app:1.0

# 清理悬空镜像
docker image prune

二、容器运行与调试:Java 应用实践

1. 运行 Java 应用容器

bash 复制代码
# 基本运行
docker run -d --name java-app -p 8080:8080 my-java-app:1.0

# 带环境变量配置(Spring Boot 配置)
docker run -d \
  --name spring-app \
  -p 8080:8080 \
  -e "SPRING_PROFILES_ACTIVE=prod" \
  -e "JAVA_OPTS=-Xmx512m -Xms256m" \
  my-spring-app:1.0

# 挂载配置文件目录
docker run -d \
  --name java-app \
  -p 8080:8080 \
  -v $(pwd)/config:/app/config \
  my-java-app:1.0

# 使用特定网络
docker run -d \
  --name java-app \
  --network my-network \
  my-java-app:1.0

关键参数说明:

  • -e:设置环境变量,用于配置应用参数
  • -v:挂载卷,用于配置文件、日志持久化
  • --network:指定容器网络,用于微服务通信

2. 容器调试与监控

bash 复制代码
# 查看容器日志(Spring Boot 应用)
docker logs java-app

# 实时日志跟踪
docker logs -f java-app

# 查看特定时间后的日志
docker logs --since 10m java-app

# 过滤错误日志
docker logs java-app | grep -i error

# 进入容器内部调试
docker exec -it java-app /bin/bash

# 查看容器资源使用
docker stats java-app

# 检查容器详细配置
docker inspect java-app

三、开发环境实用技巧

1. 数据库容器化

bash 复制代码
# 运行 MySQL 用于开发
docker run -d \
  --name mysql-db \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=password \
  -e MYSQL_DATABASE=appdb \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0

# 运行 Redis
docker run -d \
  --name redis-cache \
  -p 6379:6379 \
  -v redis_data:/data \
  redis:6.2-alpine

2. Docker Compose 编排开发环境

yaml 复制代码
# docker-compose.yml
version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=dev
      - DATABASE_URL=jdbc:mysql://mysql:3306/appdb
    depends_on:
      - mysql
    volumes:
      - ./logs:/app/logs

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: appdb
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

常用命令:

bash 复制代码
# 启动开发环境
docker-compose up -d

# 重新构建并启动
docker-compose up -d --build

# 查看服务状态
docker-compose ps

# 查看应用日志
docker-compose logs app

# 停止环境
docker-compose down

四、生产环境注意事项

1. 资源限制与优化

bash 复制代码
# 运行容器时限制资源
docker run -d \
  --name java-app \
  --memory=1g \
  --cpus=2 \
  --memory-swap=1g \
  my-java-app:1.0

# 更新运行中容器的资源限制
docker update --memory=2g --cpus=3 java-app

2. 健康检查配置

在 Dockerfile 中添加健康检查:

dockerfile 复制代码
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8080/actuator/health || exit 1

五、常用故障排查命令

bash 复制代码
# 查看容器进程
docker top java-app

# 检查容器网络
docker exec java-app netstat -tulpn

# 分析容器性能
docker exec java-app jcmd 1 VM.version

# 复制文件到容器
docker cp application.properties java-app:/app/config/

# 从容器复制文件
docker cp java-app:/app/logs/app.log ./

六、CI/CD 集成命令

bash 复制代码
# 为镜像打标签
docker tag my-java-app:1.0 myregistry.com/java-app:1.0

# 推送镜像到仓库
docker push myregistry.com/java-app:1.0

# 从仓库拉取镜像
docker pull myregistry.com/java-app:1.0
相关推荐
白衣鸽子几秒前
【基础数据篇】数据遍历大师:Iterator模式
后端·设计模式
用户4099322502123 分钟前
想抓PostgreSQL里的慢SQL?pg_stat_statements基础黑匣子和pg_stat_monitor时间窗,谁能帮你更准揪出性能小偷?
后端·ai编程·trae
xuejianxinokok11 分钟前
什么是代数类型 ? java为什么要添加record,Sealed class 和增强switch ?
后端·rust
洛小豆11 分钟前
Git打标签仓库看不到?她说:豆子,你又忘了加 --tags!
git·后端·github
LawsonJin37 分钟前
springboot实现微信小程序支付(服务商和普通商户模式)
spring boot·后端·微信小程序
福大大架构师每日一题1 小时前
2025-10-16:有向无环图中合法拓扑排序的最大利润。用go语言,给定一个由 n 个节点(编号 0 到 n-1)构成的有向无环图,边集合用二维数组 edge
后端
只玩代码1 小时前
技术拆解:基于 Rokid CXR-M SDK 构建“AI 实时翻译眼镜伴侣”核心逻辑
后端
码码宇1 小时前
技术拆解:Rokid CXR-M SDK 如何构建流畅AR演讲提词功能
后端
沐眼1 小时前
技术拆解:Rokid CXR-M SDK 构建 AI 智能提词眼镜助手连接到场景落地
后端
阑梦清川1 小时前
docker基础学习通关教程
后端