【Docker】Docker运行SpringCloud微服务并通过IP进行服务注册

近期在做项目的容器化改造,公司提供了一整套容器化管理平台,在正式上之前,现在本地搭建了一套测试环境(Centos7+Docker)去跑一下服务,测试dockerfiler,eureka注册,服务调用等。

目前有一个问题,各个应用都可以起来,Eureka客户端也可以注册到EurekaServer,每个服务也都可以正常访问,但是在进行服务间调用的时候总是提示"connection refused"。

测试环境:Centos7*2[192.168.56.101,192.168.56.102]+Docker

系统:SpringCloud、SpringBoot2.x、Eureka

1、配置并启动Eureka Server

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

2、配置并启动Eureka Client

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

至此就可以实现服务注册,解决服务调用失败问题。

你可能感兴趣的:(docker,微服务,tcp/ip)