IDEA使用Docker插件搭建Eureka集群
实现的功能:
1、利用Linux服务器上的Docker将本地Eureka项目打包成镜像,并自动上传到Linux服务器上,同时创建Docker容器(本机上不需要安装Docker环境)
2、搭建Eureka集群(在三台Linux服务器上部署Eureka,并相互注册)
3、在Eureka中使用Spring Security,访问Eureka页面需要输入账号和密码,增加Eureka的安全性
一、准备工作
1、编写Eureka项目
正常搭建Eureka项目即可,在三台服务器上部署项目,其中之一的application.yml配置如下
server:
port: 8761
spring:
application:
name: aservice-eureka
security: # spring security hpptbasic 的账号和密码
user:
name: admin
password: admin
eureka:
instance:
hostname: peer1 # 该服务部署的主机名称
health-check-url: http://${eureka.instance.hostname}:${server.port}/actuator/health
client:
fetch-registry: true # 否从其他实例获取服务注册信息,如果是单节点部署就是false,集群部署就是true
register-with-eureka: true # 是否向eureka注册服务,如果是单节点部署就是false,集群部署就是true
service-url:
defaultZone: http://admin:admin@peer1:${server.port}/eureka/,http://admin:admin@peer2:${server.port}/eureka/ # 注册到其他eureka服务器
healthcheck:
enabled: true # 开启健康检查,默认开启
注意:
1、由于搭建的是Eureka集群,我采用的三台服务器,需要将
fetch-registry
和register-with-eureka
都设置成true,开启服务间的互相注册功能;2、peer1、peer2、peer3是三台服务器的名字,需要在/etc/hosts中加上对应的ip映射,例如:
192.168.79.128 peer1
192.168.79.129 peer2
192.168.79.130 peer3
这步不需要操作,因为我们是采用Docker部署项目,需要修改Docker容器中的/etc/hosts内容,后面会在启动命令中进行添加
3、另外两台服务器上部署的项目,只需要把配置文件中的
service-url.defaultZone
中修改peer1和peer2即可,以及修改eureka.instance.hostname
,其他的不需要更改4、在项目中使用了Spring Security,增加了Eureka的安全性,避免所有人都可以直接访问Eureka页面,简单起见,使用的是httpbasic认证,方法如下:
①加入Security依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
②在编写如下配置类
@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.httpBasic()
.and()
.authorizeRequests()
.anyRequest()
.authenticated();
}
}
③在配置文件中配置访问Eureka的账号和密码
spring:
security:
user:
name: admin
password: admin
④在
service-url.defaultZone
中加上访问Eureka的账号和密码,http://admin:admin@peer1:${server.port}/eureka/
中的admin:admin
分别是Eureka的账号和密码5、开启Eureka的健康检查,
healthcheck.enabled
设置为true,并设置健康检查的urlhealth-check-url
,Eureka集群中必须开启,Eureka就是通过健康检查判断Eureka节点是否正常工作,需要引入以下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、开启Linux服务器Docker远程连接
1、在Linux服务器上安装上Docker,网上教程很多,请自行参考
2、开启Docker远程API
①编辑Docker配置文件,执行
vi /usr/lib/systemd/system/docker.service
命令,找到以ExecStart开头的行,注释掉,然后在下面加上ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
②重新加载配置文件,执行
systemctl daemon-reload
命令③重启docker,执行命令
systemctl restart docker
命令④验证Docker远程连接是否成功,执行
netstat -anp|grep 2375
命令,如果能看到端口信息,并且执行curl 127.0.0.1:2375/info
能显示信息,说明Docker远程连接配置成功
3、IDEA安装Docker插件,并配置Docker远程连接
1、安装Docker插件,File->Settings->Plugins打开插件面板,搜索Docker(新版IDEA好像默认会安装Docker插件)
如果能在installed中看到Docker,表明Docker插件安装成功,否则需要切换到Marketplace找到Docker插件进行安装
2、配置Docker连接
①在Idea底下面板中显示services tab
②创建Docker连接
由于需要在三台服务器上部署Eureka,所以需要创建三个服务器的Docker连接
4、在Pom.xml中加入docker-maven-plugin
插件
完整的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.shuguangtj</groupId>
<artifactId>spring-cloud-study</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.shuguangtj</groupId>
<artifactId>aservice-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>aservice-eureka</name>
<description>eureka注册中心服务</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${project.name}:v1</imageName>
<dockerDirectory>${project.basedir}</dockerDirectory>
<skipDockerBuild>false</skipDockerBuild>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
5、编写Dockefile
FROM java:8
# 指定工作路径,到docker exec -it 进入到容器内部,会进入到该路径下,如果路径不存在会自动创建
WORKDIR /opt/aservice/eureka
# 将jar包加入到镜像,./ 是上面指定的WORKDIR路径
ADD target/aservice-eureka-0.0.1-SNAPSHOT.jar ./
# 暴露端口
EXPOSE 8761
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=peer2", "aservice-eureka-0.0.1-> SNAPSHOT.jar"]
注意:Dockerfile文件跟targer目录在同一路径下,项目结构如下:
二、使用Docker插件生成镜像并自动上传到Linux服务器
1、配置Docker
1、进入Docker配置页
2、Docker配置
Run options配置详情
Before launch配置详情
2、使用Docker创建镜像和容器
1、构建镜像,以及生成容器
2、查看docker镜像的构建过程及构建结果
3、查看docker容器的其他信息
4、操作Linux服务器上的镜像和容器,可以进行删除镜像、启动容器、停止容器、删除容器等操作
搭建过程中遇到的问题:
1、Failed to deploy ‘vhr-front Dockerfile: Dockerfile’: Not connected to docker,参考: