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

一. 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作容器通信了,因为一个小网中的容器可以通过容器名互相通信。弄起来很简单,就下面几个步骤:

  1. 相关镜像已经全部打好。
  2. 创建小网(默认使用桥接方式)

    sudo docker network create --driver bridge isolated_nw #创建命令
    sudo docker network inspect isolated_nw #检视创建的网络信息
  3. 加入小网(以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好像被墙了,一直下载失败。

猜你喜欢

转载自blog.csdn.net/liubingyu12345/article/details/79021287