服务容器构建
概述
微服务系统通常都要配合 Docker 或者 K8S 才能发挥更大的效能。将服务打包为 Docker 镜像,是微服务系统必要的构建工作。
[一]Docker 打包设计初衷
Dante Cloud Docker 打包的设计,采取了与大多数开源微服务框架不同的方式。采取这种不同的方式进行打包,主要是考虑解决以下两方面问题:
[1]Skwalking Agent 的引入问题
系统中为了解决服务链路跟踪及监控的问题,引入了 Skywalking 组件。Skywalking 想要正确运行,除了要保证 Skywalking Server 的正常运行外,还要将 Skywalking Agent "注入" 到服务的运行环境中。
- 如果是以
fat jar
的方式运行服务,需要在服务的运行命令中指定 Skywalking Agent 以及相关的参数,如下命令
java -javaagent:/skywalking-agent.jar=agent.service_name=${SW_AGENT_SERVICE_NAME},collector.backend_service=${SW_COLLECTOR_BACKEND_SERVICE} ${JAVA_OPTS} -jar /app.jar
- 如果是以 Docker 的方式运行服务,传统的方式就需要把
skywalking-agent.jar
一并打入到服务的 docker 中。
由于 Docker Compose 打包上下文的问题,就需要在每一个模块中都复制一份 skywalking-agent.jar。很不好管理,看着也不舒服。
[2]Dockerfile 的编写和放置问题
常规 Java 微服务的 Docker 打包方式,要么采用 Maven Plugin 的方式,要么采用 Docker Compose 的方式。不管哪一种方式,都需要在该服务代码所在目录下新建一个 Dockerfile 文件。
- 一方面,每个服务下的 Dockerfile 文件中的配置信息,除了服务的 JAR 包名不同以外,其余的所有配置都相同,就是一种重复劳动。
- 另一方面,如果要增加 Skywalking,那么需要在每一个服务所在目录下都拷贝一份
skywalking-agent.jar
。不仅重复工作,代码结构也不美观整洁。
[二]Docker 打包的设计
为了解决上述两方面问题,Dante Cloud 在所有模块之外之指定了一个统一的目录,将需要打包的 jar 以及 dockerfile 全部放入该目录,通过该目录形成一个统一的上下文环境。在Dante Cloud工程中,${project_home}/configurations/docker/context
就是这个上下文环境。
在这个上下文环境中,除了包含通用的 Dockerfile,Skywalking Agent 以外,在使用 Maven 进行编译的过程中,还会将所有需要打包服务的对应的 jar 包拷贝到${project_home}/configurations/docker/context/target
目录下。这样打包的所有资源就都已经具备,同时还解决了上述两个问题。
提示
可以通过修改${project_home}/pom.xml
中的<docker.build.directory>
值,来改变拷贝 jar 包的目录
[三]Docker 打包使用方法
[1]修改信息
由于使用了一个统一的 Dockerfile 来解决重复定义 Docker 打包配置文件的问题,想要实现使用一个 Dockerfile 打出不同的 Docker,那么就需要通过传参的方式来改变 Dockerfile 中的值。
这里采用的是环境变量的方式,在${project_home}/configurations/docker/docker-compose/.env
文件中定义这些参数。其中包含版本号以及具体服务对应的包名。所以如果有新增服务或者想要指定版本号,首先就需要修改这个配置文件。
[2]执行命令
执行打包命令
docker-compose -f ${project home}/configurations/docker/docker-compose/linux/herodotus/services.dev.yml --env-file=${project_home}/configurations/docker/docker-compose/linux/herodotus/.env up -d
或者
docker-compose -f ${project home}/configurations/docker/docker-compose/linux/herodotus/services.prod.yml --env-file=${project_home}/configurations/docker/docker-compose/linux/herodotus/.env up -d
提示
上文说到想要以 Docker 的方式运行服务并且关联 Skywalking,就需要在打包时将 Skywalking Agent 打入到 Docker 中。但实际应用中并不是所有环境都需要使用 Skywalking,比如:在生产环境需要使用 Skywalking,在开发环境中并不需要 Skywalking 以降低资源消耗。
因此,Dante Cloud 提供了两种打包配置
使用${project home}/configurations/docker/docker-compose/linux/herodotus/services.dev.yml
这个 Docker-compose 配置文件打包时,对应的 Dockerfile 文件是${project home}/configurations/docker/context/development/Dockerfile
。这个 Dockerfile 配置中,没有包含 Skywalking Agent 的拷贝命令。
使用${project home}/configurations/docker/docker-compose/linux/herodotus/services.prod.yml
这个 Docker-compose 配置文件打包时,对应的 Dockerfile 文件是${project home}/configurations/docker/context/production/Dockerfile
。这个 Dockerfile 配置中,包含了 Skywalking Agent 的拷贝命令。
这样通过不同的命令,实现了对不同 Docker 环境需求的支持。
[四]注意事项
- 以上介绍均是在本地环境中进行操作,本地环境需要有 Docker 环境。
- 如果想要在服务器进行构建,可以在本地编译好代码后,将
${project home}/configurations
目录直接拷贝或者上传到服务器,使用相同的脚本进行构建即可。