1. 容器化
Docker 的横空出世,给了容器技术带来了质的飞跃,Docker 标准化了服务的基础设施,统一了应用的打包分发,部署以及操作系统相关类库等,解决了测试生产部署时环境差异的问题。对于运维来讲,由于镜像的不可变性,更容易进行服务部署和回滚操作。利用各种第三方容器管理平台,实现一键部署、动态伸缩等操作变的轻而易举。
2. 基础镜像选择(了解源码可+WX: haiwabbc)
在操作系统的选择上,可选择传统的 CentOS 、 Ubuntu 或者更为轻量化的 Alpine 。比如 CentOS 或者 Ubuntu 的镜像都在 100MB 以上,压缩后也都有大几十 MB ,而轻量化的 Alpine 3.10 版本镜像大小约为 5.58MB ,而它压缩后更是仅有 2MB 大小左右。
Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk 。
关于基础镜像的选择,一个是考虑镜像的大小,另一个是只提供最小的依赖包。关于第二点,不同的服务所需要的依赖包是不同的,这里不再展开讨论,如果仅从第一点考虑的话, Alpine 肯定是首选,镜像越小,远程推拉越快,消耗的资源也越小,更为的方便,我们这里采用 Alpine 作为基础镜像。
3. Dockerfile 编写
选择 Alpine 有一个比较麻烦的地方是 Alpine 采用的是 musl libc 的 C 的标准库,而 Oracle 或者 OpenJDK 提供的版本主要是已 glibc 为主。所以我们考虑为 Alpine 加上 glibc ,然后添加 glibc 的 JDK 编译版本作为基础镜像。
3.1 Alpine + glibc
这里选择的版本是目前最新版 Alpine 3.10 版本,glibc 采用的是 Sgerrand 开源的 glibc 安装包(https://github.com/sgerrand/alpine-pkg-glibc/ ),版本为 2.30-r0 。具体代码如下:
代码清单:chapter17/dockerfiles/alpine-glibc/Dockerfile
- FROM alpine:3.10
- MAINTAINER inwsy@hotmail.com
- RUN apk add --no-cache ca-certificates curl openssl binutils xz tzdata \
- && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
- && echo "Asia/Shanghai" > /etc/timezone \
- && GLIBC_VER="2.30-r0" \
- && ALPINE_GLIBC_REPO="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" \
- && curl -Ls ${ALPINE_GLIBC_REPO}/${GLIBC_VER}/glibc-${GLIBC_VER}.apk > /opt/${GLIBC_VER}.apk \
- && apk add --allow-untrusted /opt/${GLIBC_VER}.apk \
- && curl -Ls https://www.archlinux.org/packages/core/x86_64/gcc-libs/download > /opt/gcc-libs.tar.xz \
- && mkdir /opt/gcc \
- && tar -xf /opt/gcc-libs.tar.xz -C /opt/gcc \
- && mv /opt/gcc/usr/lib/libgcc* /opt/gcc/usr/lib/libstdc++* /usr/glibc-compat/lib \
- && strip /usr/glibc-compat/lib/libgcc_s.so.* /usr/glibc-compat/lib/libstdc++.so* \
- && curl -Ls https://www.archlinux.org/packages/core/x86_64/zlib/download > /opt/libz.tar.xz \
- && mkdir /opt/libz \
- && tar -xf /opt/libz.tar.xz -C /opt/libz \
- && mv /opt/libz/usr/lib/libz.so* /usr/glibc-compat/lib \
- && apk del binutils \
- && rm -rf /opt/${GLIBC_VER}.apk /opt/gcc /opt/gcc-libs.tar.xz /opt/libz /opt/libz.tar.xz /var/cache/apk/*
这里有几点需要注意的:
- 由于 Docker 是分层设计,而在 Dockerfile 中,每一条指令都拥有自己的 context ,而执行到下一条指令时,则会将下一层的构建层叠加到上一层,因此在安装类库的时候最好将命令写在同一个 RUN 指令中,减少分层,降低最后镜像的大小
- RUN 命令中安装了类库或者软件包,需要在同一个命令中删除 apk 的 cache ,这样才能有效删除 apk ,减小镜像大小。
- 基础镜像的标签不要使用 latest ,当镜像没有指定标签时,将默认使用 latest 标签。当镜像更新时, latest 标签会指向不同的镜像,这时构建镜像有可能失败。如果你的确需要使用最新版的基础镜像,可以使用 latest 标签,否则的话,最好指定确定的镜像标签。
- 这里笔者已经创建好了一个版本,上传到阿里云的镜像仓库上,有需要的读者可以直接 pull 这个镜像使用。
-
- docker pull registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:glibc-2.30-r0
3.2 Alpine + glibc + JDK8
对于 JDK 的版本选择,有 Oracle 的 Hotspot JDK ,也有 OpenJDK 。这里我们在构建 JDK8 的时候采用 Oracle 的 server-jre-8u221 版本。而对于 JDK9 、 JDK10 以及 JDK11 我们采用 OpenJDK 来进行构建。
Oracle 的 JDK8 的镜像构建的 Dockerfile 如下:
代码清单:chapter17/dockerfiles/java8/Dockerfile
-
- FROM registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:glibc-2.30-r0
- MAINTAINER inwsy@hotmail.com
- ADD server-jre-8u221-linux-x64.tar.gz /opt/
- RUN chmod +x /opt/jdk1.8.0_221
- ENV JAVA_HOME=/opt/jdk1.8.0_221
- ENV PATH="$JAVA_HOME/bin:${PATH}"
- 同样,此镜像作者已经上传阿里云镜像仓库,可以直接使用以下命令拉取:
- docker pull registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:8u221-jre
-
- docker run --rm -it registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:8u221-jre java -version
-
- java version "1.8.0_221"
- Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
- Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
3.3 Alpine + glibc + OpenJDK9
OpenJDK9 的镜像构建的 Dockerfile 如下:
代码清单:chapter17/dockerfiles/java9/Dockerfile
-
- FROM registry.cn-shanghai.aliyuncs.com/weishiyao/alpine-3.10:glibc-2.30-r0
- MAINTAINER inwsy@hotmail.com
- RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/main\n\
- https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/community" > /etc/apk/repositories
- RUN apk --update add curl bash openjdk9-jre && \
- rm -rf /var/cache/apk/*
- ENV JAVA_HOME /usr/lib/jvm/default-jvm
- ENV PATH ${PATH}:${JAVA_HOME}/bin
OpenJDK 的 jre 这里笔者使用清华大学镜像站的镜像进行安装。
同样,此镜像作者已经上传阿里云镜像仓库,可以直接使用以下命令拉取:、
-
- docker pull registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:openjdk9-jre-9.0.4
-
- docker run --rm -it registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:openjdk9-jre-9.0.4 java -version
-
- openjdk version "9.0.4"
- OpenJDK Runtime Environment (build 9.0.4+12-alpine-r1)
- OpenJDK 64-Bit Server VM (build 9.0.4+12-alpine-r1, mixed mode)
3.4 Alpine + glibc + OpenJDK10
OpenJDK10 的镜像构建的 Dockerfile 如下:
代码清单:chapter17/dockerfiles/java10/Dockerfile
-
- FROM registry.cn-shanghai.aliyuncs.com/weishiyao/alpine-3.10:glibc-2.30-r0
- RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/main\n\
- https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/community" > /etc/apk/repositories
- RUN apk --update add curl bash openjdk10-jre && \
- rm -rf /var/cache/apk/*
- ENV JAVA_HOME /usr/lib/jvm/default-jvm
- ENV PATH ${PATH}:${JAVA_HOME}/bin
- 同样,此镜像作者已经上传阿里云镜像仓库,可以直接使用以下命令拉取:
- docker pull registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:openjdk10-jre-10.0.2
-
- docker run --rm -it registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:openjdk10-jre-10.0.2 java -version
-
- openjdk version "10.0.2" 2018-07-17
- OpenJDK Runtime Environment (build 10.0.2+13-alpine-r0)
- OpenJDK 64-Bit Server VM (build 10.0.2+13-alpine-r0, mixed mode)
3.5 Alpine + glibc + OpenJDK11
OpenJDK11 的镜像构建的 Dockerfile 如下:
代码清单:chapter17/dockerfiles/java11/Dockerfile
-
- FROM registry.cn-shanghai.aliyuncs.com/weishiyao/alpine-3.10:glibc-2.30-r0
- MAINTAINER inwsy@hotmail.com
- RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/main\n\
- https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/community" > /etc/apk/repositories
- RUN apk --update add curl bash openjdk11-jre && \
- rm -rf /var/cache/apk/*
- ENV JAVA_HOME /usr/lib/jvm/default-jvm
- ENV PATH ${PATH}:${JAVA_HOME}/bin
-
- docker pull registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:openjdk11-jre-11.0.2
-
- docker run --rm -it registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:openjdk11-jre-11.0.2 java -version
-
- openjdk version "11.0.4" 2019-07-16
- OpenJDK Runtime Environment (build 11.0.4+4-alpine-r1)
- OpenJDK 64-Bit Server VM (build 11.0.4+4-alpine-r1, mixed mode)
相关推荐
嵌入式八股文面试题库资料知识宝典-华为的面试试题.zip
训练导控系统设计.pdf
嵌入式八股文面试题库资料知识宝典-网络编程.zip
人脸转正GAN模型的高效压缩.pdf
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
少儿编程scratch项目源代码文件案例素材-鸡蛋.zip
嵌入式系统_USB设备枚举与HID通信_CH559单片机USB主机键盘鼠标复合设备控制_基于CH559单片机的USB主机模式设备枚举与键盘鼠标数据收发系统支持复合设备识别与HID
嵌入式八股文面试题库资料知识宝典-linux常见面试题.zip
面向智慧工地的压力机在线数据的预警应用开发.pdf
基于Unity3D的鱼类运动行为可视化研究.pdf
少儿编程scratch项目源代码文件案例素材-霍格沃茨魔法学校.zip
少儿编程scratch项目源代码文件案例素材-金币冲刺.zip
内容概要:本文深入探讨了HarmonyOS编译构建子系统的作用及其技术细节。作为鸿蒙操作系统背后的关键技术之一,编译构建子系统通过GN和Ninja工具实现了高效的源代码到机器代码的转换,确保了系统的稳定性和性能优化。该系统不仅支持多系统版本构建、芯片厂商定制,还具备强大的调试与维护能力。其高效编译速度、灵活性和可扩展性使其在华为设备和其他智能终端中发挥了重要作用。文章还比较了HarmonyOS编译构建子系统与安卓和iOS编译系统的异同,并展望了其未来的发展趋势和技术演进方向。; 适合人群:对操作系统底层技术感兴趣的开发者、工程师和技术爱好者。; 使用场景及目标:①了解HarmonyOS编译构建子系统的基本概念和工作原理;②掌握其在不同设备上的应用和优化策略;③对比HarmonyOS与安卓、iOS编译系统的差异;④探索其未来发展方向和技术演进路径。; 其他说明:本文详细介绍了HarmonyOS编译构建子系统的架构设计、核心功能和实际应用案例,强调了其在万物互联时代的重要性和潜力。阅读时建议重点关注编译构建子系统的独特优势及其对鸿蒙生态系统的深远影响。
嵌入式八股文面试题库资料知识宝典-奇虎360 2015校园招聘C++研发工程师笔试题.zip
嵌入式八股文面试题库资料知识宝典-腾讯2014校园招聘C语言笔试题(附答案).zip
双种群变异策略改进RWCE算法优化换热网络.pdf
内容概要:本文详细介绍了基于瞬时无功功率理论的三电平有源电力滤波器(APF)仿真研究。主要内容涵盖并联型APF的工作原理、三相三电平NPC结构、谐波检测方法(ipiq)、双闭环控制策略(电压外环+电流内环PI控制)以及SVPWM矢量调制技术。仿真结果显示,在APF投入前后,电网电流THD从21.9%降至3.77%,显著提高了电能质量。 适用人群:从事电力系统研究、电力电子技术开发的专业人士,尤其是对有源电力滤波器及其仿真感兴趣的工程师和技术人员。 使用场景及目标:适用于需要解决电力系统中谐波污染和无功补偿问题的研究项目。目标是通过仿真验证APF的有效性和可行性,优化电力系统的电能质量。 其他说明:文中提到的仿真模型涉及多个关键模块,如三相交流电压模块、非线性负载、信号采集模块、LC滤波器模块等,这些模块的设计和协同工作对于实现良好的谐波抑制和无功补偿至关重要。
内容概要:本文探讨了在工业自动化和物联网交汇背景下,构建OPC DA转MQTT网关软件的需求及其具体实现方法。文中详细介绍了如何利用Python编程语言及相关库(如OpenOPC用于读取OPC DA数据,paho-mqtt用于MQTT消息传递),完成从OPC DA数据解析、格式转换到最终通过MQTT协议发布数据的关键步骤。此外,还讨论了针对不良网络环境下数据传输优化措施以及后续测试验证过程。 适合人群:从事工业自动化系统集成、物联网项目开发的技术人员,特别是那些希望提升跨协议数据交换能力的专业人士。 使用场景及目标:适用于需要在不同通信协议间建立高效稳定的数据通道的应用场合,比如制造业生产线监控、远程设备管理等。主要目的是克服传统有线网络限制,实现在不稳定无线网络条件下仍能保持良好性能的数据传输。 其他说明:文中提供了具体的代码片段帮助理解整个流程,并强调了实际部署过程中可能遇到的问题及解决方案。
基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档
少儿编程scratch项目源代码文件案例素材-火柴人终极之战.zip