云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
6217 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

13|容器化:如何为不同语言快速构建多平台镜像?

你好,我是王炜。从这节课开始,我们来容器化的实践。
第 1 讲中,我们以 Python Flask 应用为例,展示了如何编写 Dockerfile ,如何构建和推送镜像。在编写 Dockerfile 方面,我为你介绍了构建镜像通用的套路。
但对于其他非 Python 语言编写的业务应用来说,如何快速构建镜像呢?
在这节课,我会介绍不同语言构建镜像的例子和模板,包括常用的后端语言 Java、Golang、Node.js 以及前端 Vue 框架编写的业务应用,每一种语言我都会设计一个接近真实的构建容器镜像的例子。此外,考虑构建镜像对多平台的兼容性,我还会介绍一种构建多平台镜像的方法,这样,我们构建出来的镜像就能够兼容多个不同的 CPU 平台了。未来,如果你需要对实际的业务应用进行容器化改造,完全可以参考我们这节课的内容。
在开始之前,你需要确保已经在本地安装了 Docker,并将我提前准备好的示例应用仓库克隆到本地:https://github.com/lyzhang1999/gitops.git

Java 应用容器化

我们先来看 Java 应用的容器化。
常见的 Java 应用启动方式有两种,这也就意味着镜像构建方式也有两种。一种是将应用打包成 Jar 包,在镜像内直接启动应用 Jar 包来构建镜像。另一种是在容器里通过 Spring Boot 插件直接启动应用。接下来,我分别介绍这两种镜像构建方式。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何为不同语言快速构建多平台镜像,并提供了实际的案例和操作示例。作者以Java应用为例,展示了两种常见的Java应用启动方式,并分别介绍了两种镜像构建方式。对于启动Jar包的构建方式,作者详细介绍了Dockerfile文件的内容和构建过程,以及使用docker build命令构建镜像的步骤。同时,作者还介绍了Spring Boot插件的构建方式,并提供了相应的Dockerfile文件内容。此外,文章还介绍了Golang、Node.js和Vue应用的容器化方法,为读者提供了多种语言应用容器化的实际操作示例。文章内容详实,适合读者快速了解不同语言应用的容器化方法,以及构建多平台镜像的技术特点。在最后,作者还提到了如何使用buildx构建多平台镜像,为读者展示了构建多平台镜像的方法。整体而言,本文为读者提供了丰富的知识和实用的操作示例,对于需要进行容器化改造的业务应用具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 郑海成
    思考题:查了一些关于qemu的原理,尝试理解一下。docker buildx 通过qemu的user mod(binfmt_misc)注册一个转换程序动态转换不同cpu架构之间的命令😁

    作者回复: 👍🏻很易懂的原理解释。

    2023-01-18归属地:北京
    4
  • 争光 Alan
    多平台构建在dockerfile写架构信息感觉很麻烦 我们的做法是from 的基础镜像做成多架构,然后dockerfile正常写即可,构建的时候指定架构就行了

    作者回复: 也是一种不错的实践方式。

    2023-01-10归属地:广东
    3
  • Geek_df0d4d
    请问.dockerignore是不是只有Dockerfile中指定COPY . .的时候才有作用?

    作者回复: 是的,除了 COPY,ADD 指令也会忽略 .dockerignore 定义的内容。

    2023-04-08归属地:上海
    2
    1
  • Geek_df0d4d
    多阶段构建,那为什么不直接用专门的打包服务器构建呢,然后直接第二阶段构建就好了?

    作者回复: 也是一种方式,不过加入专用的打包服务器就变成有状态了,Dockerfile 的思想是可以在任何地方构建。

    2023-04-08归属地:上海
    1
  • jeffery
    buildx 需要安装 https://github.com/docker/buildx#linux-packages mkdir -pv ~/.docker/cli-plugins/ wget -O ~/.docker/cli-plugins/docker-buildx \ https://github.com/docker/buildx/releases/download/v0.9.1/buildx-v0.9.1.linux-amd64 chmod a+x ~/.docker/cli-plugins/docker-buildx 然后命令 $ docker buildx create --name builder 才能生效

    作者回复: 👍🏻 macOS 和 Windows Docker desktop 是包含 buildx 的,Linux 需要按照你的方法手动安装。

    2023-01-08归属地:广东
    1
  • Index
    Step 5/12 : RUN ./mvnw dependency:go-offline ---> Running in b16f1d8d26ec Error: JAVA_HOME is not defined correctly. We cannot execute /opt/java/openjdk/bin/java The command '/bin/sh -c ./mvnw dependency:go-offline' returned a non-zero code: 1 老师你好,这是什么原因,为啥JAVA_HOME会不正确,在eclipse-temurin:17-jdk-jammy镜像里不是已经设置好了吗?

    作者回复: 完整的 Dockerfile 发一下,此外你可以尝试更换一个 JDK 镜像测试,另外检查 mvnw 命令执行的位置是源码目录。

    2023-06-29归属地:日本
    4
  • 陈敏
    老师你好,请教下,本节课的 nginx 镜像构建是把静态资源放在镜像中,如果我们采用 pvc 挂载静态资源的方式,是不是可以避免每次改代码需要重打镜像,重启容器?这种方式会更好吗?

    作者回复: 一般不这么做。因为如果按这个方案的话,PVC 的代码来源可能是 ConfigMap 或者 Secret,而他们的大小是有限制的,另外更新它们也不方便。

    2023-03-12归属地:福建
  • helloworld
    go的两阶段构建有一个问题,每次go代码有更新重新build,都会导致重新下载所有依赖库,没法利用缓存,编译速度被拖的很慢

    作者回复: 👍🏻 是的,这里没有考虑到先安装依赖以及缓存的问题。

    2023-02-20归属地:北京
    2
  • Geek_988110
    => CACHED [builder 4/7] COPY mvnw pom.xml ./ 0.0s => ERROR [builder 5/7] RUN ./mvnw dependency:go-offline 老师你好,为什么会提示该error信息。容器里面是有这个文件的

    作者回复: 可能是网络原因导致的,用香港的虚拟机构建试试?

    2023-02-11归属地:重庆
  • GeekZd
    Step 1/12 : FROM eclipse-temurin:v17-jdk-jammy as builder Error parsing reference: "eclipse-temurin:v17-jdk-jammy as builder" is not a valid repository/tag: invalid reference format 这个报错咋回事?

    作者回复: 试一下直接用 docker pull 这个镜像看看是不是网络问题。

    2023-02-06归属地:北京
    2
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部