近期在做项目的容器化改造,公司提供了一整套容器化管理平台,在正式上之前,现在本地搭建了一套测试环境(Centos7+Docker)去跑一下服务,测试dockerfiler,eureka注册,服务调用等。
目前有一个问题,各个应用都可以起来,Eureka客户端也可以注册到EurekaServer,每个服务也都可以正常访问,但是在进行服务间调用的时候总是提示"connection refused"。
测试环境:Centos7*2[192.168.56.101,192.168.56.102]+Docker
系统:SpringCloud、SpringBoot2.x、Eureka
Eureka Server运行在101服务器
Eureka服务端配置如下:
server:
port: 8011
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
enable-self-preservation: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
编辑dockerfile:
#基础dockerfile地址,新项目不要更改
FROM java:8
#dockerfile owner 新项目请变更为 项目名/owner
MAINTAINER projectname/owner
#ADD 项目包名到容器的 /data/xxx路径下
ADD server-0.0.1.jar /data/xxx/
# 应用端口
EXPOSE 8011
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir /data/logs
#切换工作目录
WORKDIR /data/xxx
#启动目录
ENTRYPOINT ["java","-jar","server-0.0.1.jar"]
构建镜像:
docker build -f server-8001 -t server:0.0.1 .
运行容器:
docker run -d -p 8001:8001 --name=server --hostname=server server:0.0.1
访问容器:http://192.168.56.101:8001
Eureka 客户端配置如下:
eureka:
client:
fetch-registry: true
register-with-eureka: true
serviceUrl:
defaultZone: http://192.168.56.102:8011/eureka/
instance:
prefer-ip-address: true #使用IP进行注册
ip-address: ${HOST} # 使用固定IP
客户端注册的时候采用的是IP注册的方式,因为Docker运行微服务,进行注册的时候,如果采用实例ID注册,然么在进行服务调用时最后在封装请求的时候获取的是Docker容器的IP,比如172.17.0.1。这时候在通过OpenFeign进行服务调用的时候就会失败。
关于如何动态修改变量“HOST”,经过测试后有以下两种方式
在执行docker run的时候通过"-e"传递。
编辑dockerfile:
#基础dockerfile地址,新项目不要更改
FROM java:8
#dockerfile owner 新项目请变更为 项目名/owner
MAINTAINER projectName/owner
#ADD 项目包名到容器的 /data/gwapp路径下
ADD projectname-0.0.1-SNAPSHOT.jar /data/xxx/
# 应用端口
EXPOSE 8014
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir /data/logs
#切换工作目录
WORKDIR /data/xxx/
#启动目录
ENTRYPOINT ["java","-jar","xxx-0.0.1-SNAPSHOT.jar"]
构建镜像:
docker build -f xxx -t xxx:0.0.1 .
然后运行容器,并设置HOST参数:
docker run -d -e HOST='192.168.56.101' -p 8014:8014 --name=xxx --restart=always --hostname=xxx xxx:0.0.1
注意:“-e” 参数要写在“-p”前面。
在构建镜像的时候写入:
dockerFile:
#基础dockerfile地址,新项目不要更改
FROM java:8
#dockerfile owner 新项目请变更为 项目名/owner
MAINTAINER projectName/xxx
#ADD 项目包名到容器的 /data/gwapp路径下
ADD xxx-0.0.1.jar /data/xxx/
# 应用端口
EXPOSE 8011
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir /data/logs
#切换工作目录
WORKDIR /data/xx
#启动目录【其实这里也有两种写法】
ENTRYPOINT ["java","-DHOST=192.168.56.101","-jar","xxx-0.0.1.jar"]
#ENTRYPOINT ["java","-jar","xxx-0.0.1.jar","--HOST=192.168.56.101"]
【这里应该也需要写成动态可变的,有了解的可以说一下】
构建镜像:
docker build -f xxx -t xxx:0.0.1 .
然后运行容器,并设置HOST参数:
docker run -d -p 8014:8014 --name=xxx --restart=always --hostname=xxx xxx:0.0.1
至此就可以实现服务注册,解决服务调用失败问题。