一. Spring Boot使用DockerFile maven插件自动化部署之容器通信
在这里写了如何用Docker部署Eureka,如果我们部署的是zuul和业务模块,则需要考虑容器间的通信。因为,zuul和其它微服务需要向eureka注册,然后zuul还要能正确与其它微服务通信,这些问题在物理机上直接部署不需要考虑,但在Docker部署的时候需要多做一点额外操作。
注册到eureka
由于各个微服务启动的时候要注册到eureka,所以需要改下各个微服务配置application.yml/application.properties中关于注册到eureka部分的内容
eureka配置文件
主机名设置一个名称,如discovery0,而不用ip或者是localhost,然后defaultZone的url就用discovery0代替,如下所示:
server:
port: 8800 # 注册中心占用8800端口
eureka:
instance:
hostname: discovery0
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #其实就是 http://localhost:8080/eureka/
zuul和其它微服务配置文件
配置文件改一个地方即可,即eureka.client.serviceUrl.defaultZone=http://discovery0:8800/eureka/ ##端口是eureka侧定义好的。
eureka:
serviceUrl:
defaultZone: http://discovery0:8800/eureka/ #注册中心地址
instance:
preferIpAddress: true
配置hosts文件
由于用了域名discovery0来表示eureka地址,hosts文件自然也要加上这一条,windows的hosts文件位置在:C:\Windows\System32\drivers\etc,linux是/etc/hosts这个文件。加上一条DNS映射即可:
192.168.1.123 discovery0
客户机肯定要加上面的dns映射,否则本地项目都注册不上eureka,服务器建议也加下
启动微服务容器
以zuul为例,现在去服务器上启动zuul镜像(打成镜像的步骤与这里完成相同 )
sudo docker run --name zuul -d -p 9000:9000 --link discovery:discovery0 -it zuul镜像名
主要是–link discovery:discovery0这个参数,discovery是eureka启动的容器名,discovery0是映射的别名,这个参数的作用就是在zuul容器中,加一条dns映射,表示discovery0是指向discovery这个容器的。这样微服务才能注册到eureka
如果是启动业务模块,则还需要用–link这个参数绑定到zuul这个容器,如下:
sudo docker run --name zuul -d -p 9011:9011 --link discovery:discovery0 --link zuul -it 业务xxx镜像名
–link zuul表示当前容器与容器名是zuul的连接,为了安全,-p 9011:9011可以省略,则表示该微服务只对zuul暴露位置。
到此,容器间就能正常通信了。
—————————————–分隔线————————————————
后来,我去看了下官网关于网络部分,发现官方已经不推荐使用–link参数来作容器间的通信了,转而推荐这种使用user-defined networks方式,其实就是自定义一个小网,你要启动的容器都加入到这个小网中,这样就不用–link作容器通信了,因为一个小网中的容器可以通过容器名互相通信。弄起来很简单,就下面几个步骤:
- 相关镜像已经全部打好。
- 创建小网(默认使用桥接方式)
sudo docker network create --driver bridge isolated_nw #创建命令
sudo docker network inspect isolated_nw #检视创建的网络信息
- 加入小网(以eureka和zuul为例)
sudo docker run --name discovery0 -d -p 8800:8800 --network bridge isolated_nw -it 镜像名
sudo docker run --name gateway -d --network bridge isolated_nw -it 镜像名
上面第一条是启动eureka,第二条是启动zuul,通过–network参数指明加入同一个小网。zuul的application.yml/application.properties文件中eureka注册地址的hostname部分要填写eureka的容器名,如下:
http://discovery0:8800/eureka/
这样就OK了。
PS:实际用Docker部署多个微服务,要用到Docker compose统一管理,上面的参数都可以写在docker-compose.yml中,但Docker compose好像被墙了,一直下载失败。