Docker拉取与部署OpenJDK到实际应用的完整流程

 更新时间:2025年11月27日 10:16:28   作者:油墨香^_^  
这篇文章主要介绍了Docker拉取与部署OpenJDK到实际应用的相关资料,包括镜像拉取、容器运行、Java程序测试、Dockerfile构建优化、容器管理、Spring Boot应用部署、数据持久化与网络配置、常用问题与解决方案以及最佳实践总结,需要的朋友可以参考下

本文将详细解析如何使用Docker拉取OpenJDK镜像并部署Java应用程序,涵盖从Docker基础概念到实际应用的完整流程。

1. Docker核心概念解析

1.1 Docker是什么?

Docker是一个开源的容器化平台,允许开发者将应用程序及其所有依赖项打包到一个轻量级、可移植的容器中。它基于Go语言开发,利用Linux内核的cgroup、namespace和OverlayFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。

与传统虚拟机相比,Docker容器直接运行于宿主内核,无需启动完整的操作系统,因此具有启动更快、资源消耗更少、性能更高的特点。一个相同配置的主机,可以运行比虚拟机更多数量的应用。

1.2 镜像、容器与仓库

  • 镜像(Image):一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件,不包含任何动态数据,内容在构建后不会改变。镜像采用分层存储架构,每一层构建后就不会再改变。

  • 容器(Container):镜像运行的实体,可以被创建、启动、停止、删除、暂停等。容器实质上是运行于独立命名空间的进程,拥有自己的root文件系统、网络配置、进程空间。

  • 仓库(Repository):集中存储和分发镜像的服务。一个Docker Registry中可以包含多个仓库;每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。最常用的公开服务是Docker Hub。

2. Docker环境安装与配置

2.1 安装Docker

Ubuntu系统安装示例

bash

# 更新apt-get
sudo apt-get update

# 安装docker
sudo apt-get install -y docker.io

# 启动docker服务
sudo service docker start

# 验证安装
docker --version

安装完成后,使用docker --version命令验证安装是否成功。

CentOS/Red Hat系统安装

bash

# 安装必要工具
yum install -y yum-utils

# 添加Docker仓库(使用阿里云镜像)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装Docker
yum install docker-ce docker-ce-cli containerd.io

# 启动Docker
systemctl start docker
systemctl enable docker  # 设置开机自启

2.2 配置镜像加速器

为了提升在国内拉取Docker镜像的速度,建议配置镜像加速器。

阿里云加速器配置

  1. 注册阿里云账号并获取专属加速器地址

  2. 创建或编辑Docker配置文件:

bash

mkdir -p /etc/docker
touch /etc/docker/daemon.json
  1. /etc/docker/daemon.json中添加:

json

{
  "registry-mirrors": ["https://your-code.mirror.aliyuncs.com"]
}
  1. 重启Docker服务:

bash

systemctl daemon-reload
systemctl restart docker

3. OpenJDK镜像的拉取与使用

3.1 拉取OpenJDK镜像

Docker Hub提供了官方的OpenJDK镜像,可以通过以下命令拉取:

bash

# 拉取最新版OpenJDK
docker pull openjdk

# 拉取指定版本的OpenJDK
docker pull openjdk:11

# 拉取基于Alpine Linux的轻量级OpenJDK
docker pull openjdk:8-jre-alpine

参数说明

  • openjdk:11:指定拉取OpenJDK 11版本

  • openjdk:8-jre-alpine:基于Alpine Linux的OpenJDK 8 JRE,镜像体积更小

3.2 验证镜像

拉取完成后,可以使用以下命令查看本地镜像:

bash

docker images

输出示例:

text

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
openjdk      11        1a45186e33c6   2 weeks ago   420MB
openjdk      8-jre-alpine c529fb7782f9 3 days ago   82MB

3.3 运行简单Java程序

拉取OpenJDK镜像后,可以运行一个简单的Java程序进行测试:

bash

# 直接运行Java版本检查
docker run --rm openjdk:11 java -version

# 交互式进入容器
docker run -it openjdk:11 /bin/bash

在容器内部,你可以执行Java命令,编译和运行Java程序。

4. 使用Dockerfile构建Java应用镜像

4.1 创建Dockerfile

Dockerfile是一个文本文件,包含了一系列构建镜像的指令。下面是一个典型的Java应用Dockerfile:

dockerfile

# 使用官方的OpenJDK镜像作为基础镜像[citation:5]
FROM openjdk:11

# 设置工作目录[citation:5]
WORKDIR /app

# 复制应用程序文件到容器中[citation:5]
COPY target/my-app.jar /app/my-app.jar

# 暴露应用端口
EXPOSE 8080

# 指定容器启动时执行的命令[citation:5]
CMD ["java", "-jar", "my-app.jar"]

4.2 优化Dockerfile

为了提高构建效率和减少镜像大小,可以采用以下优化策略:

使用多阶段构建

dockerfile

# 第一阶段:构建阶段
FROM maven:3.6-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 第二阶段:运行阶段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/my-app.jar /app/my-app.jar
EXPOSE 8080
CMD ["java", "-jar", "my-app.jar"]

多阶段构建可以分离编译和运行环境,减少最终镜像的大小。

使用轻量级基础镜像

  • openjdk:jre-slim:仅包含运行Java应用必要的组件

  • openjdk:alpine:基于Alpine Linux,体积更小

4.3 构建镜像

使用docker build命令构建镜像:

bash

docker build -t my-java-app:1.0 .

参数说明:

  • -t my-java-app:1.0:指定镜像名称和标签

  • .:构建上下文路径,Dockerfile所在目录

5. 运行和管理Java容器

5.1 启动Java容器

基础启动

bash

docker run -d --name my-java-app my-java-app:1.0

带端口映射的启动

bash

docker run -d -p 8080:8080 --name my-java-app my-java-app:1.0

带环境变量配置的启动

bash

docker run -d \
  -p 8080:8080 \
  --name my-java-app \
  -e "SPRING_PROFILES_ACTIVE=prod" \
  -e "DB_URL=jdbc:mysql://host.docker.internal:3306/mydb" \
  my-java-app:1.0

5.2 容器管理命令

bash

# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 停止容器
docker stop my-java-app

# 启动已停止的容器
docker start my-java-app

# 重启容器
docker restart my-java-app

# 删除容器
docker rm my-java-app

# 查看容器日志
docker logs my-java-app

# 实时查看日志
docker logs -f my-java-app

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

6. 实战示例:部署Spring Boot应用

6.1 准备Spring Boot应用

假设我们有一个Spring Boot应用,需要先使用Maven或Gradle打包:

bash

mvn clean package

打包后会在target目录生成一个WAR或JAR文件。

6.2 创建Dockerfile

dockerfile

# 使用轻量级OpenJDK镜像
FROM openjdk:8-jre-alpine[citation:2]

# 复制WAR文件到镜像[citation:2]
COPY target/spring-boot-app-0.0.1-SNAPSHOT.war /app.war[citation:2]

# 运行应用[citation:2]
CMD ["/usr/bin/java", "-jar", "-Dspring.profiles.active=default", "/app.war"][citation:2]

6.3 构建和运行

bash

# 构建镜像
docker build -t spring-boot-app:latest .[citation:2]

# 运行容器
docker run -d -p 8080:8080 spring-boot-app:latest[citation:2]

访问http://localhost:8080即可查看应用。

7. 数据持久化与网络配置

7.1 数据卷挂载

为了保证容器数据持久化,可以使用数据卷挂载:

bash

# 创建命名卷
docker volume create my-app-data

# 运行容器并挂载卷
docker run -d \
  -p 8080:8080 \
  --name my-java-app \
  -v my-app-data:/app/data \
  my-java-app:1.0
  
# 挂载主机目录
docker run -d \
  -p 8080:8080 \
  --name my-java-app \
  -v /host/path/logs:/app/logs \
  my-java-app:1.0

7.2 容器网络配置

创建自定义网络

bash

# 创建网络
docker network create my-app-network

# 在自定义网络中运行容器
docker run -d \
  --name my-java-app \
  --network my-app-network \
  -p 8080:8080 \
  my-java-app:1.0

连接多个容器

bash

# 运行MySQL容器
docker run -d \
  --name mysql-db \
  --network my-app-network \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=myapp \
  mysql:8.0

# 运行Java应用并连接MySQL
docker run -d \
  --name my-java-app \
  --network my-app-network \
  -p 8080:8080 \
  -e "DB_URL=jdbc:mysql://mysql-db:3306/myapp" \
  my-java-app:1.0

8. 常用问题与解决方案

8.1 镜像拉取失败

问题:拉取镜像时网络超时或失败。

解决方案

  1. 配置国内镜像加速器

  2. 检查网络连接

  3. 使用代理(如需要)

bash

# 临时使用代理
docker pull --platform linux/amd64 openjdk:11

8.2 容器端口冲突

问题:端口已被占用,导致容器启动失败。

解决方案:更改主机端口或停止占用端口的进程。

bash

# 更改映射端口(将主机端口改为8081)
docker run -d -p 8081:8080 --name my-java-app my-java-app:1.0

8.3 应用性能问题

问题:Java应用在容器中性能不佳。

解决方案

  1. 合理设置JVM内存参数

  2. 使用适合容器环境的JVM

bash

docker run -d \
  -p 8080:8080 \
  --name my-java-app \
  -e "JAVA_OPTS=-Xmx512m -Xms256m" \
  my-java-app:1.0

8.4 容器时区问题

问题:容器内时区与宿主机不一致。

解决方案:挂载时区文件或设置环境变量。

bash

# 方法一:挂载时区文件
docker run -d \
  -p 8080:8080 \
  --name my-java-app \
  -v /etc/timezone:/etc/timezone:ro \
  -v /etc/localtime:/etc/localtime:ro \
  my-java-app:1.0

# 方法二:设置环境变量
docker run -d \
  -p 8080:8080 \
  --name my-java-app \
  -e TZ=Asia/Shanghai \
  my-java-app:1.0

9. 最佳实践总结

9.1 安全最佳实践

  1. 使用非root用户运行容器

    dockerfile

    FROM openjdk:11-jre-slim
    RUN groupadd -r java-user && useradd -r -g java-user java-user
    USER java-user
    # 其余指令...
  2. 定期更新基础镜像,确保安全补丁及时应用

  3. 扫描镜像漏洞

    bash

    # 使用Docker Security Scanning或第三方工具
    docker scan my-java-app:1.0

9.2 性能优化实践

  1. 使用多阶段构建减少镜像大小

  2. 合理利用Docker缓存层,将不经常变化的层放在前面

  3. 使用.dockerignore文件,排除不必要的构建上下文文件

9.3 运维最佳实践

  1. 使用容器编排工具(如Docker Compose、Kubernetes)管理多容器应用

  2. 配置日志轮转,防止日志占满磁盘

  3. 设置资源限制

    bash

    docker run -d \
      --name my-java-app \
      --memory=512m \
      --cpus=1.0 \
      my-java-app:1.0

总结

通过本文的详细介绍,你应该已经掌握了使用Docker拉取OpenJDK镜像并部署Java应用的完整流程。从基础概念到高级实践,从简单示例到复杂应用部署,这些知识将帮助你在实际项目中充分利用Docker的优势。

Docker化的Java应用具有环境一致性、易于部署和扩展等优点,是现代应用开发部署的重要技能。随着实践的深入,你可以进一步学习Docker Compose多容器编排、Kubernetes容器编排等高级主题,构建更加健壮和可扩展的应用架构。

到此这篇关于Docker拉取与部署OpenJDK到实际应用的文章就介绍到这了,更多相关Docker拉取与部署OpenJDK内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker搭建Skywalking的实现示例

    Docker搭建Skywalking的实现示例

    本文主要介绍了Docker搭建Skywalking的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • docker上快速搭建gitlab、gitlab-runer及实现CI/CD功能

    docker上快速搭建gitlab、gitlab-runer及实现CI/CD功能

    这篇文章主要介绍了docker上快速搭建gitlab、gitlab-runer及实现CI/CD,本文给大家讲解的非常详细,包括docker上安装gitlab的相关操作及配置root账号密码,需要的朋友可以参考下
    2022-04-04
  • docker-compose 详解及示例代码

    docker-compose 详解及示例代码

    这篇文章主要介绍了docker-compose 详解的相关资料,并附简单实例,需要的朋友可以参考下
    2016-10-10
  • Docker 容器日志分析

    Docker 容器日志分析

    这篇文章主要介绍了Docker 容器日志分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • 如何配置docker官方源并用yum安装docker

    如何配置docker官方源并用yum安装docker

    本篇文章主要介绍了如何配置docker官方源并用yum安装docker ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • centOS中安装docker-composer时报错问题及解决

    centOS中安装docker-composer时报错问题及解决

    这篇文章主要介绍了centOS中安装docker-composer时报错问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Docker快速部署GitLab的详细指南

    Docker快速部署GitLab的详细指南

    在 Windows 上使用 Docker 部署 GitLab 是完全可行的,推荐使用 Docker Desktop for Windows 来运行 GitLab 容器,下面小编就来详细介绍一下吧
    2025-09-09
  • docker使用alpine构建jdk21镜像的详细步骤

    docker使用alpine构建jdk21镜像的详细步骤

    这篇文章主要给大家介绍了关于docker使用alpine构建jdk21镜像的详细步骤,镜像中包含了应用程序所需要的运行环境,函数库,配置,以及应用本身等各种文件,这些文件分层打包而成,需要的朋友可以参考下
    2024-03-03
  • Docker打包及部署项目完整步骤

    Docker打包及部署项目完整步骤

    这篇文章主要给大家介绍了关于Docker打包及部署项目的相关资料,Docker是一种容器化技术,可以将应用程序及其依赖项打包成一个容器,方便在不同的环境中部署和运行,需要的朋友可以参考下
    2023-08-08
  • 利用宝塔面板和docker快速部署网站的基本流程

    利用宝塔面板和docker快速部署网站的基本流程

    当你有了一台服务器,就会折腾往这台服务器上部署各种好玩的网站,本文将以部署filebrowser举例介绍网站部署的基本流程,感兴趣的朋友一起看看吧
    2023-12-12

最新评论