springCloud部署本地docker desktop经验学习

前言

        springCloud部署docker是目前主流的开发方式。在本博客中将讲解springCloud部署本地的docker desktop。了解这个之后对于部署或者了解服务器上的docker也将会更加容易理解,修改一些连接配置,就基本可以连接上服务器docker。

        Docker是什么:(简短描述一下,需要详细了解的,可自行搜寻学习)

  • Docker 可以将应用程序及其依赖项打包到一个可移植的容器中。这个容器包含了应用运行所需的所有内容,如代码、运行时环境、系统工具、库等。
  • 无论在何种环境下,只要该环境支持 Docker,就可以确保应用以相同的方式运行,实现了 “一次构建,随处运行”。

        为什么大部分企业项目都会基于springCloud+docker完成项目的开发:(简单描述)

  • 在不同的开发、测试和生产环境中,常常会因为各种因素导致环境差异,从而引发应用出现问题。将 Spring Cloud 应用部署在 Docker 中可以确保环境的一致性。
  • 对于 Spring Cloud 应用,当需要部署新的服务或更新现有服务时,使用 Docker 可以大大加快部署速度。可以将服务打包成 Docker 镜像,然后在任何支持 Docker 的环境中快速部署。这对于频繁更新的应用来说非常重要,可以缩短部署时间,提高开发效率。

1 Docker Desktop 下载安装

        本次讲解的下载是通过官网下载。

        注意:因为一些安全限制,无法直接的访问docker官网,可以使用合理合法合规的工具进入网站进行下载。

        若实在没有,可以私聊免费给予安装包。主要是,不想上传云盘。

1.1 Docker Desktop 下载

        docker官网:https://www.docker.com/ 

        目前点击网站打开后的界面如图: (选择对应系统安装包进行下载)

1.2 docker Desktop 安装

        点击安装:出现弹窗(两个都选择,安装相应的环境),点击ok。

        点击ok后,等待环境下载,需要一点时间,如图:

                安装成功如图:点击Close and restart 即可。

2 配置启动Dockers Desktop 本地环境设置 

        这一部分内容,参考文章:Docker Desktop 安装使用教程-CSDN博客 。建议学习

        docker desktop 是可以部署在windows 上来运行docker的应用服务的,其基于windows 的 Hyper-V服务和WSL2内核的Windows上创建一个子系统(linux),从而实现其在windows上运行docker。

        电脑上需要开启Hyper-V服务,和安装WSL2(刚才安装的时候已经默认安装了WSL2,如果没有也可以自行安装,可以参考上面所说的文章进行安装,这里就不多过讲述)。

        开启Hyper-V 服务:控制面板—程序—程序和功能—启动或关闭Windows功能 中 勾选【Hyper-V】和【容器】选项。 如图所示:

 

 

        配置完毕后,重启电脑。 

3 Docker Desktop 打开及修改一些配置

        点击打开docker desktop,首次进入会进行选择以游客访问还是登录访问,这里直接选择游客登录即可。 

        点击后如图所示:(刚开始中间是没有内容的,这里展示的是我的一些测试项目,请不要被误导

   

3.1 docker desktop 配置镜像

        配置镜像源:打开Docker ,找到 设置–docker engine 中,添加如下图所示的镜像源地址。

        配置内容如下:

{
    "registry-mirrors" : [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://cr.console.aliyun.com",
    "https://mirror.ccs.tencentyun.com"
  ],
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  }
}

        如图所示: 

         当进行修改后,Apply & restart 会高亮显示,点击加载即可(会转一会,等一会就可以了,不转了就可以了),如图所示:

     

3.2 勾选TLS

        勾选TLS是为了可以连接到该docker,在测试过程中,如果不勾选无法通过在IDEA中通过TCP进行连接到该docker。

        设置->General->勾选(Expose daemon on tcp://localhost:2375 without TLS)-> apply and restart。

3.3 docker desktop 使用

        这里对这里也不进行过多的了解,可以查看文章:Docker Desktop 安装使用教程-CSDN博客的“使用Docker Desktop”进行学习.

4 创建springCloud项目及修改相应配置

        一般的企业项目都是由多个不用功能的模块进行同步开发的。因此,我将创建两个模块进行测试。(懂两个就等于懂了多个

4. 1 创建项目

        创建一个springBoot项目:(在后面我们在导入对应的包)。如图所示:

        使用了源:https://start.aliyun.com。好像不使用这个,无法选择java8,后面在启动项目时可能会报错(个人尝试,也可能说的不对,请根据自身情况进行改动)。

        选择一个Java web 即可,如图所示:

         创建完成后,删除src等文件,留下(父类)配置文件pom.xml。如图所示:

        新建两个子模块项目(springboot项目),分别名为deskTest1和deskTest2。如图所示 

 

        选择一个web和一个SQL,主要是为了避免不自动生成对应的src下面的文件,所以多添加了一个SQL(可以根据自身情况选择) 

        点击创建即可完成。

        根据上面的操作,创建dockerTest2。同理的操作。完成后如下图:

        把多余的文件删除,最终如下图所示:

 

 

 4.2 修改项目配置

       4.2.1 修改父类pom.xml。并导入对应的包

<packaging>pom</packaging>

<modules>
    <module>dockerTest1</module>
    <module>dockerTest2</module>
</modules>

        

         修改springboot版本(个人喜欢这个版本),如图所示:

<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.1.6.RELEASE</spring-boot.version>
</properties>

        导入包:各有各的作用。最好都先导入,后面根据需要进行删除。

        添加父启动依赖:如图所示

<!--spring boot ⽗启动器依赖-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
</parent>

        定义依赖管理配置,统一管理依赖版本。如图所示:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

         定义项目结构的特殊行为,如图所示:

 

        总的pom.xml 文件,这个文件可以直接复制使用,将对应的子文件名进行修改就可以。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xjj</groupId>
    <artifactId>docker-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <packaging>pom</packaging>

    <modules>
        <module>dockerTest1</module>
        <module>dockerTest2</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.1.6.RELEASE</spring-boot.version>
    </properties>

    <dependencies>

        <!--nacos客户端依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <!--spring boot ⽗启动器依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <finalName>${project.name}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <finalName>${project.build.finalName}</finalName>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

4.2.2 修改子类pom.xml

        子类的pom.xml 修改都是一样的,现在以dockerTest1的pom.xml文件为例进行修改。

        修改如下图:

 

        整体修改如下,dockerTest1和dockerTest2的修改一样,跟着上面来修改就行。

        dockerTest1 的 pom.xml 文件内容: 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xjj</groupId>
    <artifactId>dockerTest1</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>com.xjj</groupId>
        <artifactId>docker-test-new</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.2</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
        </plugins>
    </build>

</project>

         dockerTest2 的 pom.xml 文件内容: 

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.xjj</groupId>
        <artifactId>docker-test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.xjj</groupId>
    <artifactId>dockerTest2</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.2</version>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
        </plugins>
    </build>
</project>

        到这里,就基本完成了项目的创建,这只是一个基本的框架,在后面如果需要进行功能的开发,只需要把对应的包导入就可以。

        因为已经进行了版本依赖,有一些包不需要填写版本号,就可以自动识别,但有一些特殊的是需要规定好版本号的,到时自己根据实际情况来就可以。 

4.3 IDEA连接Docker Desktop 

        点击文件->设置-> Docker->跟着图片流程走就可以。

        这里完成后,就连接上了我们本地的docker desktop。

        举一反三:这里填写上,服务器部署的docker地址,就可以连接到服务器的docker

     

4.4 配置项目启动docker的文件

         这里先对整个项目进行打包,产生jar包,然后将jar运行到docker desktop 中。

        打包如下图所示:

        在每个子项目的根目录下创建Dockerfile文件。注意(文件名一定是这个,一定要是这个文件名)

Dockerfile 在 Docker 中的主要作用:

  • 定义构建步骤:Dockerfile 包含一系列指令,用于定义如何从基础镜像开始构建最终的镜像。
  • 自动化构建:使用 docker build 命令时,Docker 会按照 Dockerfile 中的指令自动构建镜像。
  • 镜像分层:每个指令通常会创建一个新的镜像层,这种分层结构使得构建过程高效且可缓存。
  • 定制化与扩展:通过 Dockerfile 可以定制基础镜像,安装软件、配置环境等,满足特定需求。
  • 文档化:Dockerfile 作为构建过程的文档,清晰记录了镜像构建的所有步骤,有助于团队协作和维护。
  • 这些功能共同确保了 Docker 镜像的一致性和可复现性,同时也简化了应用程序的部署流程。

        创建位置和内容如图所示:(注意:端口号要记住

FROM openjdk:8
MAINTAINER xjj

#ENV PARAMS="-spring.profiles.active=test"
ENV PARAMS=""
ENV JAVA_OPTS="-Xms500m -Xmx800m -Xmn250m"

ENV Tz=PRC
RUN ln -sf /usr/share/zoneinfo/$Tz /etc/localtime && echo $Tz >/etc/timezone

COPY target/dockerTest1.jar dockertest1.jar

ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS dockertest1.jar $PARAMS"]

EXPOSE 3031

         子项目的Dockerfile文件配置基本一样,只需要修改一下jar的路径名称。

        dockerTest2的Dockerfile文件内容如下:(注意:端口号要记住

FROM openjdk:8
MAINTAINER xjj

#ENV PARAMS="-spring.profiles.active=test"
ENV PARAMS=""
ENV JAVA_OPTS="-Xms500m -Xmx800m -Xmn250m"

ENV Tz=PRC
RUN ln -sf /usr/share/zoneinfo/$Tz /etc/localtime && echo $Tz >/etc/timezone

COPY target/dockerTest2.jar.jar dockerTest2.jar

ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS dockerTest2.jar $PARAMS"]

EXPOSE 3032

        子项目的配置完成。

        下面配置父类主启动文件docker-compose.yml

         这个文件放在父项目的根目录下,路径内容如图所示:(需要注意的就是端口号要和定义的Dockerfile一致

version: '3'

services:

  dockerTest1:
    build:
      context: ../docker-test-new/dockerTest1 # 设置为项目根目录
      dockerfile: Dockerfile
#    env_file:
#      - common.env   # 暂时不指定变量环境
    restart: unless-stopped
    image: docker-test-one:latest             #自定义镜像名和版本号
    container_name: dockerTest1
    ports:
      - "3031:3031"
    volumes:
      - "/vdc/fysb-service/logs:/logs"

  dockerTest2:
    build:
      context: ../docker-test-new/dockerTest2 # 设置为项目根目录
      dockerfile: Dockerfile
#    env_file:
#      - common.env     # 暂时不指定变量环境
    restart: unless-stopped
    image: docker-test-two:latest             #自定义镜像名和版本号
    container_name: dockerTest2
    ports:
      - "3032:3032"
    volumes:
      - "/vdc/fysb-service/logs:/logs"

        当将docker-compose.yml 文件完成后,对应docker 需要配置的基本已经完成。

4.5 项目启动前的准备

        在子模块的application.properties配置文件中填写端口号,也可以填写数据库连接配置等,这里演示就把需要的端口号填写上,要和Dockerfile填写的端口号一致

        如图所示:

         创建测试接口,用于测试项目是否启动成功。

        如图所示:

         启动类注解改为:@SpringCloudApplication

        到这里,准备工作已经全部完成。

5 项目启动

         在项目启动之前,需要重新进行打包,因为之前已经修改了很多,如application.properties的内容进行了修改,所以需要重新进行打包jar包。当修改过项目的内容后,都需要进行重新打包在运行,否则修改的内容无法得到应用。

         打包完成后,来到父级根目录下的docker-compose.yml文件,然后选择需要启动的镜像,点击左边的绿色向右的三角形,然后选择启动到哪一个docker。

        如图所示:

        选择环境启动后,执行过程如下图所示:

        此时,dockerTest1 就已经启动成功了。

        向不着急测试,下面继续启动dockerTest2。

        启动过程图如下:

        到这里,两个子项目都已经启动成功了,现在就到docker desktop 进行查看,是否真正启动了???

        来到docker Desktop 界面,点击镜像,观看是否启动成功。可以看到,启动成功。

         在到容器看,是否启动成功。可以看到,两个子项目都启动成功了。

        现在来进行测试定义的接口是否可以正常访问。经过测试,访问正常。

        到这里,整个差不多已经讲完了。

        项目部署到docker的基本流程已经通过图文的形式进行了详细的讲解,希望对各位有所帮助。

        等等,还没完,还有一些细节需要说一下。

        设置每次在docker-compose.yml 文件启动项目是都是重新构建镜像,创建容器,部署的都是最新包。

        编辑配置:

         

         根据图片进行选择,选择完成后进行应用确定。

        完成这边操作之后,在之后启动的都是最新的包。

        注意:这里我只是演示了dockerTest2,对于dockerTest1也需要进行同样的操作。

        到这里,整个流程已经介绍了。

6 总结

        为什么要使用docker,根据我个人的理解和经验简略说一下。

        将项目部署到docker上面,可以极大的方便我们对项目的管理。

        如果单纯在idea中进行启动项目,当关闭idea后,项目将会停止,无法在继续访问,当部署到docker后,致使关闭了idea也可以同样的访问接口,这个没有在上面进行测试,有兴趣的可以试一下,关闭idea后,是否还可以访问。

        如果利用原始的打包上传启动,在此过程中将会耗费大量时间,不值当。

        通过直接idea部署到docker上,简单方便,环境不需要从新配置,极大便利了开发。

        当项目部署到docker后,只有不关闭docker,部署在上面的项目接口都可以访问,也因为docker一般都是部署在微服务器的,如果不是什么重大情况,公司内一般不会停止服务。

         以上的全部内容都是个人在开发过程中总结的一些经验,希望对各位有所帮助,若有不对之处和不足之处可以留言,一起学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值