1. provider上报服务地址到dubbo,此时的服务地址的ip:port是容器的ip:port2. consumer从dubbo获取到服务地址,然后调用该服务这时候我们就会发现,我们的服务调用是存在跨主机访问的情况的,那么我们应该怎么办?首先docker已经提供了跨主机访问的解决方案,前提是会牺牲性能以及需要搭建额外的key-value存储系统。但是我们不想用这种略显复杂的方式,我们的部署机器数很小,只是通过切换DOCKER_HOSTS就可以进行运维管理了。那么我们可以采用host模式来部署。host模式会直接占用宿主机的端口。如果采用host模式部署系统的话,就会有第二个问题了,那就是相同的java web容器,默认启动的端口都是一样的,比如tomcat,都是8080。所以这里我们就可以通过修改tomcat默认镜像,将tomcat的配置文件中的默认端口置为变量,然后在容器启动的时候以环境变量的方式修改启动端口即可。自定义tomcat镜像,支持环境变量修改portFROM tomcat:8MAINTAINER heiziCOPY server.xml /usr/local/tomcat/conf/server.xmlENV HTTP_PORT 8080ENV AJP_PORT 8081ENV SHUTDOWN_PORT 8082COPY start.sh /usr/local/tomcat/bin/start.shENTRYPOINT start.sh其中server.xml中做的改动主要是将默认的port改为易识别的可修改的变量,而start.sh则修改了tomcat默认启动脚本,如#!/bin/bash -eset -xrm -rf /usr/local/tomcat/webapps/ROOTsed -i "s/{shutdown_port}/$SHUTDOWN_PORT/g" /usr/local/tomcat/conf/server.xmlsed -i "s/{ajp_port}/$AJP_PORT/g" /usr/local/tomcat/conf/server.xmlsed -i "s/{http_port}/$HTTP_PORT/g" /usr/local/tomcat/conf/server.xmlcatalina.sh run准备compose文件部署应用provider:image: providerenvironment:- HTTP_PORT=9000- AJP_PORT=9001- SHUTDOWN_PORT=9002mem_limit: 1grestart: alwaysnet: "host"consumer1:image: consumer1environment:- HTTP_PORT=9010- AJP_PORT=9011- SHUTDOWN_PORT=9012mem_limit: 1grestart: alwaysnet: "host"consumer2:image: consumer2environment:- HTTP_PORT=9020- AJP_PORT=9021- SHUTDOWN_PORT=9022mem_limit: 1grestart: alwaysnet: "host"这样我们就可以简易的将一个分布式的系统部署起来了