私とSpringCloud|マイクロサービスDocker化の基礎環境を学びます


1.容器化
Dockerの登場は,コンテナ技術に質的な飛躍をもたらし,Dockerはサービスのインフラストラクチャを標準化し,アプリケーションのパッケージング配布,導入およびオペレーティングシステム関連クラスライブラリを統一し,テスト生産導入時の環境差の問題を解決した.運用次元では、ミラーの非可変性により、サービスの導入とロールバックが容易になります.各種サードパーティコンテナ管理プラットフォームを利用して、ワンタッチ配置、ダイナミック伸縮などの操作が容易になります.
2.ベースミラーの選択
オペレーティングシステムの選択では、従来のCentOS、Ubuntu、またはより軽量化されたAlpineを選択することができる.例えばCentOSやUbuntuのミラーはいずれも100 MB以上であり、圧縮後も数十MB大きいが、軽量化されたAlpine 3.10バージョンのミラーサイズは約5.58 MBであり、圧縮後はさらに2 MB程度しかない.
Alpineオペレーティングシステムは、安全な軽量Linux向けのリリース版です.通常のLinuxリリースとは異なり、Alpineはmusl libcとbusyboxを採用し、システムの体積と稼働時のリソース消費を削減していますが、busyboxよりも機能的に完備しているため、オープンソースコミュニティがますます人気を集めています.ダイエットを維持しながら、Alpineは自分のバッグ管理ツールapkを提供しています.
ベースミラーの選択は、ミラーのサイズを考慮することと、最小の依存パッケージのみを提供することです.第2点については、異なるサービスに必要な依存パッケージが異なりますが、ここでは議論を進めません.第1点だけを考えると、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/a...)、バージョンは2.30-r 0です.具体的なコードは以下の通りです.
コードリスト:chapter 17/dockerfiles/alpine-glibc/Dockerfile
FROM alpine:3.10
MAINTAINER [email protected]
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があります.ここでは、JDK 8を構築する際にOracleのserver-jre-8 u 221バージョンを採用します.JDK 9,JDK 10およびJDK 11についてはOpenJDKを用いて構築した.
    OracleのJDK 8のミラーによって構築されたDockerfileは次のとおりです.
    コードリスト:chapter 17/dockerfiles/java 8/dockerfile
    FROM registry.cn-shanghai.aliyuncs.com/springcloud-book/alpine3.10:glibc-2.30-r0
    MAINTAINER [email protected]
    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
    OpenJDK 9のミラーで構築されたDockerfileは以下の通りです.
    コードリスト:chapter 17/dockerfiles/java 9/Dockerfile
    FROM registry.cn-shanghai.aliyuncs.com/weishiyao/alpine-3.10:glibc-2.30-r0
    MAINTAINER [email protected]
    
    RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/main
    \ 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
    OpenJDK 10のミラーで構築されたDockerfileは以下の通りです.
    コードリスト:chapter 17/dockerfiles/java 10/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
    \ 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
    OpenJDK 11のミラーで構築されたDockerfileは以下の通りです.
    コードリスト:chapter 17/dockerfiles/java 11/dockerfile
    FROM registry.cn-shanghai.aliyuncs.com/weishiyao/alpine-3.10:glibc-2.30-r0
    MAINTAINER [email protected]
    RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/main
    \ 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)

    4.インスタンスコード
    サンプルコード-Github
    サンプルコード-Gitee