Docker。 Oracle xe 11gイメージを使用したベストプラクティス





Dockerは、そのパフォーマンス、フォールトトレランス、そして最も重要なこととしてシンプルさのために、最近非常に人気があります。



今日、 hub.docker.comで何千もの画像を見つけることができます。 画像の作成が簡単なため、わずか30分で貢献を開始できます。



しかし、多くの人はベストプラクティスを忘れており、このため、ドッカーハブには膨大な数の最高ではない画像があふれています。



この記事では、ベストプラクティスを例として使用して画像を作成することがどれほど簡単で便利かを説明します。



例として、 oracle 11g xe GitHub docker-hubを使用し 重要なイメージを選択しました。



元のプロジェクトでは、ベストプラクティスを使用して、主要なポイントでソートされた弱点と省略を特定できます。



.dockerignoreを使用する



非常に便利な機能ですが、残念ながら多くの人はそれを知らず、使用しません。

この例では、.dockerfileに例外を追加することにより、イメージのビルド速度が低下し、最も重要なことには、イメージサイズが2Gb未満になりました



もちろん、重いバイナリファイルをgitに保存することはベストプラクティスではありませんが、現時点では、「動作する-触らない」と言うのがいかにファッショナブルであるか、または英国で「歴史的に発展した」と言うのはいかがでしょうか。



その結果、 3本の単純な線が画像を大幅に促進しました。 また、.dockerignoreに貢献する.gitを強くお勧めします。 このフォルダには、リポジトリ全体、この場合は大きなバイナリファイルの同じコピーが含まれます。



oracle-xe_11.2.0-1.0_amd64.debaa oracle-xe_11.2.0-1.0_amd64.debab oracle-xe_11.2.0-1.0_amd64.debac .git .gitignore
      
      







コンテナごとに1つのプロセスのみを実行する



これはかなり一般的な間違いであり、人々が仕事とリスクの原則を完全に理解していないという事実のために許可されています。

まず、SSHDとあまり正しくないCMD命令が目に投げ込まれます。

 CMD sed -i -E "s/HOST = [^)]+/HOST = $HOSTNAME/g" /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora; \ service oracle-xe start; \ /usr/sbin/sshd -D
      
      





特にユーザーが着信コマンドを「カスタマイズ」したい場合は、このアプローチを使用することの短所について非常に長い間議論することができます。



まず、デバッグやコンテナコンソールへの接続が必要な場合でも、必要がないためSSHDを削除します。docker exec -it $ {CONTAINER_ID} / bin / bashを使用することをお勧めします



また、コンテナが停止すると、SSHDのみが正常に停止しますがデータベース自体は親なしのプロセスとしてTERMシグナルによって停止します 。これは、特にデータベース、特にOracle DBには適していません。



「sed」および「service start」によって、単に存在しないとすでに仮定されている可能性があり、説明されているすべての機能をentrypoint.shに転送するのが妥当です。



ENTRYPOINTを準備する際に、いくつかの松葉杖の回避策を使用することを余儀なくされました(将来的には政治的に少し正確になります)。 ENTRYPOINTの詳細については、少し低く分析します。 一度に複数のポイントに影響します



レイヤー数を最小限に抑える



この項目は非常にシンプルですが、同時に非常に重要です。Dockerは各命令ごとにFSの増分変更を階層化することで機能するため、ここでは合理的な使用の例を示します。

 # Prepare to install Oracle RUN apt-get update && apt-get install -y -q libaio1 net-tools bc curl && \ apt-get clean && \ rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/* &&\ ln -s /usr/bin/awk /bin/awk &&\ mkdir /var/lock/subsys &&\ chmod 755 /sbin/chkconfig &&\ /oracle-install.sh
      
      





Oracleのインストール機能は、読みやすくするためにshスクリプトに移動されました。



不要なパッケージのインストールを避ける



不要なパッケージのインストールを拒否することに加えて、インストールファイル、キャッシュなどを単一の命令でクリーンアップして、増分レイヤーの不要なレイヤーを削除することも非常に重要です。そうしないと、イメージが二重に重くなります。



 apt-get clean && \ rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/* /download/directory
      
      







コンテナは短命でなければなりません



これは最も困難で重要なポイントの1つです。 「エフェメラル」という用語は、コンテナを起動してから削除してコンテナを停止したときに、次の起動が最小構成で前のコンテナを引き続き動作できることを意味します。



私たちの場合、これらはデータベースファイルであり(動作の原理はコールドバックアップのようなものです)、新しいコンテナを起動するときに使用できます。



このアプローチとDockerを使用すると、バックアップを簡単かつ迅速に作成し、即座にロールバックしてデータベース全体を複製できます。



また、ENV変数を介して設定として基本パラメーターを作成することも重要です。



その結果、このENTRYPOINTを取得しました



 #!/bin/bash # Prevent owner issues on mounted folders chown -R oracle:dba /u01/app/oracle rm -f /u01/app/oracle/product ln -s /u01/app/oracle-product /u01/app/oracle/product # Update hostname sed -i -E "s/HOST = [^)]+/HOST = $HOSTNAME/g" /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora sed -i -E "s/PORT = [^)]+/PORT = 1521/g" /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora echo "export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe" > /etc/profile.d/oracle-xe.sh echo "export PATH=\$ORACLE_HOME/bin:\$PATH" >> /etc/profile.d/oracle-xe.sh echo "export ORACLE_SID=XE" >> /etc/profile.d/oracle-xe.sh . /etc/profile case "$1" in '') #Check for mounted database files if [ "$(ls -A /u01/app/oracle/oradata)" ]; then echo "found files in /u01/app/oracle/oradata Using them instead of initial database" echo "XE:$ORACLE_HOME:N" >> /etc/oratab chown oracle:dba /etc/oratab chown 664 /etc/oratab printf "ORACLE_DBENABLED=false\nLISTENER_PORT=1521\nHTTP_PORT=8080\nCONFIGURE_RUN=true\n" > /etc/default/oracle-xe rm -rf /u01/app/oracle-product/11.2.0/xe/dbs ln -s /u01/app/oracle/dbs /u01/app/oracle-product/11.2.0/xe/dbs else echo "Database not initialized. Initializing database." printf "Setting up:\nprocesses=$processes\nsessions=$sessions\ntransactions=$transactions\n" echo "If you want to use different parameters set processes, sessions, transactions env variables and consider this formula:" printf "processes=x\nsessions=x*1.1+5\ntransactions=sessions*1.1\n" mv /u01/app/oracle-product/11.2.0/xe/dbs /u01/app/oracle/dbs ln -s /u01/app/oracle/dbs /u01/app/oracle-product/11.2.0/xe/dbs #Setting up processes, sessions, transactions. sed -i -E "s/processes=[^)]+/processes=$processes/g" /u01/app/oracle/product/11.2.0/xe/config/scripts/init.ora sed -i -E "s/processes=[^)]+/processes=$processes/g" /u01/app/oracle/product/11.2.0/xe/config/scripts/initXETemp.ora sed -i -E "s/sessions=[^)]+/sessions=$sessions/g" /u01/app/oracle/product/11.2.0/xe/config/scripts/init.ora sed -i -E "s/sessions=[^)]+/sessions=$sessions/g" /u01/app/oracle/product/11.2.0/xe/config/scripts/initXETemp.ora sed -i -E "s/transactions=[^)]+/transactions=$transactions/g" /u01/app/oracle/product/11.2.0/xe/config/scripts/init.ora sed -i -E "s/transactions=[^)]+/transactions=$transactions/g" /u01/app/oracle/product/11.2.0/xe/config/scripts/initXETemp.ora printf 8080\\n1521\\noracle\\noracle\\ny\\n | /etc/init.d/oracle-xe configure echo "Database initialized. Please visit http://#containeer:8080/apex to proceed with configuration" fi /etc/init.d/oracle-xe start echo "Database ready to use. Enjoy! ;)" ## ## Workaround for graceful shutdown. oracle... ‿( ́ ̵ _-`)‿ ## while [ "$END" == '' ]; do sleep 1 trap "/etc/init.d/oracle-xe stop && END=1" INT TERM done ;; *) echo "Database is not configured. Please run /etc/init.d/oracle-xe configure if needed." $1 ;; esac
      
      







まとめ





その結果、ベストプラクティスに従って、多くの利点が得られました。





githubおよびhub.docker.comで作業結果と問題解決の詳細を見つけることができます。



ご清聴ありがとうございました。



All Articles