您的位置:首页 > 运维架构 > Docker

二. Spring Boot使用DockerFile maven插件自动化部署之容器通信

2018-01-10 10:57 1051 查看

一. 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/[/code] 

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好像被墙了,一直下载失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: