前言
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一般都是部署在微服务器的,如果不是什么重大情况,公司内一般不会停止服务。
以上的全部内容都是个人在开发过程中总结的一些经验,希望对各位有所帮助,若有不对之处和不足之处可以留言,一起学习。