alpineをベースにdockerfileで作成したtomcatイメージの実装

alpineをベースにdockerfileで作成したtomcatイメージの実装

1.アルパインイメージをダウンロードする

[root@docker43 ~]# docker pull alpine
デフォルトタグの使用: 最新
リポジトリ docker.io/library/alpine をプルしようとしています...
最新: docker.io/library/alpine からプル
4fe2ade4980c: プル完了
ダイジェスト: sha256:621c2f39f8133acb8e64023a94dbdf0d5ca81896102b9e57c0dc184cadaf5528
ステータス: docker.io/alpine:latest の新しいイメージをダウンロードしました
[root@docker43 ~]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
docker.io/alpine-latest 196d12cf6ab1 3 週間前 4.41 MB

2. Dockerfileでイメージを構築する

他の資料では、パッケージをダウンロードしてからCOPYを使用してdockerfileにコピーすることが多いです。ここではそうしません。別途記述します(どちらもdockerfileを介してイメージを構築します)

2.1. JDKイメージのビルド

jdkディレクトリを作成する

[root@docker43 ~]# cd /opt/
[root@docker43 opt]# mkdir -p alpine_jre && cd alpine_jre && touch Dockerfile
[root@docker43 alpine_jre]# ll
合計使用量 0
-rw-r--r-- 1 ルート ルート 0 10月6日 17:39 Dockerfile

Dockerfileの作成

# ベースイメージ FROM alpine
 
# 著者情報 MAINTAINER JRE Docker メンテナー "[email protected]"
 
# ソースを変更する RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories && \
  echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
 
# 必要なソフトウェアをインストールします RUN apk update && \
  apk 追加 --no-cache ca-certificates && \
  apk add --no-cache curl bash tree tzdata && \
  cp -rf /usr/share/zoneinfo/アジア/上海 /etc/localtime
 
# 環境変数 ENV PATH /usr/local/bin:${PATH} を定義します。
 
# JREをインストールする
apk add --nocache openjdk8-jre-base && \ を実行します。
  rm -rf /var/cache/apk/*
 
走る { \
    エコー '#!/bin/sh'; \
    エコー 'set -e'; \
    エコー; \
    echo 'dirname "$(dirname "$(readlink -f "$(which javac || which java)")")"'; \
   } > /usr/local/bin/docker-java-home \
  chmod +x /usr/local/bin/docker-java-home を実行します。
 
環境変数 JAVA_HOME /usr/lib/jvm/default-jvm
環境変数 PATH ${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin
環境変数JAVA_VERSION 8u71
環境変数JAVA_ALPINE_VERSION 8.171.11-r0
実行set -x \
  \
  && apk に --no-cache を追加します \
  \
  openjdk8-jre="$JAVA_ALPINE_VERSION" 

画像を作成する

[root@docker43 alpine_jre]# docker build -t alpine_jre .

ミラーを見る

[root@docker43 alpine_jre]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
alpine_jre 最新 614bc57ab66e 33 秒前 91.1 MB
docker.io/alpine-latest 196d12cf6ab1 3 週間前 4.41 MB

2.2.Tomcatイメージのビルド

tomcatディレクトリを作成する

[root@docker43 ~]# cd /opt/
[root@docker43 opt]# mkdir -p jre_tomcat && cd jre_tomcat && touch Dockerfile
[root@docker43 jre_tomcat]# ll
合計使用量 0
-rw-r--r-- 1 ルート ルート 0 10月6日 17:46 Dockerfile

Dockerfile を書く (上記の alpine_jre イメージに基づく)

#ベースイメージ FROM alpine_jre
 
# 著者情報 MAINTAINER tomcat Docker メンテナー "[email protected]"
 
# tomcat 変数を定義します (他の変数がある場合は、ここで追加できます)
ENV CATALINA_HOME /usr/local/tomcat
環境変数 PATH $CATALINA_HOME/bin:$PATH
mkdir -p "$CATALINA_HOME" を実行します。
ワークディレクトリ $CATALINA_HOME
 
# 「Tomcat Native」を隔離された場所に住まわせる
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
環境変数 LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR
 
apk add --no-cache gnupg を実行します
 
# http://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/KEYS を参照
# 「update.sh」も参照してください (https://github.com/docker-library/tomcat/blob/master/update.sh)
ENV GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 713DA88BE50911535FE716F5208B0AB1D63011C7 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23
実行set -ex; \
    $GPG_KEYSのキーに対して、\を実行します。
        gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
    終わり
 
# tomcatのバージョンを定義する ENV TOMCAT_MAJOR 8
環境変数 TOMCAT_VERSION 8.0.53
 
# ダウンロード # https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
ENV TOMCAT_TGZ_URL https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz
# 実際にはすべてのミラーが .asc ファイルを保持しているわけではありません :'(
ENV TOMCAT_ASC_URL http://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc
 
# インストール RUN set -x \
    \
    && apk に --no-cache --virtual .fetch-deps を追加します \
        ca証明書\
        タール\
        オープンSSL \
    && wget -O tomcat.tar.gz "$TOMCAT_TGZ_URL" \
    && wget -O tomcat.tar.gz.asc "$TOMCAT_ASC_URL" \
    && gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz \
    && tar -xvf tomcat.tar.gz --strip-components=1 \
    && rm bin/*.bat \
    && rm tomcat.tar.gz* \
    \
    && nativeBuildDir="$(mktemp -d)" \
    && tar -xvf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1 \
    && apk に --no-cache --virtual .native-build-deps を追加します \
        4月-開発 \
        dpkg-dev dpkg \
        gcc \
        libc-dev \
        作る \
        "openjdk${JAVA_VERSION%%[-~bu]*}"="$JAVA_ALPINE_VERSION" \
        openssl-dev \
    && ( \
        エクスポート CATALINA_HOME="$PWD" \
        && cd "$nativeBuildDir/native" \
        && gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \
        && ./configure \
            --build="$gnuArch" \
            --libdir="$TOMCAT_NATIVE_LIBDIR" \
            --prefix="$CATALINA_HOME" \
            --with-apr="$(どのapr-1-config)" \
            --with-java-home="$(docker-java-home)" \
            --with-ssl=はい\
        && make -j$(getconf _NPROCESSORS_ONLN) \
        && インストール \
    ) \
    && runDeps="$( \
        scanelf --needed --nobanner --recursive "$TOMCAT_NATIVE_LIBDIR" \
            | awk '{ gsub(/,/, "\nso:", $2); "so:" を出力 $2 }' \
            | ソート -u \
            | xargs -r apk 情報 --installed \
            | ソート -u \
    )"\
    && apk に --virtual .tomcat-native-rundeps $runDeps を追加します \
    && apk del .fetch-deps .native-build-deps \
    && rm -rf "$nativeBuildDir" \
    && rm bin/tomcat-native.tar.gz
 
# Tomcat Nativeが正常に動作していることを確認する
set -e \ を実行します
    && nativeLines="$(catalina.sh configtest 2>&1)" \
    && nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" \
    && nativeLines="$(echo "$nativeLines" | sort -u)" \
    && if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then \
        echo >&2 "$nativeLines"; \
        終了 1; \
    フィ
 
# 開発ポート 8080 EXPOSE 8080
# コマンド CMD ["catalina.sh", "run"] を実行します

画像を作成する

[root@docker43 jre_tomcat]# docker build -t tomcat:1.0 。

ミラーを見る

[root@docker43 jre_tomcat]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
tomcat 1.0 64c9cec4375d 7秒前 124 MB
alpine_jre 最新 614bc57ab66e 8 分前 91.1 MB
docker.io/alpine-latest 196d12cf6ab1 3 週間前 4.41 MB

2.3. tomcat_webイメージのビルド

tomcat_web ディレクトリを作成する (Dockerfile と起動ファイルを含む)

[root@docker43 ~]# cd /opt/
[root@docker43 opt]# mkdir tomcat_web && cd tomcat_web && touch Dockerfile && touch start.sh
[root@docker43 tomcat_web]# ll
合計使用量 0
-rw-r--r-- 1 ルート ルート 0 10月6日 17:53 Dockerfile
-rw-r--r-- 1 ルート ルート 0 10月6日 17:53 start.sh

start.sh起動スクリプトを書く

#!/bin/sh
# Apache Software Foundation (ASF) に1つ以上のライセンスの下でライセンス供与されています
# 貢献者ライセンス契約。同梱のNOTICEファイルを参照してください。
# 著作権の所有権に関する追加情報については、この作品を参照してください。
# ASF は、Apache License バージョン 2.0 に基づいてこのファイルをお客様にライセンスします。
# (「ライセンス」); あなたはこのファイルを以下の条件に従わない限り使用することはできません
# ライセンス。ライセンスのコピーは以下から入手できます。
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 適用法で義務付けられている場合、または書面で同意されている場合を除き、ソフトウェア
# ライセンスに基づいて配布されるものは「現状有姿」で配布されます。
# 明示的または黙示的を問わず、いかなる種類の保証または条件もありません。
# 権限と使用許諾を規定する具体的な言語についてはライセンスを参照してください。
# ライセンスに基づく制限。
 
# -----------------------------------------------------------------------------
# CATALINA サーバーの制御スクリプト
#
# 環境変数の前提条件
#
# このスクリプトでは変数を設定しないでください。代わりにスクリプトに変数を入れてください
# カスタマイズを分離しておくために、CATALINA_BASE/bin に setenv.sh を置きます。
#
# CATALINA_HOME は Catalina の「ビルド」ディレクトリを指す場合があります。
#
# CATALINA_BASE (オプション) 動的部分を解決するためのベースディレクトリ
# Catalinaインストールの。存在しない場合は、次のように解決されます
# CATALINA_HOME が指すディレクトリと同じディレクトリ。
#
# CATALINA_OUT (オプション) stdoutとstderrが保存されるファイルへのフルパス
# はリダイレクトされます。
# デフォルトは $CATALINA_BASE/logs/catalina.out です
#
# CATALINA_OPTS (オプション) 「start」、
# 「run」または「debug」コマンドが実行されます。
# ここでJAVA_OPTSにすべてのオプションを含めないでください。
# Tomcat自体でのみ使用され、停止プロセスでは使用されません。
# バージョンコマンドなど
# 例としては、ヒープ サイズ、GC ログ、JMX ポートなどがあります。
#
# CATALINA_TMPDIR (オプション) 一時ディレクトリのディレクトリパスの場所
# JVMは(java.io.tmpdir)を使用する必要があります。デフォルトは
# $CATALINA_BASE/temp です。
#
# JAVA_HOME は Java Development Kit のインストールを指す必要があります。
# 「debug」引数を指定して実行する必要があります。
#
# JRE_HOME は Java ランタイムのインストールを指す必要があります。
# 空の場合はJAVA_HOMEがデフォルトになります。JRE_HOMEとJAVA_HOMEの両方が
# 両方が設定されている場合は、JRE_HOME が使用されます。
#
# JAVA_OPTS (オプション) コマンドを実行するときに使用するJavaランタイムオプション
# が実行されます。
# CATALINA_OPTSにすべてのオプションを含めず、ここに含めます。
# Tomcatとstopプロセスで使用される必要があります。
# バージョンコマンドなど
# ほとんどのオプションは CATALINA_OPTS に入力する必要があります。
#
# JAVA_ENDORSED_DIRS (オプション) コロンで区切られたディレクトリのリスト
# APIの置き換えを可能にするためにいくつかのjarを含む
# JCP の外部で作成されました (つまり、W3C の DOM と SAX)。
# XML パーサーの実装を更新するためにも使用できます。
# デフォルトは $CATALINA_HOME/endorsed です。
#
# JPDA_TRANSPORT (オプション) 「jpda start」時に使用するJPDAトランスポート
# コマンドが実行されます。デフォルトは「dt_socket」です。
#
# JPDA_ADDRESS (オプション) 「jpda start」を実行するときに使用するJavaランタイムオプション
# コマンドが実行されます。デフォルトは localhost:8000 です。
#
# JPDA_SUSPEND (オプション) 「jpda start」時に使用するJavaランタイムオプション
# コマンドが実行されます。JVMが一時停止するかどうかを指定します
# 起動直後に実行します。デフォルトは「n」です。
#
# JPDA_OPTS (オプション) 「jpda start」を実行するときに使用するJavaランタイムオプション
# コマンドが実行されます。使用する場合、JPDA_TRANSPORT、JPDA_ADDRESS、
# および JPDA_SUSPEND は無視されます。したがって、必要なすべての jpda
# オプションを指定する必要があります。デフォルトは次のとおりです:
#
# -agentlib:jdwp=トランスポート=$JPDA_TRANSPORT,
# アドレス=$JPDA_ADDRESS、サーバー=y、サスペンド=$JPDA_SUSPEND
#
# JSSE_OPTS (オプション) TLSを制御するために使用されるJavaランタイムオプション
# JSSE を使用する場合の実装。デフォルトは次のとおりです:
# "-Djdk.tls.ephemeralDHKeySize=2048"
#
# CATALINA_PID (オプション) pidを格納するファイルのパス
# カタリナの起動Javaプロセスの開始(フォーク)の場合
# 使用済み
#
# LOGGING_CONFIG (オプション) Tomcat のログ設定ファイルを上書きする
# 例 (すべて 1 行)
# LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
#
# LOGGING_MANAGER (オプション) Tomcatのログマネージャをオーバーライドする
# 例 (すべて 1 行)
# LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
#
# USE_NOHUP (オプション) 文字列trueに設定すると、開始コマンドは
# Tomcatプロセスがハングアップを無視するようにnohupを使用する
# シグナル。HP-UXで実行していない限り、デフォルトは「false」です。
# デフォルトは「true」です
# -----------------------------------------------------------------------------
 
# OS 固有のサポート。$var は true または false のいずれかに設定する必要があります。
cygwin=偽
ダーウィン=偽
os400=偽
hpux=偽
ケース「`uname`」
CYGWIN*) cygwin=true;;
ダーウィン*) darwin=true;;
OS400*) os400=true;;
HP-UX*) hpux=true;;
エサック
 
# リンクを解決 - $0 はソフトリンクである可能性があります
PRG="$0"
 
while [ -h "$PRG" ]; 実行する
 ls=`ls -ld "$PRG"`
 リンク=`式 "$ls" : '.*-> \(.*\)$'`
 式 "$link" : '/.*' > /dev/null; の場合
  PRG="$リンク"
 それ以外
  PRG=`dirname "$PRG"`/"$link"
 フィ
終わり
 
# 標準環境変数を取得する
PRGDIR=`ディレクトリ名 "$PRG"`
 
# CATALINA_HOME がまだ設定されていない場合のみ設定します
[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
 
# CATALINA_HOME から CATALINA_BASE がまだ設定されていない場合はコピーします
[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"
 
# 起動時にユーザー定義のCLASSPATH変数が使用されていないことを確認します。
# ただし、まれに必要になった場合に、setenv.sh で指定できるようにします。
クラスパス=
 
[ -r "$CATALINA_BASE/bin/setenv.sh" ] の場合;
 . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; 次に
 . "$CATALINA_HOME/bin/setenv.sh"
フィ
 
# Cygwinの場合、何かを変更する前にパスがUNIX形式であることを確認してください
$cygwinの場合;
 [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
 [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
 [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
 [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
 [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
フィ
 
# CATALINA_HOMEとCATALINA_BASEのどちらにもコロンが含まれていないことを確認してください
# これはクラスパスの区切り文字として使用され、Javaでは
# パス内に同じ文字が出現した場合にエスケープするメカニズム。
$CATALINA_HOMEの場合
 *:*) echo "CATALINA_HOME を使用しています: $CATALINA_HOME";
    echo "CATALINA_HOME にコロン (:) 文字が含まれているため、起動できません";
    出口1;
エサック
$CATALINA_BASEの場合
 *:*) echo "CATALINA_BASE を使用しています: $CATALINA_BASE";
    echo "CATALINA_BASE にコロン (:) 文字が含まれているため、起動できません";
    出口1;
エサック
 
# OS400の場合
$os400の場合
 # ジョブの優先度を、インタラクティブの標準(インタラクティブ - 6)に設定します。
 # 対話優先度 - 6、リクエストに応答するヘルパースレッド
 # は対話型ジョブと同じ優先度で実行されます。
 コマンド='chgjob job('$JOBNAME') runpty(6)'
 システム $COMMAND
 
 # マルチスレッドを有効にする
 エクスポート QIBM_MULTI_THREADED=Y
フィ
 
# 標準のJava環境変数を取得する
$os400の場合
 # -r は、次のファイルの場合のみ os400 で機能します:
 # 1. ユーザーが所有
 # 2. ユーザーのプライマリグループが所有する
 # ユーザーがセカンダリグループに属している場合は機能しません
 . "$CATALINA_HOME"/bin/setclasspath.sh
それ以外
 [ -r "$CATALINA_HOME"/bin/setclasspath.sh ] の場合;
  . "$CATALINA_HOME"/bin/setclasspath.sh
 それ以外
  echo "$CATALINA_HOME/bin/setclasspath.sh が見つかりません"
  echo "このプログラムは実行するために必要です"
  出口1
 フィ
フィ
 
# CLASSPATH に追加の jar ファイルを追加します
if [ ! -z "$CLASSPATH" ] ; then
 クラスパス="$CLASSPATH":
フィ
CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar
 
if [ -z "$CATALINA_OUT" ] ; then
 CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
フィ
 
if [ -z "$CATALINA_TMPDIR" ] ; then
 # Catalina で使用する java.io.tmpdir を定義します
 CATALINA_TMPDIR="$CATALINA_BASE"/temp
フィ
 
# tomcat-juli.jar をクラスパスに追加します
# tomcat-juli.jar はインスタンスごとに上書きできます
if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
 クラスパス=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar
それ以外
 CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar
フィ
 
# Bugzilla 37848: TTY が利用できない場合はコンソールに出力しない
tty=0 を持っている
if [ "`tty`" != "ttyではない" ]; then
  端末を持っている=1
フィ
 
# Cygwin の場合、java を実行する前にパスを Windows 形式に切り替えます
$cygwinの場合;
 JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
 JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
 CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
 CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"`
 CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"`
 CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
 JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
フィ
 
[ -z "$JSSE_OPTS" ] の場合;
 JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
フィ
JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"
 
# カスタム URL ハンドラーを登録する
# ここでこれを行うと、カスタム URL ハンドル (具体的には 'war:...') をセキュリティ ポリシーで使用できるようになります。
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
 
# juli LogManager 構成ファイルが存在し、オーバーライドが発行されていない場合はそれを設定します
[ -z "$LOGGING_CONFIG" ]の場合;
 [ -r "$CATALINA_BASE"/conf/logging.properties ]の場合;
  LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
 それ以外
  #バグジラ 45585
  LOGGING_CONFIG="-Dnop"
 フィ
フィ
 
[ -z "$LOGGING_MANAGER" ]の場合;
 LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
フィ
 
# 次の行のコメントを解除して、umask を使用可能にします。
#org.apache.catalina.security.セキュリティリスナー
#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
 
[ -z "$USE_NOHUP" ]の場合;
  $hpuxの場合;
    USE_NOHUP="true"
  それ以外
    USE_NOHUP="偽"
  フィ
フィ
_NOHUP の設定を解除
[ "$USE_NOHUP" = "true" ]の場合;
  _NOHUP=いいえ
フィ
 
# ----- 要求されたコマンドを実行する -----------------------------------------
 
# Bugzilla 37848: TTY がある場合にのみこれを出力します
[ $have_tty -eq 1 ]の場合;
 echo "CATALINA_BASE を使用しています: $CATALINA_BASE"
 echo "CATALINA_HOME を使用しています: $CATALINA_HOME"
 echo "CATALINA_TMPDIR を使用しています: $CATALINA_TMPDIR"
 if [ "$1" = "debug" ] ; then
  echo "JAVA_HOME を使用しています: $JAVA_HOME"
 それ以外
  echo "JRE_HOME を使用しています: $JRE_HOME"
 フィ
 echo "CLASSPATH を使用しています: $CLASSPATH"
 if [ ! -z "$CATALINA_PID" ]; then
  echo "CATALINA_PID を使用しています: $CATALINA_PID"
 フィ
フィ
 
[ "$1" = "jpda" ] の場合;
 [ -z "$JPDA_TRANSPORT" ]の場合;
  JPDA_TRANSPORT="dt_socket"
 フィ
 [ -z "$JPDA_ADDRESS" ]の場合;
  JPDA_ADDRESS="localhost:8000"
 フィ
 [ -z "$JPDA_SUSPEND" ]の場合;
  JPDA_SUSPEND="n"
 フィ
 [ -z "$JPDA_OPTS" ]の場合;
  JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT、address=$JPDA_ADDRESS、server=y、suspend=$JPDA_SUSPEND"
 フィ
 CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
 シフト
フィ
 
if [ "$1" = "debug" ] ; then
 $os400の場合
  echo "デバッグコマンドはOS400では利用できません"
  出口1
 それ以外
  シフト
  [ "$1" = "-security" ] の場合;
   [ $have_tty -eq 1 ]の場合;
    echo "セキュリティ マネージャーの使用"
   フィ
   シフト
   "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ を実行します
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
    -sourcepath "$CATALINA_HOME"/../../java \
    -Djava.security.manager \
    -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    org.apache.catalina.startup.Bootstrap "$@" 開始
  それ以外
   "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \ を実行します
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
    -sourcepath "$CATALINA_HOME"/../../java \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    org.apache.catalina.startup.Bootstrap "$@" 開始
  フィ
 フィ
 
elif [ "$1" = "run" ]; その後
 
 シフト
 [ "$1" = "-security" ] の場合;
  [ $have_tty -eq 1 ]の場合;
   echo "セキュリティ マネージャーの使用"
  フィ
  シフト
  eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
   -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
   -Djava.security.manager \
   -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
   -Dcatalina.base="\"$CATALINA_BASE\"" \
   -Dcatalina.home="\"$CATALINA_HOME\"" \
   -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
   org.apache.catalina.startup.Bootstrap "$@" 開始
 それ以外
  eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
   -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
   -Dcatalina.base="\"$CATALINA_BASE\"" \
   -Dcatalina.home="\"$CATALINA_HOME\"" \
   -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
   org.apache.catalina.startup.Bootstrap "$@" を開始\
   >> "$CATALINA_OUT" 2>&1 
 フィ
フィ

Dockerfile を書く (上記の Tomcat イメージに基づく)

#ベースイメージ FROM tomcat:1.0
 
# プロジェクトディレクトリとログディレクトリを作成します。ホストにマウントする必要があります -v RUN set -x \
  &&mkdir -p /Webs/logs \
  \
  &&rm -rf /usr/local/tomcat/logs \
  \
  &&ln -sf /Webs/logs /usr/local/tomcat/logs
 
# スタートアップファイルをコンテナにコピーします COPY start.sh /usr/local/tomcat/bin/
 
# コンテナ起動スクリプトに権限を与える RUN chmod +x /usr/local/tomcat/bin/start.sh
 
# ポート 8080 を開く EXPOSE 8080
 
# tomcatを実行する
CMD ["start.sh","run"] 

画像を作成する

[root@docker43 tomcat_web]# docker build -t tomcat_web:v1 .

ミラーを見る

[root@docker43 tomcat_web]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
tomcat_web v1 b3651c50a7b5 26秒前 124 MB
tomcat 1.0 64c9cec4375d 6分前 124 MB
alpine_jre 最新 614bc57ab66e 14 分前 91.1 MB
docker.io/alpine-latest 196d12cf6ab1 3 週間前 4.41 MB

3. コンテナを作成する

プロジェクトディレクトリを作成する

tomcat_webイメージに基づいてコンテナを作成します

まず、ホストマシンにプロジェクトディレクトリを作成します(server.xml構成ファイルをコピーし、使用するパスを変更します)

[root@docker43 ~]# cd /home/
[root@docker43 ホーム]# mkdir test.tomcat.com && cd test.tomcat.com
[root@docker43 test.tomcat.com]# touch server.xml # 構成ファイル [root@docker43 test.tomcat.com]# mkdir logs # ログディレクトリ [root@docker43 test.tomcat.com]# mkdir wwwroot # プロジェクトのメインディレクトリ (変更した場合は、server.xml で変更することを忘れないでください)
[root@docker43 test.tomcat.com]# ll
合計使用量 0
drwxr-xr-x 2 ルート ルート 6 10月 6 18:03 ログ
-rw-r--r-- 1 ルート ルート 0 10月6日 18:02 server.xml
drwxr-xr-x 2 ルート ルート 6 10月 6日 18:03 wwwroot

server.xml 構成ファイル

  <?xml バージョン = '1.0' エンコーディング = 'utf-8'?>
  <サーバーポート="8005" シャットダウン="シャットダウン">
  <リスナークラス名="org.apache.catalina.startup.VersionLoggerListener" />
  <リスナークラス名="org.apache.catalina.core.AprLifecycleListener" SSLEngine="オン" />
  <リスナークラス名="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <リスナークラス名="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <リスナークラス名="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 
  <グローバル命名リソース>
 
   <リソース名="UserDatabase" auth="コンテナ"
        タイプ="org.apache.catalina.UserDatabase"
        description="更新および保存できるユーザーデータベース"
        ファクトリー="org.apache.catalina.users.MemoryUserDatabaseFactory"
        パス名="conf/tomcat-users.xml" />
  </グローバル命名リソース>
 
  <サービス名="Catalina">
   <コネクタ ポート="8080" プロトコル="org.apache.coyote.http11.Http11AprProtocol"
        接続タイムアウト = "20000"
        最大スレッド数 = "1000" 
        最小スペアスレッド数="100" 
        リダイレクトポート="8443" URIエンコーディング="UTF-8"/>
   <コネクタ ポート="8009"、maxThreads="1000"、minSpareThreads="100"、プロトコル="AJP/1.3"、リダイレクト ポート="8443" />
   <エンジン名="Catalina" defaultHost="localhost">
    <レルムクラス名="org.apache.catalina.realm.LockOutRealm">
    <レルム クラス名="org.apache.catalina.realm.UserDatabaseRealm" リソース名="UserDatabase"/>
    </レルム>
 
    <ホスト名="localhost" appBase="/Webs/wwwroot" unpackWARs="true" autoDeploy="true">
     <コンテキスト パス="" docBase="/Webs/wwwroot" reloadable="true" />
     <Valve クラス名="org.apache.catalina.valves.AccessLogValve" 
     ディレクトリ="ログ" 
     プレフィックス="localhost__access_log" 
     サフィックス=".txt" 
     パターン="%{X-Real-IP}i %l %u %t "%r" %s %b" />
 
    </ホスト>
 
   </エンジン>
  </サービス>
 </サーバー>

テストページの作成

wwwrootにテストページを書く

[root@docker43 test.tomcat.com]# cd wwwroot/
[root@docker43 wwwroot]# cat index.html 

成功

コンテナを作成して起動する

次のようにコードをコピーします
docker run -tid --restart=always --name test.tomcat.com -p 5081:8080 -v /home/test.tomcat.com/:/Webs -m 2048m --memory-swap=2048m --cpu-shares=256 tomcat_web:v1 start.sh run -config /Webs/server.xml

コンテナを表示

[root@docker43 test.tomcat.com]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
ab62045e0688 tomcat_web:v1 "start.sh run -con..." 2 秒前 1 秒前にアップ 0.0.0.0:5081->8080/tcp test.tomcat.com

テスト

[root@docker43 test.tomcat.com]# カール 127.0.0.1:5081
成功 [root@docker43 test.tomcat.com]# 

4. ヒント

1. どうしてこんなにたくさんの画像を作る必要があるのか​​と、きっと聞かれるでしょう。私の答えは、各画像を後で分離してプライベート リポジトリに配置し、将来個別に使用できるようにする必要があるということです。

2. この記事のコードはそのままコピーして貼り付けることができます。Dockerfile の変数バージョン、プロジェクトパス、コンテナ作成のパラメータなどは、ご自身の状況に合わせて変更してください。

3. 2 番目のプロジェクトを作成するときは、コンテナの作成手順を繰り返し、プロジェクト ディレクトリの名前とコンテナの名前を変更するだけです。

4. 上記の 3 つの Dockerfile ファイルをマージしてイメージを作成することもできますが、これはお勧めしません。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Alpine Dockerイメージフォント問題解決操作
  • alpineをベースにdockerfileで作成したクローラーScrapyイメージの実装
  • Docker で php-nginx-alpine イメージをゼロから構築する方法
  • Docker Alpine イメージのタイムゾーン問題に対する完璧な解決策

<<:  jQuery でダイナミックなパーティクル効果を実現

>>:  Ubuntu の Docker で mysql5.6 をインストールする方法

推薦する

CSS の歪んだ影の実装コード

この記事では、CSS ワープ シャドウの実装コードを紹介し、皆さんと共有します。詳細は以下の通りです...

JavaScript キャンバスは影付きのグラフィックとテキストを実装します

キャンバスを使用して、参照用の影付きのグラフィックとテキストを作成します。具体的な内容は次のとおりで...

MacでMysqlのルートパスワードを忘れた場合の解決方法

長い間コンピューターで mysql を使用していなかったので、パスワードを忘れてしまいました。でも、...

JavaScript を使用して文字列内の最も繰り返しの多い文字を取得する方法

目次トピック分析する使用目的解決:コードは次のように実装されます。分析:配列とポインタ解決:コードは...

Node.jsミドルウェアの仕組みの詳細な説明

目次Express ミドルウェアとは何ですか? Expressミドルウェアを作成するための要件Exp...

Reactは適応性の高い仮想リストを実装する

目次変換前:変換後: 0x0の基本0x1 「固定高さ」の仮想リストを実装する原理:最適化: 0x2 ...

CSS 属性を使用してマウス イベントをブロックする方法 (マウス クリックは上位の要素を貫通する可能性があります)

由来: 数日前、テスターから写真を見るという要件が送られてきました。 この要件を見たとき、私は少し混...

LeetCode の SQL 実装 (175. 2 つのテーブルの結合)

[LeetCode] 175.2つのテーブルを結合する表: 人物+-------------+--...

nginxを使用してドメイン名ベースの仮想ホストを構成する

1. 仮想ホストとは何ですか?仮想ホストは、特殊なテクノロジーを使用して、実行中のサーバーを論理的に...

HTML タグ tbody の使い方と説明

tbody 要素は、thead 要素および tfoot 要素と組み合わせて使用​​する必要があります...

Vue3+TypeScriptはaxiosをカプセル化し、リクエスト呼び出しを実装します

まさか、2021年になってもTypeScriptについて聞いたことがない人がいるなんて?プロジェクト...

MySQL/MariaDB でピボット テーブルを実装する方法のサンプル コード

前回の記事では、Oracle でピボット テーブルを実装するいくつかの方法を紹介しました。今日は、同...

JavaScript で実装された 7 つのソート アルゴリズムの概要 (推奨!)

目次序文バブルソート基本アルゴリズム2 番目の書き方は、基本的なアルゴリズムに基づいて改良されていま...

Vue3+Element+Tsは、フォームの基本的な検索リセットやその他の機能を実装します

Vue2 の記述スタイルから Vue3 の形式に切り替えると、記述スタイルとコード構造にいくつかの変...

反応ループデータの実装(リスト)

まず、バックグラウンドから来るデータをシミュレートしてみましょう。ここでは、コードをわかりやすくする...