什么是Jib?
- Jib 是由Google提供的一个简化Docker容器构建的工具
- 基于Maven或Gradle插件的方式运行
- 不需要Docker deamon
- 自动实施很多Docker的最佳实践
传统构建和Jib构建的区别
传统构建镜像的方式
- Build Jar 包
- 通过Docker构建镜像
- 上传镜像到镜像仓库
fkzRqe2.png
Jib构建镜像方式
-
一行命令构建,自动上传到镜像仓库
b4uolYy.png
添加Jib到POM
打开Spring Boot应用的pom.xml文件,添加下面的plugin 和build 选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ... <build> <plugins> ... <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>1.8.0</version> <configuration> <from> <image>openjdk:8u222-slim</image> </from> <to> <image>k8s-demo-app</image> </to> <container> <user>nobody:nogroup</user> </container> </configuration> </plugin> ... </plugins> </build> ... |
使用Jib构建一个Docker容器
现在构建一个Spring Boot应用的容器将会变得简单
1 | $ ./mvnw clean compile jib:dockerBuild |
输出如下
1 2 3 4 5 6 7 8 9 10 | [INFO] Built image to Docker daemon as k8s-demo-app [INFO] Executing tasks: [INFO] [==============================] 100.0% complete [INFO] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 01:21 min [INFO] Finished at: 2020-04-18T17:59:19+08:00 [INFO] ------------------------------------------------------------------------ |
NOTE: This still uses your local Docker dameon to build the container
使用Jib推送容器到私有镜像仓库
由于网络的原因,推送到 Docker Hub 在国内不是一个很好的选择,这里推荐两个国内的镜像仓库
- 腾讯容器服务
- 阿里云容器服务
登录私有镜像仓库
- 你需要先登录到镜像仓库,Jib才能把镜像推送到私钥的镜像仓库中,此处使用腾讯容器服务作为演示
1 2 3 | docker login --username=your_username --password=your_password ccr.ccs.tencentyun.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. Login Succeeded |
修改Jib Plugin 配置
回到pom.xml文件,需要修改一下Jib的配置,如镜像名字.我们还添加了一个执行目标,以便在运行Maven构建后进行容器构建并推送至镜像仓库
请务必替换 NAMPSPACE 为你自己的命名空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>1.8.0</version> <configuration> <from> <image>openjdk:8u222-slim</image> </from> <to> <image>ccr.ccs.tencentyun.com/[namespace]/k8s-demo-app</image> </to> <container> <user>nobody:nogroup</user> </container> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin> |
构建和部署容器
- 现在你应该可以使用Maven build, 它将构建容器并将容器推送到镜像仓库
1 | ./mvnw clean package |
-
回到镜像仓库,你应该看到了你新构建的容器在镜像仓库中
test2.png
部署到Kubernetes
参考第一篇文章,在deployment.yaml里面修改一些 images
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: k8s-demo-app name: k8s-demo-app spec: replicas: 1 selector: matchLabels: app: k8s-demo-app strategy: {} template: metadata: creationTimestamp: null labels: app: k8s-demo-app spec: containers: - image: ccr.ccs.tencentyun.com/[YONUR_NAMESPACE]/k8s-demo-app:latest name: k8s-demo-app imagePullPolicy: IfNotPresent resources: {} status: {} |
执行命令部署
1 | kubectl apply -f ./k8s |
测试
1 2 | curl http://localhost:30080 hello world |
简单吧,当你修改了代码之后,你只需要两条命令,就能将新的应用部署到kubernetes
1 2 | ./mvnw clean package kubectl apply -f ./k8s |
代码地址