欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring cloud+docker 部署

程序员文章站 2024-03-20 23:02:16
...

    这是本人第一次发表博客,而且中文水平比较差,所以大家凑合着看吧。本人现在在学习spring cloud+docker,发此博的目的是将自己踩过的坑说出来,让大家少走些弯路,这些坑我也在某度上找过,但都没有太详细的,希望对大家有帮助,有说的不对的地方大家一起讨论。最后说一句,本文中提到的都是经过本人亲测的。

     1、spring cloud的使用,这个不说了,网上很多。

     2、docker部署,简单的说一下,本人开发用idea,在项目中加入docker插件,具体代码如下:

<build>
        <finalName>recognition_cloud</finalName>
        <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>1.1.1</version>
                <configuration>
                    <imageName>recognition-cloud-9001:${project.version}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <dockerHost>http://192.168.1.174:2375</dockerHost>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

 Dockerfile:

From java:8
ADD recognition_cloud.jar recognition_cloud.jar
EXPOSE 9001
ENTRYPOINT ["java","-jar","recognition_cloud.jar"]
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

这样就可以了,注意,当打完jar包后并不是马上就可以调用远程的docker,而是要在右侧的导航中选则Plugins->docker->docker:build来完成部署,还有就是远程的docker必须打开远程打包的功能。

3、那么问题来了,我在未使用spring cloud的时候这样是没问题的,而spring cloud是服务注册制,也就是将服务注册到eureka中,如果是没有集群,没有负载均衡,如果每个服务只部署一个点就可以,那没问题,如果要集群,要负载均衡,就要部署多个点,而每个点的IP、端口都需要不同,那总不能打一次包改一次配置文件再打包吧,所以本文主要解决的还是这个问题。首先是eureka的集群,我在两台不同的机器的docker上部署,所有部署在docker上的服务在请求的时候都用的是docker的虚拟IP,而不是本机的IP,这样就导致一个问题,就是在其它服务访问的时候访问的不是主机的IP,而是docker为空器提供的虚拟IP,所以在spring boot微服务的配置文件上要配置写死的IP。

#用IP进行集群,必须在不同的服务器上,有不同的IP地址
#如果是集群,这个名称必须一样
spring.application.name=spring-cloud-eureka
eureka.instance.appname=spring-cloud-eureka
server.port=8000
#这句就是用IP进行集群
eureka.instance.prefer-ip-address=true
#注册服务时的真实IP,如果是docker部署必须写出来,不然会导致不同主机访问不到的情况
eureka.instance.ip-address=192.168.1.174   
#eureka.instance.ip-address=192.168.2.121
#下面两句是不注册,也就是不群集,加上这两句后,第三句不起作用
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
#关闭自我保护,一般关闭这个,不然相同的实例会有很多
eureka.server.enableSelfPreservation=false
#集群地址,多个用,号分隔
eureka.client.serviceUrl.defaultZone=http://192.168.1.174:8000/eureka/

那么这个端口与IP写死了,如果我要部署两个点,就需要再改一次,这样显然是不对的,所以这个配置文件再改一次,去掉

server.port及eureka.instance.ip-address,修改一个Dockerfile文件,然后在启动容器的时候传一些参数就可以了,看代码:Dockerfile
From java:8
ADD EurekaServer.jar EurekaServer.jar
#注意下方的环境变量
ENV PARAMS=""
#在启动命令中使用环境变量来控制服务的IP与端口
ENTRYPOINT ["sh","-c","java $PARAMS -jar EurekaServer.jar"]
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#用IP进行集群,必须在不同的服务器上,有不同的IP地址
#如果是集群,这个名称必须一样
spring.application.name=spring-cloud-eureka
eureka.instance.appname=spring-cloud-eureka
#server.port=8000
#这句就是用IP进行集群
eureka.instance.prefer-ip-address=true
#eureka.instance.ip-address=192.168.1.174
#eureka.instance.ip-address=192.168.2.121
#下面两句是不注册,也就是不群集,加上这两句后,第三句不起作用
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
#关闭自我保护,一般关闭这个,不然相同的实例会有很多
eureka.server.enableSelfPreservation=false
#集群地址,多个用,号分隔
eureka.client.serviceUrl.defaultZone=http://192.168.1.174:8000/eureka/

docker启动命令:docker run --name eureka-server -e PARAMS="-Dserver.port=8000 -Deureka.instance.ip-address=192.168.1.174" -p 8000:8000 -d eureka-server  这样就实现了动态的传入参数。

完活。

相关标签: spring cloud docker