Compose是Docker用于定义和运行多容器应用程序的工具。有了Kubernetes之后,我们不需要过多的学习Docker Compose,但也有必须了解下它。如应用在微服务项目中,我们可以通过Docker Compose快速地将整个微服务项目打包生成的一个个jar构建成Docker容器镜像文件,并替换应用程序所需要的环境变量。
举个例子,假设我们整个微服务项目的代码都放在一个idea project下,服务按module划分,当我们在项目的根目录下执行mvn clean package命令之后,可以立即执行docker-compose build命令将每个模块下的jar包构建为镜像,前提是我们先写好Dockerfile与docker-compose.yaml配置文件。
Dockerfile文件的编写省略。Dockerfile文件中的每一行命令都是一层镜像,镜像分层的好处是不需要每次都拉取一个大的镜像。虽然编写在Dockerfile文件中的每一行命令都是一层镜像,但是不能实现共用,我们应该将通用配置构建成一个基础镜像,如jdk镜像,如果需要nginx,再在jdk镜像的基础上构建nginx基础镜像。
docker-compose.yaml配置文件内容如下:
version: '3.7'
services:
demo-srv:
build: ./demo-srv
image: wujiuye/demo-srv
demo-client:
build: ./demo-client
image: wujiuye/demo-client
services配置需要构建的镜像,为每个需要部署的微服务配置一个service,如本例中的demo-srv与demo-client两个微服务。build项指定Dockerfile所在的路径,这里使用相对路径。image项配置构建后的镜像名称。
将编写好的docker-compose.yaml文件也放于项目根目录下,这不是必须的,只是为了方便。对应的每个模块(微服务)的Dockerfile也应该放在每个模块的根目录下。现在执行docker-compose就能构建出所有镜像了。(这里我们不指定镜像的版本,总是使用lastest)
如果我们想通过构建容器镜像时替换spring boot应用程序的yml配置文件中的配置项,如指定spring boot使用哪个环境的配置文件、指定内置tomcat使用的端口号等,那么我们可以在docker-compose中使用environment项配置,同时在docker-compose.yaml文件相同目录下创建一个.env文件,配置环境变量对应的值。
.env配置文件内容:
SPRING_PROFILES_ACTIVE=sit
SERVER_PORT=8080
docker-compose.yaml配置文件修改,添加环境变量配置:
version: '3.7'
services:
demo-srv:
build: ./demo-srv
image: wujiuye/demo-srv
environment:
- SPRING_PROFILES_ACTIVE
- SERVER_PORT
demo-client:
build: ./demo-client
image: wujiuye/demo-client
environment:
- SPRING_PROFILES_ACTIVE
- SERVER_PORT
spring boot的application.yml配置文件也需要修改下:
spring:
profiles:
active: ${SPRING_PROFILES_ACTIVE:dev}
server:
port: ${SERVER_PORT:8080}
冒号(:)后面指定当环境变量没有配置时,使用的默认值,这用于本地开发调试,因为本地开发不使用docker运行,本例中默认使用dev环境为本地debug环境。
关于docker-compose的使用就介绍到这,因为其它的功能我暂时也都用不到,感兴趣的读者可自行深入去学习。