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-registryregister-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,并设置健康检查的url health-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

eureka docker部署 feign 请求ip问题 eureka docker集群_spring

②重新加载配置文件,执行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插件)

eureka docker部署 feign 请求ip问题 eureka docker集群_eureka_02

如果能在installed中看到Docker,表明Docker插件安装成功,否则需要切换到Marketplace找到Docker插件进行安装

2、配置Docker连接

①在Idea底下面板中显示services tab

eureka docker部署 feign 请求ip问题 eureka docker集群_spring_03

②创建Docker连接

eureka docker部署 feign 请求ip问题 eureka docker集群_Docker_04

由于需要在三台服务器上部署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目录在同一路径下,项目结构如下:

eureka docker部署 feign 请求ip问题 eureka docker集群_eureka_05

二、使用Docker插件生成镜像并自动上传到Linux服务器
1、配置Docker

1、进入Docker配置页

eureka docker部署 feign 请求ip问题 eureka docker集群_spring_06

eureka docker部署 feign 请求ip问题 eureka docker集群_Docker_07

2、Docker配置

eureka docker部署 feign 请求ip问题 eureka docker集群_idea_08

Run options配置详情

eureka docker部署 feign 请求ip问题 eureka docker集群_Docker_09

Before launch配置详情

eureka docker部署 feign 请求ip问题 eureka docker集群_eureka_10

2、使用Docker创建镜像和容器

1、构建镜像,以及生成容器

eureka docker部署 feign 请求ip问题 eureka docker集群_docker_11

2、查看docker镜像的构建过程及构建结果

eureka docker部署 feign 请求ip问题 eureka docker集群_Docker_12

3、查看docker容器的其他信息

eureka docker部署 feign 请求ip问题 eureka docker集群_Docker_13

4、操作Linux服务器上的镜像和容器,可以进行删除镜像、启动容器、停止容器、删除容器等操作

eureka docker部署 feign 请求ip问题 eureka docker集群_docker_14

搭建过程中遇到的问题:

1、Failed to deploy ‘vhr-front Dockerfile: Dockerfile’: Not connected to docker,参考: