私と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
ここで注意すべき点はいくつかあります. Dockerは階層設計であるため、Dockerfileでは各命令に独自のcontextがあり、次の命令を実行すると、次の階層の構築層が上の階層に重ねられるため、クラスライブラリをインストールする際に同じRUN命令に命令を書き、階層を減らし、最後のミラーのサイズ を低減することが望ましい. RUNコマンドにはクラスライブラリまたはパッケージがインストールされており、同じコマンドでapkのcacheを削除する必要があります.これにより、apkを有効に削除し、ミラーサイズを小さくすることができます. ベースミラーのラベルはlatestを使用しないでください.ミラーにラベルが指定されていない場合、latestラベルがデフォルトで使用されます.ミラーが更新されるとlatestラベルが異なるミラーを指し、ミラーの構築に失敗する可能性があります.最新版のベースミラーを使用する必要がある場合は、latestラベルを使用します.そうでない場合は、特定のミラーラベルを指定したほうがいいです. ここで筆者はアリクラウドのミラーウェアハウスにアップロードするバージョンを作成しました.必要な読者は直接pullというミラーを使用することができます.
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
同様に、このミラー作成者はすでにアリクラウドミラー倉庫をアップロードしており、以下のコマンドを直接使用して引き出すことができます.
次のコマンドで検証できます.
実行結果は次のとおりです.
3.3 Alpine + glibc + OpenJDK9
OpenJDK 9のミラーで構築されたDockerfileは以下の通りです.
コードリスト:chapter 17/dockerfiles/java 9/Dockerfile
OpenJDKのjreここで筆者は清華大学鏡像ステーションの鏡像を用いてインストールした.
同様に、このミラー作成者はすでにアリクラウドミラー倉庫をアップロードしており、以下のコマンドを直接使用して引き出すことができます.
検証コマンドは次のとおりです.
実行結果は次のとおりです.
3.4 Alpine + glibc + OpenJDK10
OpenJDK 10のミラーで構築されたDockerfileは以下の通りです.
コードリスト:chapter 17/dockerfiles/java 10/Dockerfile
同様に、このミラー作成者はすでにアリクラウドミラー倉庫をアップロードしており、以下のコマンドを直接使用して引き出すことができます.
検証コマンドは次のとおりです.
実行結果は次のとおりです.
3.5 Alpine + glibc + OpenJDK11
OpenJDK 11のミラーで構築されたDockerfileは以下の通りです.
コードリスト:chapter 17/dockerfiles/java 11/dockerfile
同様に、このミラー作成者はすでにアリクラウドミラー倉庫をアップロードしており、以下のコマンドを直接使用して引き出すことができます.
検証コマンドは次のとおりです.
実行結果は次のとおりです.
4.インスタンスコード
サンプルコード-Github
サンプルコード-Gitee
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 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