`
valiant025
  • 浏览: 17132 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

SpringCloud第十八篇:微服务 Docker 化之基础环境

 
阅读更多

 

1. 容器化

Docker 的横空出世,给了容器技术带来了质的飞跃,Docker 标准化了服务的基础设施,统一了应用的打包分发,部署以及操作系统相关类库等,解决了测试生产部署时环境差异的问题。对于运维来讲,由于镜像的不可变性,更容易进行服务部署和回滚操作。利用各种第三方容器管理平台,实现一键部署、动态伸缩等操作变的轻而易举。(了解源码可+求求: 1791743380)

2. 基础镜像选择

在操作系统的选择上,可选择传统的 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)
     
分享到:
评论

相关推荐

    SpringCloudLearning_forezp.tar.gz

    史上最简单的SpringCloud教程 | 第十八篇: spring cloud gateway之服务注册与发现 四、源码篇: 深入理解Feign之源码解析 深入理解Eureka之源码解析 深入理解Ribbon之源码解析 深入理解Hystrix之文档翻译 深入理解...

    微服务 (第二部分)springcould_18

    在本篇中,我们将深入探讨微服务架构的第二部分,主要关注Spring Cloud的相关技术,以及它们如何助力实现云原生应用。Spring Cloud是基于Spring Boot的一套轻量级框架,旨在简化微服务开发和管理的复杂性,为构建...

    JAVA WEB开发源码

    18. **第十八章:WebSocket** - 实时通信协议,允许双向通信,用于构建实时Web应用。 19. **第十九章:Servlet 3.0新特性** - 介绍Servlet 3.0版本引入的新功能,如注解配置、异步处理等。 20. **第二十章:JMS...

    springboot讲义

    - Spring Cloud:提供微服务架构的支持,包括服务发现、配置中心、负载均衡等。 - MyBatis:与MyBatis框架集成,实现SQL查询操作。 - Swagger:集成Swagger UI,提供API文档和测试功能。 九、Spring Boot监控和健康...

    中文 Spring Boot 参考指南

    2. **微服务架构**:Spring Boot 很适合构建微服务,结合 Spring Cloud 可以实现服务发现、负载均衡等功能。 以上是对 Spring Boot 的基本介绍和关键知识点,实际开发中,应根据具体需求选择和配置相应的功能,充分...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    第1 章 Spring 基础 2 1.1 Spring 概述 2 1.1.1 Spring 的简史 2 1.1.2 Spring 概述 3 1.2 Spring 项目快速搭建 5 1.2.1 Maven 简介 6 1.2.2 Maven 安装 6 1.2.3 Maven 的pom.xml 7 1.2.4 Spring 项目的搭建 9 1.3 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    第1 章 Spring 基础 2 1.1 Spring 概述 2 1.1.1 Spring 的简史 2 1.1.2 Spring 概述 3 1.2 Spring 项目快速搭建 5 1.2.1 Maven 简介 6 1.2.2 Maven 安装 6 1.2.3 Maven 的pom.xml 7 1.2.4 Spring 项目的搭建 9 1.3 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    第1 章 Spring 基础 2 1.1 Spring 概述 2 1.1.1 Spring 的简史 2 1.1.2 Spring 概述 3 1.2 Spring 项目快速搭建 5 1.2.1 Maven 简介 6 1.2.2 Maven 安装 6 1.2.3 Maven 的pom.xml 7 1.2.4 Spring 项目的搭建 9 1.3 ...

    JHipster-v4-minibook

    2. **微服务架构**:JHipster集成了多种微服务架构相关的工具,比如Spring Cloud和Docker。 3. **热重载**:前端开发中使用Browsersync进行实时预览。 4. **国际化支持**:提供国际化(i18n)配置支持,方便开发多语言...

    分布式事务实践 解决数据一致性

    5-3 SpringCloud微服务架构 5-4 实现registry 5-5 实现proxy 5-6 user服务 5-7 order服务 5-8 添加hystrix 5-9 使用feign 5-10 优化服务间调用 第6章 分布式事务实现,模式和技术 介绍分布式事务的定义、原则和实现...

    Java相关技术 一些实用的技术

    2. Docker:容器化技术,简化应用部署和环境一致性问题。 以上仅是Java相关技术的冰山一角,实际应用中还会涉及到设计模式、性能优化、并发编程、单元测试、安全控制等多个领域。随着技术的发展,Java生态不断丰富...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.41.docx

    此外,Spring Boot 对外提供了丰富的 Starter POMs,使得集成第三方库变得简单快捷,如数据访问(JPA、MyBatis)、安全(Spring Security)、监控(Spring Boot Actuator)等。 问题 7:什么是线程池?在 Java 中...

    java教程电子版(TXT)

    6. **微服务架构**:概述微服务的设计原则和实践方法,探讨如何利用Spring Cloud等工具构建高可用系统。 7. **持续集成与部署**:指导如何使用Jenkins、Docker等工具实现自动化构建、测试和部署流程。 #### 三、...

    java的三十个目标

    2. **Java 语言基础**:掌握 Java 语法,核心类库如集合、序列化、流、网络、多线程、反射、事件处理、NIO、本地化等。 3. **JVM 知识**:了解 JVM(Java 虚拟机)的工作原理,包括类加载器、类反射和垃圾回收机制...

    IT 单词1

    34. **Docker**:Docker提供了一种容器化技术,用于封装应用及其依赖环境,便于移植和部署。 35. **Client**:客户端是与服务器交互的应用程序,如浏览器或桌面应用。 36. **Eureka**:在Netflix开源的微服务架构...

    java面试八股文.pdf

    56. **Spring Cloud和Netflix OSS在微服务架构中的作用** - 提供了一系列微服务相关的工具和框架。 - 包括服务发现、配置中心、熔断器等功能。 57. **响应式编程** - 一种编程范式,通过非阻塞的方式处理数据流...

    Java-Spring-Boot-Interview-Questions-and-Answers:最受欢迎的Java面试问答

    19. 探讨Spring Boot在微服务架构中的角色,如何配合Spring Cloud。 20. 分享Spring Boot应用部署到Docker容器的最佳实践。 五、面试技巧 21. 如何根据项目经历回答技术问题,展示实际操作能力。 22. 面试中如何...

Global site tag (gtag.js) - Google Analytics