Dockerは、そのパフォーマンス、フォールトトレランス、そして最も重要なこととしてシンプルさのために、最近非常に人気があります。
今日、 hub.docker.comで何千もの画像を見つけることができます。 画像の作成が簡単なため、わずか30分で貢献を開始できます。
しかし、多くの人はベストプラクティスを忘れており、このため、ドッカーハブには膨大な数の最高ではない画像があふれています。
この記事では、ベストプラクティスを例として使用して画像を作成することがどれほど簡単で便利かを説明します。
例として、 oracle 11g xe GitHub docker-hubを使用し て重要なイメージを選択しました。
元のプロジェクトでは、ベストプラクティスを使用して、主要なポイントでソートされた弱点と省略を特定できます。
.dockerignoreを使用する
非常に便利な機能ですが、残念ながら多くの人はそれを知らず、使用しません。
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を準備する際に、いくつかの
レイヤー数を最小限に抑える
この項目は非常にシンプルですが、同時に非常に重要です。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
まとめ
その結果、ベストプラクティスに従って、多くの利点が得られました。
- 画像サイズが3GB減少(3.8Gbから825Mbに)
- データファイルのマウントと再利用のサポート
- 優雅なサービスの停止
- コンテナ開始時のパラメータを介したデータベースの微調整の機会
githubおよびhub.docker.comで作業結果と問題解決の詳細を見つけることができます。
ご清聴ありがとうございました。