Docker里面的微服务注册与发现(要注册宿主机的IP和端口)
微服务启动的时候,会自动向服务注册中心报告自己的ip和端口。但是服务是在docker容器内运行的,注册的ip就成了172开头的docker内部ip, 这个地址是无法被其它机器访问的。本文介绍如何把Docker里的微服务暴露在服务中心上,以便客户端的调用。...
·
微服务启动的时候,会自动向服务注册中心报告自己的ip和端口。但是服务是在docker容器内运行的,注册的ip就成了172开头的docker内部ip, 这个地址是无法被其它机器访问的。
本文介绍如何把Docker里的微服务暴露在服务中心上,以便客户端的调用。
修改application.yml
- 设置一个server.ip的变量,可以为空,用于nacos注册。非Docker环境值为空,nacos会自动获取本机IP作为注册IP;Docker环境下,ip通过Docker变量传入Docker主机的IP做为注册IP。
- 把spring.cloud.nacos.discovery.ip设置为${server.ip}
- 把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条内容
所有评论(0)