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
相关推荐
COTAS6 小时前
K8S 知识框架和命令操作
java·容器·kubernetes
james的分享6 小时前
Spring boot注解介绍
java·spring boot·后端
雨绸缪6 小时前
如何在 SAP PI 系统新增字段并传输给外部系统
后端
程序员的世界你不懂6 小时前
【Flask】测试平台开发,开发实现应用搜索和分页-第十篇
后端·python·flask
Molder6216 小时前
【计算机408计算机网络】第四章:自底向上五层模型之网络层
网络·笔记·后端·计算机网络·考研
lypzcgf7 小时前
Coze源码分析-API授权-删除令牌-后端源码
数据库·人工智能·后端·系统架构·开源·go·安全架构
逾非时7 小时前
docker 网络配置
docker·云原生·eureka
待磨的钝刨7 小时前
本地构建的 Docker 镜像迁移到另一台电脑上运行
docker·容器·eureka
bobz9657 小时前
堆叠 和 mlag 有什么区别
后端