Docker容器化+Dubbo应用之指定IP

使用Docker容器化SpringBoot+Dubbo应用的实践
Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程。作者结合平时的部署经验,联系Docker的特点,用本篇博客记录使用Docker容器化SpringBoot+Docker应用的方法。

要解决的问题

Dubbo的Provider在Docker container中进行服务注册,在zookeeper中的注册IP是容器IP,这样外部的Dubbo Consumer是无法调用的。

第一步

我们需要准备好一个SpringBoot+Dubbo的项目,同时本机需要安装Docker。

  • 新建一个Dockerfile

vi Dockerfile

  • 编写Dockerfile
1.    FROM openjdk:8-jre-alpine
    
2.    MAINTAINER luoliang
    
3.   ADD target/dubbo-provider.jar app.jar
    
4.   ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom",
    "-jar","/app.jar"]
  • 运行Provider容器
docker run -d -p 12345:12345 --name dubbo-provider dubbo-provider
  • 查看容器的启动日志
    Docker容器化基于SpringBoot+Dubbo的应用实践

可以看到日志输出的current host: 172.17.0.2,这个IP就是容器内的IP,同时可以看到服务注册的IP也是172.17.0.2,此时我的本地IP是192.168.1.7,如果消费者去消费服务,是不会成功的。

  • 启动消费者会直接报错
    Docker容器化基于SpringBoot+Dubbo的应用实践

这种情况网上很多解决办法都是通过固定容器IP来解决,这样的话移植性不是很好。Dubbo在重新维护后,在新版本中添加了两个环境变量,用于支持Docker容器。可以查看官方的issue.

  1. 修改上面的Dockerfile,添加env
    DUBBO_IP_TO_REGISTRY 填写在zookeeper中注册的IP
FROM openjdk:8-jre-alpine

MAINTAINER luoliang

ENV DUBBO_IP_TO_REGISTRY 192.168.1.7 ENV DUBBO_PORT_TO_REGISTRY 12345

ADD target/dubbo-provider.jar app.jar

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","/app.jar"]

EXPOSE 12345 

重新build之后重新启动一个容器,可以看到服务注册地址已经变成了指定的IP,消费者可以成功的进行调用。

  • 也可以不修改Dockerfile,通过run命令传入参数
docker run -d -p 12345:12345 -e DUBBO_IP_TO_REGISTRY=192.168.1.7 -e DUBBO_PORT_TO_REGISTRY=12345 --name dubbo-provider dubbo-provider
  • 此时服务提供者的log如下

Docker容器化基于SpringBoot+Dubbo的应用实践

这时候虽然current host还是172.17.0.2,但服务的注册地址已经变成了192.168.1.7。

使用maven插件构建镜像

上面我们都是通过手动构建的镜像,为了提高效率,同时也能让SpringBoot+Dubbo这样的项目能更好的融入像Jenkins这样的CI系统中,构建出全自动的pipeline。

  • 在pom中加入插件的依赖
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>default</id>
            <goals>
                <goal>build</goal>
                <goal>push</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <repository>dubbo-provider</repository>
        <tag>latest</tag>
        <buildArgs>
            <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
</plugin>
  • 把dockerfile放在和pom.xml同级的目录下
project/
  Dockerfile
  pom.xml
  • 使用maven命令进行打包
mvn package 或者 mvn dockerfile:build
  • 命令执行完成,可以使用docker images查看镜像,剩余步骤同上。
    经测试,容器运行正常
    Docker容器化基于SpringBoot+Dubbo的应用实践

END

本文到这里就结束了,我在上一篇博客的源码中进行了一些改动,文中用到的Dockfile都在其中,源码在这里,文章是个人学习的实践总结,会有不完善的地方,若有更好的做法,欢迎大家指出,谢谢!

参考自:https://blog.csdn.net/oppo5630/article/details/8064624

相关文章:

  • 2021-06-24
  • 2021-09-04
  • 2021-12-20
  • 2021-11-08
  • 2021-06-01
  • 2021-07-09
  • 2021-12-27
  • 2021-09-12
猜你喜欢
  • 2021-05-05
  • 2022-12-23
  • 2021-11-04
  • 2021-10-27
  • 2021-10-10
  • 2021-05-16
相关资源
相似解决方案