`
白马探
  • 浏览: 14635 次
社区版块
存档分类
最新评论

SpringCloud系列教程 | :微服务 Docker 化之基础环境

 
阅读更多

 

SpringCloud系列教程 | 第十八篇:微服务 Docker 化之基础环境
 

 1. 容器化

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

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)

 

 

1
0
分享到:
评论

相关推荐

    某D课堂 - 新版本微服务SpringCloud+Docker教程

    073 某D课堂 - 新版本微服务SpringCloud+Docker教程 video code.zip 35.5MB 9-05 微服务相关项目改造配置中心~1.mp4 353.6MB 9-04 高级篇幅消息总线整合配置中心架构流程图~1.mp4 246.0MB 9-03 实战系列使用...

    SpringCloud黑马商城后端代码

    《SpringCloud黑马商城后端代码详解》 在现代互联网应用开发中,微服务架构成为了一种主流设计模式,Spring Cloud作为Java领域的微服务治理框架,因其强大的功能和易用性,受到了广大开发者们的青睐。本篇文章将...

    springcloud视频教程附带pdf

    通过这套教程,你将能够掌握SpringCloud的核心组件和使用方式,理解微服务架构的设计理念,以及如何利用Docker进行容器化部署。此外,你还将学习如何使用Eureka进行服务发现,提高服务的稳定性和可靠性。无论是对...

    某D课堂 - 新版本微服务SpringCloud+Docker教程-高级篇幅之链路追踪组件Zipkin+Sleuth实战

    073 某D课堂 - 新版本微服务SpringCloud+Docker教程 video code.zip 35.5MB 9-05 微服务相关项目改造配置中心~1.mp4 353.6MB 9-04 高级篇幅消息总线整合配置中心架构流程图~1.mp4 246.0MB 9-03 实战系列使用...

    SpringCloud基础教程及代码案例

    SpringCloud是Java领域中用于构建微服务架构的重要框架,它为开发者提供了在分布式系统中的一系列功能,如服务发现、负载均衡、断路器、智能路由等。本教程旨在帮助初学者理解并掌握SpringCloud的基础知识,通过具体...

    springcloud 资源大全

    SpringCloud是Java领域一个流行的微服务框架,它提供了一系列的工具和组件,帮助开发者构建、配置、管理和部署分布式系统。这个资源大全包含了SpringCloud相关的学习资料,包括前端Vue.js和后台PigX的实践教程,旨在...

    学习Spring Cloud

    随着微服务架构和Docker容器的普及,Spring Cloud在未来软件开发中的地位将更加稳固,有望推动服务端软件技术的持续进步。 【应用场景】: - **中小型互联网公司**:它们可能没有足够的资源自建分布式系统基础设施...

    spring_cloud.rar

    B站上的"狂神SpringCloud最新教程IDEA版"是一个针对Spring Cloud的实战教学系列,通过IDEA集成开发环境进行演示,帮助开发者掌握这一热门技术。 在Spring Cloud的实践中,首先我们需要了解核心组件: 1. **Eureka*...

    2020微服务项目实战

    2. **Spring Cloud**:作为微服务生态的重要组成部分,Spring Cloud提供了一系列工具来实现服务发现、配置中心、负载均衡、熔断器等微服务治理功能。 3. **Eureka**:它是Spring Cloud中的服务注册与发现组件,允许...

    基于Spring Cloud实现微服务前后端系统-Spring-Cloud-Cli.zip

    在本教程中,我们将深入探讨如何使用Spring Cloud构建一个完整的微服务前后端系统。Spring Cloud是一个框架集合,它简化了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线等)中开发的一些...

    Spring Cloud 配置与教程.zip

    Spring Cloud 是一系列框架的集合,它利用 Spring Boot 的开发便利性简化了分布式系统基础设施的实现。以下是 Spring Cloud 的基本配置和使用教程。假设一个微服务电商平台,包含以下服务: 用户服务: 管理用户信息...

    基于spring cloud的云阅卷系统.zip

    总结,基于Spring Cloud的云阅卷系统实现了高效、稳定的阅卷流程,通过微服务架构和一系列核心技术,为教育行业的数字化转型提供了有力的支持。对于学习者来说,此项目源码和说明是深入了解和实践Spring Cloud应用的...

    microservicecloud:微服务第一季

    "microservicecloud:微服务第一季"可能是一个关于微服务系列教程或项目的名称,它可能涵盖了使用Java技术栈实现微服务的方方面面。 在Java领域,实现微服务的最常用框架包括Spring Boot和Spring Cloud。Spring Boot...

    MicroServices:微服务实践

    Spring Boot和Spring Cloud是Java领域微服务开发的常用框架,它们提供了一整套工具和服务,简化了开发过程。 9. **容器化与Docker**:微服务通常与容器化技术结合,如Docker,以实现服务的标准化打包和部署,...

    java微服务和源码.zip

    Java微服务技术是现代软件开发领域中的重要组成部分,它基于模块化、轻量级和分布式的设计原则,使得大型复杂应用可以被拆分为一系列独立的服务,每个服务都可以单独部署、扩展和维护。本压缩包文件“java微服务和...

    springcloud相关教学视频

    此外,视频教程还会涵盖Docker和Kubernetes的使用,这两者是现代化云原生应用部署的基础设施。学习如何将SpringCloud应用容器化,并利用Kubernetes进行服务的编排和管理。 总之,这个"springcloud相关教学视频"涵盖...

    SpringCloud基于SpringBoot 分布式服务实现.zip

    在SpringBoot的基础上,SpringCloud进一步提供了服务发现、负载均衡、熔断器、配置中心、API网关等一系列微服务基础设施。 1. **服务发现**:SpringCloud借助Eureka实现了服务注册与发现。每个服务启动后,会向...

    SpringBlade开发手册基础版

    SpringBlade是一个商业级项目升级优化而来的SpringCloud微服务架构,采用Java8 API重构了业务代码,完全遵循阿里巴巴编码规范。该手册主要讲解如何使用SpringBlade开发微服务系统平台,涵盖了从环境准备到生产部署的...

    我们的大数据配套代码.zip

    4. **Book Code**:这可能表示这些代码来源于一本书或教程,可能是一系列逐步指导,帮助读者理解如何使用 Spring Cloud 和 Docker 实现微服务架构。 结合这些信息,我们可以期待这个压缩包包含一系列的 Java 代码...

    展示spring cloud的基本用法

    spring cloud系列。展示了spring cloud的基本用法。包括:1)一个基本的spring boot应用。2)分布式配置管理服务端。3)分布式配置管理客户端(微服务应用)。4)服务注册服务端。5)服务注册发现客户端(微服务应用...

Global site tag (gtag.js) - Google Analytics