windows下使用dockerdesktop进行部署

windows,dockerdesktop · 浏览次数 : 6

小编点评

本文主要介绍了在Windows上使用Docker部署Spring Boot项目的相关步骤和注意事项。文章首先列出了在Windows上部署Spring Boot项目所需的环境准备,然后详细讲解了如何构建Docker镜像、配置Docker Compose以及运行项目。最后,文章总结了在部署过程中可能遇到的问题和解决方案。 1. **环境准备**: - 确保系统支持虚拟化,如Intel VT-x或AMD-V。 - 安装Docker Desktop,确保其版本与Windows版本兼容。 - 在BIOS中启用CPU的虚拟化功能。 2. **构建Docker镜像**: - 使用Maven或Gradle打包Spring Boot项目。 - 将生成的JAR文件和资源文件添加到Docker镜像中。 - 设置相关环境变量,如数据库连接URL、用户名和密码等。 3. **配置Docker Compose**: - 如果使用Docker Compose,可以在`docker-compose.yml`文件中定义服务。 - 确保网络设置正确,以便容器之间能够互相通信。 4. **运行项目**: - 使用`docker run`命令运行Spring Boot应用程序。 - 如果遇到端口映射问题,可以尝试更改端口映射。 5. **常见问题与解决方案**: - **日志系统初始化失败**:检查logback.xml文件的位置是否正确。 - **端口映射问题**:确保在运行容器时正确映射了端口。 - **防火墙设置**:虽然防火墙已关闭,但可能仍然需要配置Windows防火墙以允许Docker服务的通信。 总的来说,部署Spring Boot项目到Windows上确实需要一些额外的配置和注意事项。通过遵循上述步骤,可以减少部署过程中的风险,并确保应用程序能够正常运行。

正文

Docker部署springboot项目

环境准备

要在windows上使用docker需要确认系统的需求

  • 需要启用虚拟化支持的CPU
  • 启用适用于windows的Linux子系统功能
  • 保证足够的内存
    img
    img

下载dockerdesktop
img

下载后会提示安装对应的环境

img

坑点

安装过程中需要安装wsl环境,会遇到0x80370102问题。
根据官方文档,报这个错是因为未启用BIOS虚拟化所引发的错误。网上搜这个错误,大部分都是说要在BIOS中启用CPU的虚拟化功能。

安装失败,出现错误 0x80070003 或错误 0x80370102

  • 请确保在计算机的 BIOS 内已启用虚拟化。 有关如何执行此操作的说明因计算机而异,并且很可能在 CPU 相关选项下。
  • WSL2 要求 CPU 支持二级地址转换 (SLAT) 功能,后者已在 Intel Nehalem 处理器(Intel Core 第一代)和 AMD Opteron 中引入。 即使成功安装了虚拟机平台,旧版 CPU(例如 Intel Core 2 Duo)也无法运行 WSL2。

然而虚拟化在本机上应该是配置完整了的。
另一点,WSL2是基于Windows的hyper-v虚拟平台的,但是开启hiper-V功能依然报错。
查询资料后,发现hiper-V还依赖底层的Hypervisor
img
管理员启动powershell,运行

bcdedit /set hypervisorlaunchtype Auto

即可正常下载。

连接数据库

适用docker network ls列出网络配置
img
pull 对应的mysql镜像

docker pull mysql
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name my_mysql mysql
# 通过镜像生成对应的容器
docker exec -it my_mysql bash #进入容器进行测试
mysql -uroot -p123456 #成功进入容器内mysql

img
配置好自己项目的数据库

  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
    show-sql: true
    hibernate:
      ddl-auto: update
  datasource: # 数据库配置
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://my_mysql:3306/test_1?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
    username: root
    password: 123456
    hikari:
      maximum-pool-size: 10 # 最大连接池数
      max-lifetime: 1770000

img
在dockerdesktop可以查看网络状态。

坑点

报错Failed to initialize JPA EntityManagerFactory: Unable to create requested service。和
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
都是没有正确配置数据库的问题

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

这行代码是解决问题的关键,要是写了还有错一定要注意格式。(特别是yml文件,我这里出问题就是spring:写的位置不对)

打包项目

在根目录下配置Dockerfile和docker-compose.yml(docker-compose已经集成到了dockerdesktop中,所以无需下载)
我的配置如下:
Dockerfile

FROM openjdk:8u212-jdk
VOLUME /tmp
RUN mkdir -p /app
#ADD 后面的参数是项目名字 / 后面的参数是自定义的别名
ADD target/test.jar /school.jar
#这里的最后一个变量需要和前面起的别名相同
COPY target/test.jar /app/test.jar
COPY src/main/resources/logback.xml /app/logback.xml
COPY src/main/resources/application.yml /app/app.xml
WORKDIR /app
EXPOSE 9091
ENTRYPOINT ["java", "-Dlogback.configurationFile=/app/logback.xml","-jar", "/school.jar"]

docker-compose

version: '3'
services:
  mysql:
    image: mysql
    container_name: my_mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: test_1
      MYSQL_PASSWORD: 123456
    ports:
      - "3307:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - test_default

  springboot-app:
    image: school
    depends_on:
      - mysql
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://my_mysql:3306/test_1
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: 123456
    ports:
      - "9091:8080"
    networks:
      - test_default

volumes:
  mysql-data:

networks:
  test_default:
    external: true

使用如下命令

mvn clean package #项目打包
docker build -t school .#构建项目镜像
docker-compose up -d #两个镜像一起构建容器

配置好后可以在dockerdesktop查看复制过去的文件,非常方便。
img

坑点

运行中报错Logging system failed to initialize using configuration from 'logback.xml'。可能是你的logback文件位置不正确。
通常它应该位于/src/main/resources目录下,如果还是不正确需要jar tf jar包,看看文件是不是确实在里面。

测试

测试代码

@RestController
@RequestMapping("/test")
public class TestController {
    private final static Logger logger = LoggerFactory.getLogger(TestController.class);
    @RequestMapping("/log")
    @UnInterception
    public String testLog() {
        logger.debug("=====测试日志debug级别打印====");
        logger.info("======测试日志info级别打印=====");
        logger.error("=====测试日志error级别打印====");
        logger.warn("======测试日志warn级别打印=====");
        String str1 = "blog.itcodai.com";
        String str2 = "blog.csdn.net/eson_15";
        logger.info("======测试:{}", str1, str2);

        return "success";
    }
}

不用管UnInterception注解,这个是因为我配置了拦截器,这个注解主要是取消拦截,如果你的项目中没有配置,可以不用写。
访问本地,可以正常访问
img
ipconfig查看你的主机地址
img
可以成功访问。
dockerdesktop可查看日志
img

坑点

使用dockerdesktop有个巨大坑点,这个bug足足困扰我一天,由于之前项目一直使用的是9090端口,在部署时访问一直都是ERR_EMPTY_RESPONSE或者连接被拒绝,搜索了很多资料,防火墙也关闭了。但是bug一直都存在。并且使用docker ps显示就是9091/tcp, 0.0.0.0:9091->9090/tcp,这就有点奇怪了。
后来查看日志发现也没报错请求,一切就好像没有请求过一样。
最后才发现在dockerdesktop上运行一直初始化就是8080,也就是我的9090端口从来都没有被映射成功过,这确实我也不懂。
img

后来把项目端口改成8080映射访问就正常了。
总的来说确实有很多需要注意的点,希望平常大家在遇到bug时要多多思考,善于查阅文档资料,理清项目的逻辑,可以更快速的解决问题。

与windows下使用dockerdesktop进行部署相似的内容:

windows下使用dockerdesktop进行部署

Docker部署springboot项目 环境准备 要在windows上使用docker需要确认系统的需求 需要启用虚拟化支持的CPU 启用适用于windows的Linux子系统功能 保证足够的内存 下载dockerdesktop 下载后会提示安装对应的环境 坑点 安装过程中需要安装wsl环境,会遇

如何在 Windows 使用 Podman Desktop 取代 Docker Desktop

Podman Desktop 是 Docker Desktop 的免费替代品,是本地开发使用的另一个绝佳选择。它提供了类似的功能集,同时保持完全开源,让您避免使用 Docker 产品的许可问题。在本文中,您将学习如何安装和开始使用 Podman Desktop 来运行容器并部署到 Kubernete

2023年windows DockerDeskTop最新款4.18.0 全程保姆级安装

前景提示 想在windows10上安装一个docker容器的desktop版本,但是,总是安装wsl不好使,同时,windows store没有了,用命令行安装的linux系统无法启动,也无法连接,之前想到的方案是安装旧的版本,然后,快速关闭wsl的验证功能,勉强可以跑起来,但是,存在大量问题和功能

踩坑记录:windows11下使用 VS2022 和 PCL1.14.1 配置点云开发环境

闲话不多说,具体在windows下下载PCL与解压pcl可以看https://www.yuque.com/huangzhongqing/pcl/这位大佬的文章,那我就具体说一下踩过点坑: 踩坑点1: 按照大佬的文章的步骤进行解压与下载,我的PCL环境下在了K盘中,但是最后不知怎么的我的openni2

[转帖]MySQL命令执行sql文件的两种方法

使用命令执行 sql 脚本文件 方法一,在 Windows 下使用 cmd 命令执行(或Unix或Linux控制台下) 【Mysql的bin目录】mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】,示例: C:MySQLinmysql –uroot –p123456 -Dtes

[转帖]Windows平台下使用 Rclone 挂载 OneDrive 为本地硬盘

https://zhuanlan.zhihu.com/p/139200172 Rclone (rsync for cloud storage) 是一个命令行程序,用于同步文件和目录,支持常见的 Amazon Drive 、Google Drive 、OneDrive 、Dropbox 等云存储。本文

12.3 实现模拟鼠标录制回放

本节将向读者介绍如何使用键盘鼠标操控模拟技术,键盘鼠标操控模拟技术是一种非常实用的技术,可以自动化执行一些重复性的任务,提高工作效率,在Windows系统下,通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的操作。有时我们经常需要进行重复性的鼠标操作,例如繁琐的点击、拖拽。这些任务可能消耗大量...

12.2 实现键盘模拟按键

本节将向读者介绍如何使用键盘鼠标操控模拟技术,键盘鼠标操控模拟技术是一种非常实用的技术,可以自动化执行一些重复性的任务,提高工作效率,在Windows系统下,通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的操作。键盘鼠标的模拟是实现自动化的必备流程,通常我们可以使用`keybd_event(...

GitHub SSH 快速配置

每次更换系统或者电脑时,都需要重新配置一番 Github SSH 的验证,记性不太好,写了一个快速部署的辅助脚本,直接安装脚本提示使用即可,经测试,Linux 和 Windows 下均能使用。 脚本功能 设置 Git 用户名和邮箱 脚本会提示用户输入 Git 用户名和邮箱,并将其设置为全局配置。 生

[转帖]Linux / Windows – NTttcp

https://benjr.tw/94564 通常在 Linux 環境下會使用 iperf – https://benjr.tw/462 來當作測試網路效能工具,在 Windows 環境下 iperf 也有提供相對應的版本. 不過在 Microsoft 網站提到在 Azure 下建議使用 NTttc