🌻🌻 目录
- 一、Maven Docker 插件构建 Docker 镜像
- 1.1 maven Docker 插件构建 Docker 镜像入门
- 1.2 maven Docker 插件构建 Docker 镜像,自定义 DockerFile
- 1.3 maven Docker 插件构建并推送镜像到 Docker 私有仓库
- 二、手动发布部署微服务项目到 Docker
- 2.1 项目工程发布镜像规划
- 2.2 项目工程发布镜像配置
- 2.2.1 项目 EurekaServer01
- 2.2.2 项目 ConfigServer001
- 2.2.3 数据库的创建
- 2.2.4 项目ZuulGateWay
- 2.2.5 项目UserProvdier01
- 2.2.6 项目 UserWeb06
- 2.3 编译工程创建镜像
- 2.4 搭建实际运行项目
一、Maven Docker 插件构建 Docker 镜像
首先:启动上节使用的两台服务器(启动docker和启动私服)
然后:导入上一节的springcloud案例项目 a-parent-project
开始这节的总结啦啦啦~~~
Maven是一个强大的项目管理与构建工具。可以使用Maven构建Docker镜像,那么我们的工作能得到进一步的简化。
1.1 maven Docker 插件构建 Docker 镜像入门
第一步:修改项目
EurekaServer01
的pom.xml
<build>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!--镜像的名字-->
<imageName>zql/microservice-discovery-eureka:0.0.1</imageName>
<!--基础镜像-->
<baseImage>java:8</baseImage>
<!--容器启动后执行的指令-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</build>
也可以下载 插件地址
第二步:在linux宿主机的
/usr/local
下面创建java-project
,并且把项目文件(如下图,父项目下的所有)上传到linux宿主机目录/usr/local/java-project
,如下:
步骤一:
步骤二:项目路径查看:
步骤三:
步骤四:
第三步:下载并上传 jdk、maven 的安装包到linux服务器
- jdk-8u131-linux-x64.tar.gz
- apache-maven-3.6.0-bin.tar.gz
解压并重命名:
第四步:安装jdk
tar xvf jdk-8u131-linux-x64.tar.gz -C /usr/local/
cd /usr/local
mv jdk1.8.0_131 jdk
vi /etc/profile
#在最后添加
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
#重新加载配置文件
source /etc/profile
#测试jdk是否安装成
java -version
第五步:安装maven
tar xvf apache-maven-3.6.0-bin.tar.gz -C /usr/local/
cd /usr/local
mv apache-maven-3.6.0 maven
vi /etc/profile
#在最后添加
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
#重新加载配置文件
source /etc/profile
#测试maven安装
mvn -v
解压缩:
解压并重命名:
拷贝maven目录,方便下面使用:
添加配置文件和验证是否成功安装
配置maven加速器,我使用了华为的
编辑配置加速器
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</mirror>
<!--
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
-->
</mirrors>
然后刷新项目
第六步:编译构建项目
切换到测试JAVA项目目录
cd /usr/local/EurekaServer
执行编译指令:
mvn clean package docker:build #这个命令不行就执行下面一个,都一样
mvn clean -Dmaven.test.skip=true package docker:build
我们会发现终端输出类似于如下的内容:
第七步:查看镜像
执行命令:
docker images
第八步:使用镜像创建运行容器
docker run -di --name e1 -p 10086:10086 zql/microservice-discovery-eureka:0.0.1
查看日志
docker logs e1
第九步:访问测试
http://192.168.188.181:10086/
1.2 maven Docker 插件构建 Docker 镜像,自定义 DockerFile
上面的示例,我们直接在pom.xml中设置了一些构建的参数。很多场景下,我们希望使用Dockerfile更精确、有可读性地构建镜像。
下面我们带领大家看一下如何使用Dockerfile基于Maven插件构建镜像。
第一步:首先我们在项目的
src/main/docker
目录下,新建一个Dockerfile文件
在idea中新建文件,文件出现问号,打不开解决
# 基于哪个镜像
FROM java:8
# 拷贝文件到容器,也可以直接写成ADD xxxxx.jar /app.jar
ADD EurekaServer01-1.0.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8888
# 配置容器启动后执行的命令
CMD ["java","-jar","/app.jar"]
第二步:修改pom.xml,修改maven Docker插件,变动地方看下截图
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!--镜像的名字-->
<imageName>zql/microservice-discovery-eureka:0.0.1</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<!--基础镜像-->
<!--<baseImage>java:8</baseImage>-->
<!--容器启动后执行的指令-->
<!--<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
删除之前构建的一些容器和镜像
第三步:上传到linux服务器重新执行编译构建,即可根据Dockerfile生成镜像
切换到测试JAVA项目目录
cd /usr/local/EurekaServer01
执行编译构建指令:
mvn clean package docker:build #这个命令不行就执行下面一个,都一样
mvn clean -Dmaven.test.skip=true package docker:build
构建出现问题解决
浏览器进一步验证:http://192.168.188.181:10086/
1.3 maven Docker 插件构建并推送镜像到 Docker 私有仓库
前文我们使用docker push 命令实现了镜像的推送,我们也可使用Maven插件推送镜像。我们不妨使用Maven插件推送一个Docker镜像到Docker 私有仓库。
第一步:修改Maven的全局配置文件setttings.xml
- 在其中添加以下内容,配置Docker私有仓库的用户信息。
cd /usr/local/maven/conf/
vi settings.xml
<server>
<id>docker-hub</id>
<username>admin</username>
<password>admin123</password>
<configuration>
<email>wmsspark@163.com</email>
</configuration>
</server>
第二步:修改项目EurekaServer01的pom.xml
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>192.168.188.181:8086/microservice-discovery-eureka:0.0.2</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<serverId>docker-hub</serverId>
</configuration>
</plugin>
</plugins>
</build>
serverId:必须和maven配置文件设置的server 节点的id一致
- idea中做了更改后再次需要上传
第三步:执行以下命令,添加pushImage的标识,表示推送镜像
- 先将上面构建的容器和镜像都删掉
mvn clean -DpushImage package docker:build #这个命令不行就执行下面一个,都一样
mvn clean -Dmaven.test.skip=true -DpushImage package docker:build
这里已经显示推送成功了,继续下面私服验证:
执行完毕,查看Docker私服已经上传成功镜像: http://192.168.188.182:8081/
二、手动发布部署微服务项目到 Docker
2.1 项目工程发布镜像规划
按照项目EurekaServer01的配置方式把相关项目都发布成镜像
序号 | 项目名称 | 镜像名称 |
1 | EurekaServer01 | 192.168.188.138:8086/microservice-discovery-eureka:0.0.1 |
2 | ConfigServer001 | 192.168.188.138:8086/microservice-config-server:0.0.1 |
3 | ZuulGateWay | 192.168.188.138:8086/microservice-zuul-gateway:0.0.1 |
4 | UserProvdier01 | 192.168.188.138:8086/microservice-provdier-service:0.0.1 |
5 | UserWeb04 | 192.168.188.138:8086/microservice-user-web:0.0.1 |
注意:
- 因为
EurekaServer01
和EurekaServer02
只是端口和配置不同,没必要单独创建2个独立镜像,仅仅需要在Docker镜像创建容器的时候传递相关参数即可。- 同理
ConfigServer001
、ConfigServer002
也公用一个镜像。UserProvdier01
、UserProvdier02
也公用一个镜像。
- 先打开idea修改如下操作:
2.2 项目工程发布镜像配置
2.2.1 项目 EurekaServer01
步骤一、修改上面项目src/main下面创建的docker目录下面的
Dockerfile
文件
# 基于哪个镜像
FROM java:8
# 拷贝文件到容器,也可以直接写成ADD xxxxx.jar /app.jar
ADD EurekaServer01-*.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8888
#配置环境变量,接受外部传递参数
#启动端口
ENV PORT=""
#注册中心地址
ENV EUREKA=""
# 配置容器启动后执行的命令
ENTRYPOINT ["sh","-c","java $PORT $EUREKA -jar /app.jar"]
#CMD ["java","-jar","/app.jar"]
- 而后删除上面操作过的镜像
- 先创建一个网络
docker network create mynet #搭建一个网络
docker network ls #查看网络
- 因为上面配置做了修改,所以再次上传
mvn clean package -DpushImage docker:build
分别构建Eureka1和Eureka2
docker run -di --name=eureka1 --network=mynet -e PORT="-Dserver.port=10086" -e EUREKA="-Deureka.client.service-url.defaultZone=http://eureka2:10087/eureka" -p 10086:10086 192.168.188.182:8086/zql/microservice-discovery-eureka:0.0.1
docker run -di --name=eureka2 --network=mynet -e PORT="-Dserver.port=10087" -e EUREKA="-Deureka.client.service-url.defaultZone=http://eureka1:10086/eureka" -p 10087:10087 192.168.188.182:8086/zql/microservice-discovery-eureka:0.0.1
docker logs eureka1 #通过日志查看是否启动
docker logs eureka2
命令详细解释如:
容器创建指令:
docker run #创建容器指令
-di # d守护式容器、i 运行容器
--name=eureka1 # 容器名称
--network=mynet #容器加入用户自定义网络mynet
-e PORT="-Dserver.port=10086" #指定环境参数--Eureka注册中心服务启动监听端口
#指定环境参数--Eureka注册中心地址(高可用架构)
-e EUREKA="-Deureka.client.service-url.defaultZone=http://eureka2:10087/eureka"
-p 10086:10086 #容器端口号映射
192.168.188.138:8086/microservice-discovery-eureka:0.0.1 #镜像名称
浏览器验证:http://192.168.188.181:10086/
http://192.168.188.181:10087/
2.2.2 项目 ConfigServer001
步骤一、拷贝EurekaServer01目录下的docker并且修改 Dokcerfile文件的下面部分即可
# 基于哪个镜像
FROM java:8
# 拷贝文件到容器,也可以直接写成ADD xxxxx.jar /app.jar
COPY ConfigServer001-*.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8888
#配置环境变量,接受外部传递参数
#启动端口
ENV PORT=""
#注册中心地址
ENV EUREKA=""
# 配置容器启动后执行的命令
ENTRYPOINT ["sh","-c","java $PORT $EUREKA -jar /app.jar"]
步骤二、修改pom.xml,修改maven Docker插件(将上面EurekaServer01的相应plugin复制过来修改下面截图小框就可以了
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>192.168.188.182:8086/zql/microservice-config-server:0.0.1</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<serverId>docker-hub</serverId>
</configuration>
</plugin>
</plugins>
</build>
步骤三:进而上传到服务器即可
步骤四:执行下列命令上传到私服
mvn clean package -DpushImage docker:build
docker run -di --name=config1 --network=mynet -e PORT="-Dserver.port=7001" -e EUREKA="-Deureka.client.service-url.defaultZone=http://eureka1:10086/eureka,http://eureka2:10087/eureka" -p 7001:7001 192.168.188.182:8086/zql/microservice-config-server:0.0.1
将来自己上传github上的文件进行拉取:
浏览器输入:http://192.168.188.181:7001/application.yml
- 再创建一个容器
docker run -di --name=config2 --network=mynet -e PORT="-Dserver.port=7002" -e EUREKA="-Deureka.client.service-url.defaultZone=http://eureka1:10086/eureka,http://eureka2:10087/eureka" -p 7002:7002 192.168.188.182:8086/zql/microservice-config-server:0.0.1
浏览器查看:http://192.168.188.181:10086/
至此一共创建了5个容器 7001重复了啊,不然就4个
再试试7002是否能拉取github项目 http://192.168.188.181:7002/application.yml
2.2.3 数据库的创建
docker run -di --name=db1 --network=mynet -p 3306:3306 -v /usr/local/mysqlconfig:/etc/mysql/mysql.conf.d -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=springJpa mysql:5.7
验证:
2.2.4 项目ZuulGateWay
步骤一、在项目根目录创建docker目录,创建Dockerfile文件
# 基于哪个镜像
FROM java:8
# 拷贝文件到容器,也可以直接写成ADD xxxxx.jar /app.jar
COPY ZuulGateWay-*.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8888
#配置环境变量,接受外部传递参数
#启动端口
ENV PORT=""
#注册中心地址
ENV EUREKA=""
# 配置容器启动后执行的命令
ENTRYPOINT ["sh","-c","java $PORT $EUREKA -jar /app.jar"]
步骤二、修改pom.xml,修改maven Docker插件
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>192.168.188.138:8086/microservice-zuul-gateway:0.0.1</imageName>
<dockerDirectory>${project.basedir}/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<serverId>docker-hub</serverId>
</configuration>
</plugin>
</plugins>
</build>
2.2.5 项目UserProvdier01
步骤一、在项目根目录创建docker目录,创建Dockerfile文件
# 基于哪个镜像
FROM java:8
# 拷贝文件到容器,也可以直接写成ADD xxxxx.jar /app.jar
COPY UserProvdier01-*.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8888
#配置环境变量,接受外部传递参数
#监听端口
ENV PORT=""
#应用名称,用来前端显示用,不是serviceId
ENV APPLICATION=""
#注册中心地址
ENV EUREKA=""
# 配置容器启动后执行的命令
ENTRYPOINT ["sh","-c","java $PORT $APPLICATION $EUREKA -jar /app.jar"]
步骤二、修改pom.xml,修改maven Docker插件
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>192.168.188.138:8086/microservice-provdier-service:0.0.1</imageName>
<dockerDirectory>${project.basedir}/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<serverId>docker-hub</serverId>
</configuration>
</plugin>
</plugins>
</build>
步骤三、bootstrap.yml配置文件内容
spring:
cloud:
config:
discovery:
enabled: true
service-id: CONFIG-SERVER
profile: dev
label: master
步骤四、项目在git存储的配置文件
ProviderVersion: UserProvider0.0.1
spring:
datasource:
url: jdbc:mysql://db1:3306/springboot-005?serverTimezone=GMT%2B8
username: root
password: 123
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
application:
name: UserProvider
management:
endpoints:
web:
exposure:
include: refresh,health,info
注意:配置文件级别 本地配置文件—》-D参数注入配置文件----》远程配置中心配置文件,级别越来越高。
2.2.6 项目 UserWeb06
步骤一、在项目根目录创建docker目录,创建Dockerfile文件
# 基于哪个镜像
FROM java:8
# 拷贝文件到容器,也可以直接写成ADD xxxxx.jar /app.jar
COPY UserWeb06-*.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8888
#配置环境变量,接受外部传递参数
#监听端口
ENV PORT=""
#应用名称
ENV APPLICATION=""
#注册中心服务器地址
ENV EUREKA=""
# 配置容器启动后执行的命令
ENTRYPOINT ["sh","-c","java $PORT $APPLICATION $EUREKA -jar /app.jar"]
步骤二、修改pom.xml,修改maven Docker插件
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>192.168.188.138:8086/microservice-user-web:0.0.1</imageName>
<dockerDirectory>${project.basedir}/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<serverId>docker-hub</serverId>
</configuration>
</plugin>
</plugins>
</build>
步骤三、bootstrap.yml配置文件内容
spring:
application:
name: UserWeb06
cloud:
config:
discovery:
enabled: true
service-id: CONFIG-SERVER
profile: dev
label: master
2.3 编译工程创建镜像
步骤一、上传项目EurekaServer01到Linux服务器目录:/usr/local/springboot/EurekaServer01
步骤二、执行编译、打包、构建docker镜像指令
进入当前项目目录
cd /usr/local/springboot/EurekaServer01
编译、打包、发布Docker镜像指令:
mvn clean -Dmaven.test.skip=true -DpushImage package docker:build
查看镜像:
docker images
步骤三、其他项目
其他项目ConfigServer001、ZuulGateWay、UserProvdier01、UserWeb06也和上面一样,上传,然后进入项目目录执行编译、打包、构建Docker镜像指令。
最终5个镜像全部创建ok
在私有仓库可以查看到镜像
2.4 搭建实际运行项目
一:项目架构图
二:创建docker网络
根据上面的架构图,本次需要创建一个用户自定义网络:
Docker指令:
docker network create mynet
查看docker网络指令:
docker network ls
构建网络成功后,所有加入到该用户自定义网络的容器即可通过容器名称相互连接。
步骤三:创建运行docker容器
步骤四:查看docker容器输出日志
通过指令:
docker logs -f -t --tail 10 provider1
就可以查看对应的容器日志输出
步骤五:测试运行
访问:http://192.168.188.138:9001