Docker里面的微服务注册与发现(要注册宿主机的IP和端口)

微服务启动的时候,会自动向服务注册中心报告自己的ip和端口。但是服务是在docker容器内运行的,注册的ip就成了172开头的docker内部ip, 这个地址是无法被其它机器访问的。

本文介绍如何把Docker里的微服务暴露在服务中心上,以便客户端的调用。

修改application.yml

  1. 设置一个server.ip的变量,可以为空,用于nacos注册。非Docker环境值为空,nacos会自动获取本机IP作为注册IP;Docker环境下,ip通过Docker变量传入Docker主机的IP做为注册IP。
  2. 把spring.cloud.nacos.discovery.ip设置为${server.ip}
  3. 把spring.cloud.nacos.discovery.port设置为${server.port},缺省情况下为9082,可以通过Docker变量传入Docker主机的映射port,这样就可以把Docker主机映射端口作为注册端口。

具体样例如下:

server:
  port: 9082 #端口号
  ip:
spring:
  application.name: xxx-engine
  cloud.nacos.discovery:
    server-addr: 10.0.0.8:8848
    group: local
    ip: ${server.ip}
    port: ${server.port}

修改docker-plugin

增加HOST, PORT变量,以便传入Docker host的IP和映射端口。

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.2.0</version>
    <configuration>
        <imageName>ford.cn/csre-${project.artifactId}</imageName>
        <baseImage>openjdk:11.0.13-oraclelinux8</baseImage>
        <entryPoint>["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom \
            -Dserver.ip=$HOST -Dserver.port=$PORT -Duser.timezone=Asia/Shanghai \
            -jar /usr/app/${project.build.finalName}.jar --spring.profiles.active=$PROFILES"]
        </entryPoint>
        <workdir>/usr/app</workdir>
        <imageTags>
            <imageTag>${project.version}</imageTag>
            <imageTag>latest</imageTag>
        </imageTags>
        <exposes>$PORT</exposes>
        <env>
            <PROFILES>prod</PROFILES>
            <HOST>127.0.0.1</HOST>
            <PORT>8080</PORT>
            <JAVA_OPTS>-Xms512m -Xmx512m -Xss1024K -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m</JAVA_OPTS>
        </env>
        <!-- copy the service's jar file from target into the root directory of the image -->
        <resources>
            <resource>
                <targetPath>/usr/app</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
</plugin>

这样设置后可以构建Docker镜像了。

Docker运行

Docker镜像构建好后,必须要传入HOST和PORT两个变量,

HOSTNAME="192.168.0.118"
docker run -d -e "PROFILES=sit" -e "HOST=$HOSTNAME" -e "PORT=9091" -p:9091:9091 --name engine1  johnny2002/xxx-engine
docker run -d -e "PROFILES=sit" -e "HOST=$HOSTNAME" -e "PORT=9092" -p:9092:9092 --name engine2  johnny2002/xxx-engine
docker run -d -e "PROFILES=sit" -e "HOST=$HOSTNAME" -e "PORT=9093" -p:9093:9093 --name engine3  johnny2002/xxx-engine

注:为了简化配置项,保持内外端口一致,反正Docker容器内端口随便用嘛_

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值