Windows Docker部署springboot微服务

Windows Docker部署springboot微服务

前言

偶然的机会让我能够实操在Windows server 2019版本的服务器上进行springCloud服务的部署

过程中深刻的体会到了为什么Docker要推荐使用Linux系列的系统进行操作

遇到的问题

  1. springboot镜像打包
  2. 微服务启动后nacos连不上
  3. 使用的基础镜像openjdk在WindowsDocker上的问题
  4. DockerFile启动与Docker-Compose启动后的一些区别
  5. springboot在WindowsDocker镜像中的编码问题

正文

Windows Server安装Docker:

DockerByWindowsDesktop下载安装包

服务器版的WindowsServer在任务管理器中看CPU选项都是没有虚拟化选项的,所以开不开Hyper-V无所谓,也不支持WSL2

下载好后双击安装包直接自动安装了,中间只需要选择是否在桌面创建快捷方式

等待启动的过程中弹出报错就选左边第一个reset,会自动修复

如果还是不行就在状态栏中的小鲸鱼标志上右键单击,有一个switch Windows

安装启动完成后修改配置文件,右键单击小鲸鱼--->setting

json 复制代码
{
  "data-root": "E:\\Docker\\Dockerimage",
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "hosts": [
    "0.0.0.0:2375",
    "tcp://0.0.0.0:2375"
  ],
  "insecure-registries": [],
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://mirror.ccs.tencentyun.com"
  ]
}

参数解释

  1. data-root修改docker数据存储位置,一般来说服务器的C盘空间都不够大
  2. hosts开放docker远程连接
  3. registry-mirrors设置国内镜像下载地址

到此为止,在服务器上的配置就结束了,云服务器需要开放2375端口给自己

IDEA操作

我的idea版本

idea插件

idea连接Docker服务器

进入idea设置Preferences(Setting) | Build, Execution, Deployment | Docker

docker镜像打包

WindowsDocker的DockerFile

我使用的基础镜像为:openjdk:11-jre

以下是我的DockerFile示例:

dockerfile 复制代码
# 基础镜像
FROM openjdk:11-jre
# 作者
LABEL maintainer="fatebug"
# 设置时区与编码
ENV LANG C.UTF-8
ENV TZ=Asia/Shanghai
# 暴露端口
EXPOSE 13390:13390
# 创建目录
RUN mkdir -p C:\\Users\\fatebug\\logs
# 设置字符集
RUN chcp 65001
# 复制 jar 文件到目录
COPY ./jar/name.jar C:\\Users\\fatebug\\name.jar
# 设置工作目录
WORKDIR C:/Users/fatebug
# 启动系统服务
CMD ["cmd", "/k", "chcp 65001"]
ENTRYPOINT ["java", "-jar", "name.jar", "-Dfile.encoding=UTF-8", "-Xms256m", "-Xmx256m", "-XX:PermSize=128m", "-XX:MaxPermSize=512M"]
# 映射日志目录与字体目录
VOLUME C:\\Users\\fatebug\\logs
VOLUME C:\\Windows\\Fonts

这里就出现了问题3,openjdk:11-jre的Windows特供版中,使用的所有路径都是Windows路径

方法一

MavenDocker镜像编译直接上传到Docker中

DockerFile放置在项目src/main/resources目录下,按注释去修改为正确的文件目录

Maven添加plugin:

xml 复制代码
<plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>

                <configuration>
                    <!--远程docker地址-->
                    <dockerHost>http://你的服务器IP:2375</dockerHost>
                    <!--镜像名称,前缀/项目名-->
                    <imageName>前缀/${project.artifactId}</imageName>
                    <!--dockerFile的位置-->
                    <dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!--默认的target文件夹位置-->
                            <directory>${project.build.directory}</directory>
                            <!--最终名称.jar-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

正常Maven编译打包后,点击idea Maven窗口中该模块下的plugin进行docker镜像构建

构建完成后在服务器的镜像中可以看到改镜像(我使用的是idea中的docker进行查看

启动命令:开放端口,挂载目录

shell 复制代码
docker run -p 13390:13390 -v E:\projectfatebug\logs:C:\Users\fatebug\logs --name demo --pull missing 镜像名:latest 

方式二

使用docker-compose进行打包运行

编写docker-compose

yaml 复制代码
version : '3.8'
services:
  gateway:
    container_name: gateway
    environment:
      - TZ=Asia/Shanghai
      - PYTHONIOENCODING=utf-8
    build:
      context: ./fatebug/gateway
      dockerfile: Dockerfile
    ports:
      - "13390:13390"
    volumes:
      - E:\projectfatebug\logs:C:\Users\fatebug\logs
      - E:\projectfatebug\Fonts:C:\Windows\Fonts

将各个文件放到对应的地方,按需求修改对应的目录

点击运行即可自动运行到服务器Docker,前提是需要idea的Docker插件连接了服务器Docker

问题出现

WindowsDocker运行的微服务连接不了服务器跑的nacos

解决:使用IP访问,并且在bootstrap.yml中设置spring.cloud.nacos.discovery.ip=服务器IP

如果是Linux版本的话就可以使用Network=host的本机模式来直接使用宿主机的端口,但是Windows不行,WindowsServer版本的Docker只有两种模式

DockerFile启动与Docker-Compose启动后的一些区别

Docker-Compose启动后由于未知原因(大概率是openjdk镜像Windows版本)导致输出日志字符集不正确,使用命令行输入chcp输出code为0

DockerFile启动后没有发现这个问题

springboot在WindowsDocker镜像中的编码问题

解决:在所有的获取字节数组和需要字符集的地方指定UTF-8

相关推荐
天朝八阿哥5 小时前
使用Docker+vscode搭建离线的go开发调试环境
后端·docker·visual studio code
用户908324602738 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
阿虎儿1 天前
Docker安装(非sudo用户可用)
docker
用户8307196840821 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解1 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解1 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记1 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者2 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840822 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解2 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端