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

Java Web开发高级——Spring Boot与Docker容器化部署

随着云计算和微服务架构的快速发展,容器化已成为现代应用部署的重要手段。Docker作为最受欢迎的容器化技术之一,使得开发者能够将应用及其所有依赖打包到一个可移植的容器中,简化了开发、测试、部署和运维的流程。本篇文章将通过以下内容讲解如何使用Docker将Spring Boot应用容器化,并深入介绍Docker Compose在多容器应用中的使用。


1. Docker基础与容器化概念
1.1 Docker简介

Docker是一个开源平台,旨在通过将应用及其依赖打包到一个标准化的容器中来简化应用的开发、交付和运行。容器是一种轻量级、可移植、封装的执行环境,能够在开发、测试、生产等不同环境中保持一致性。

  • 容器:类似于虚拟机,但不需要完整的操作系统,资源开销更小。
  • 镜像:容器的运行实例是从镜像创建的,镜像包含应用及其所有依赖和配置。
  • Docker引擎:Docker的核心组件,负责容器的构建、运行和管理。
1.2 容器化与传统虚拟化的区别
  • 虚拟化:每个虚拟机都运行一个完整的操作系统,这增加了资源开销。虚拟化适用于需要隔离的多个操作系统实例。
  • 容器化:容器共享宿主操作系统的内核,只隔离应用和其依赖,因此相较虚拟化更加高效、轻量。
1.3 Docker容器的优势
  • 轻量级:容器启动速度快,占用资源少。
  • 高可移植性:通过Docker镜像,应用可在任何支持Docker的环境中运行。
  • 一致性:Docker可以确保在不同环境中运行的应用一致,解决了“在我机器上能跑”的问题。
1.4 Docker基本概念
  1. Dockerfile:描述如何构建一个Docker镜像的文件,包含了操作系统、应用依赖、配置等信息。
  2. 镜像(Image):一个只读的模板,用于创建容器。每次启动容器时,都会基于镜像创建一个新的实例。
  3. 容器(Container):容器是镜像的运行实例。它包括应用、运行时、系统工具和库等,完全独立于宿主机运行。
  4. Docker Hub:一个公共的Docker镜像仓库,用户可以在其中下载和上传镜像。

2. 使用Docker容器化Spring Boot应用
2.1 准备Spring Boot应用

在容器化Spring Boot应用之前,确保你有一个可运行的Spring Boot应用。如果还没有,可以创建一个简单的Spring Boot应用。例如,一个简单的Hello World应用:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @RestController
    public class HelloController {
        @GetMapping("/")
        public String hello() {
            return "Hello, Docker!";
        }
    }
}
2.2 创建Dockerfile

Dockerfile是Docker镜像的构建文件,定义了从构建Spring Boot应用镜像到如何运行容器的步骤。首先,确保在项目根目录下创建一个Dockerfile文件。

# 使用官方的OpenJDK镜像作为基础镜像
FROM openjdk:11-jre-slim

# 将构建好的Spring Boot jar包复制到容器中
COPY target/myapp.jar /app/myapp.jar

# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]

# 容器默认暴露8080端口
EXPOSE 8080

这个Dockerfile的作用:

  1. 从官方的OpenJDK基础镜像中构建一个新的镜像。
  2. 将本地构建好的Spring Boot应用(myapp.jar)复制到容器中的/app目录。
  3. 设置容器启动时执行java -jar命令来启动应用。
  4. 将8080端口暴露出来,以便与外部进行通信。
2.3 构建Docker镜像

使用Dockerfile构建Spring Boot应用的镜像,进入Spring Boot应用的项目目录,执行以下命令:

# 通过Dockerfile构建镜像
docker build -t myapp .
  • -t myapp:为构建的镜像指定一个标签(这里是myapp)。
  • .:指定Dockerfile所在的目录(当前目录)。

构建完成后,使用以下命令查看已构建的镜像:

docker images
2.4 运行Docker容器

构建好镜像后,可以通过以下命令运行容器:

docker run -p 8080:8080 myapp
  • -p 8080:8080:将宿主机的8080端口映射到容器的8080端口。

此时,访问http://localhost:8080,你应该能看到Spring Boot应用输出的Hello, Docker!

2.5 Docker容器管理

Docker提供了一些常用命令来管理容器:

  • 查看正在运行的容器
    docker ps
  • 查看所有容器(包括停止的)
    docker ps -a
  • 停止容器
    docker stop <container_id>
  • 删除容器
    docker rm <container_id>

3. Docker Compose与多容器应用部署
3.1 Docker Compose简介

Docker Compose是一个工具,用于定义和运行多容器Docker应用。通过一个YAML文件,用户可以配置应用所需的所有服务,然后使用一个命令就能启动多个容器。它非常适用于微服务架构的部署,尤其是在应用涉及多个服务(如Web应用、数据库、缓存等)时。

3.2 安装Docker Compose

如果没有安装Docker Compose,可以通过以下命令安装:

# 使用curl命令安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | jq -r .tag_name)/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 给docker-compose添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
3.3 使用Docker Compose部署Spring Boot应用

假设你的Spring Boot应用与数据库(如MySQL)共同运行,你可以通过Docker Compose来管理它们。

首先,创建一个docker-compose.yml文件:

version: '3'

services:
  app:
    image: myapp
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: password

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"

在上述docker-compose.yml中:

  • app服务:构建并运行Spring Boot应用,暴露8080端口,并且依赖于数据库服务db
  • db服务:运行MySQL数据库,暴露3306端口。
3.4 启动多容器应用

在同一目录下执行以下命令启动所有容器:

docker-compose up --build
  • --build:如果有更改Dockerfile或代码时,强制重新构建镜像。

使用docker-compose ps命令可以查看容器的运行状态。若要停止并清理容器,使用以下命令:

docker-compose down

总结

通过Docker容器化Spring Boot应用,可以有效简化部署流程并提高应用的可移植性。Docker Compose为多容器应用的管理提供了便捷的方式,尤其适用于微服务架构的场景。在本文中,我们详细介绍了如何使用Docker容器化Spring Boot应用,并通过Docker Compose部署多容器应用。通过这些实践,开发者可以轻松实现应用的容器化,并在不同环境中保持一致的运行效果。

关于作者:

15年互联网开发、带过10-20人的团队,多次帮助公司从0到1完成项目开发,在TX等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我


http://www.kler.cn/a/512400.html

相关文章:

  • Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)
  • 【Leetcode 每日一题】2239. 找到最接近 0 的数字
  • 线性代数概述
  • 嵌入式知识点总结 C/C++ 专题提升(一)-关键字
  • vue3+elementPlus之后台管理系统(从0到1)(day2)
  • 【多线程】线程池
  • 电子电气架构 --- 车载通信诊断
  • 【开源免费】基于SpringBoot+Vue.JS密接者跟踪系统(JAVA毕业设计)
  • 大语言模型增强推荐系统:分类、趋势、应用与未来
  • c# PDF文件合并工具
  • python milvus及curl命令进行query请求
  • Java工程结构:服务器规约(JVM 碰到 OOM 场景时输出 dump 信息、设置tomcat的 JVM 的内存参数、了解服务平均耗时)
  • STM32更新程序OTA
  • 为AI聊天工具添加一个知识系统 之54 为事务处理 设计 基于DDD的一个 AI操作系统 来处理维度
  • npm配置electron专属的淘宝镜像进行安装
  • 2、ansible的playbook
  • MongoDB文档查询
  • PyTorch使用教程(11)-cuda的使用方法
  • Skeleton 骨架屏
  • 【漫话机器学习系列】051.错误类型(Error Type)
  • kafka 学习笔记3-传统部署Kraft模式集群——筑梦之路
  • git 常见问题
  • MYSQL 5.7数据库,关于1067报错 invalid default value for,解决方法!
  • 微服务学习-快速搭建
  • c#实现当捕获异常时自动重启程序
  • 抖音小程序一键获取手机号