Dockerイメージを作成することは、環境をテストするための簡単な作業になります。しかし、プロダクションの実装に関しては、セキュリティとワークフローの問題を克服するためのベストプラクティスに従わなければなりません。ベストプラクティスを使用してProduction Ready Dockerイメージを作成するにはどうすればよいですか?
生産準備完了ドッカー画像を作成するベストプラクティスは何ですか?
Dockerイメージを作成することは、環境をテストするための簡単な作業になります。しかし、プロダクションの実装に関しては、セキュリティとワークフローの問題を克服するためのベストプラクティスに従わなければなりません。ベストプラクティスを使用してProduction Ready Dockerイメージを作成するにはどうすればよいですか?
生産準備完了ドッカー画像を作成するベストプラクティスは何ですか?
Create Production Docker Images in 5 Steps by DevopsAnswersに包括的に記載されているように、以下の手順は、プロダクション対応のDockerイメージを作成する包括的なガイドとみなされます。
生産用のDockerイメージを作成する際には、Dockerのベストプラクティスに関する広範な知識が必要です。
ステップ1:使用軽量ベースドッカー画像
それだときに、より便利であろうドッカー画像を得られるの使用ので、嵩高いベースイメージを使用するのではなく、軽量の画像を使用した方が良いでしょうサイズが小さくなります。
非常に重要な生産システムでDockerを使用する予定がある場合、数秒のダウンタイムを許さない場合、最初に選択する必要があるのは、カスタムドッカーイメージの軽量ベースイメージです。
ステップ2:Dockerfile
で中間層を減らし
、等FROM
、LABEL
、RUN
、CMD
、ADD
としてすべての命令は、ドッカー画像に新たな層を追加することになります。したがって、同じ命令を複数回使用することを減らすことは、画像を少し小さくするためのベストプラクティスになります。
ステップ3:それは生産の実装のための素晴らしいと着実なものを維持しますので、それは、ドッカー命令内の特定のバージョンを選択することをお勧めだ特定のバージョン を選択してください。
Ubuntu:latest
をベースイメージとして使用するとします。現在使用可能な最新のUbuntuイメージをカスタムDockerイメージに使用します。さらに、同じUbuntuバージョンに基づいてすべてのソフトウェアコンポーネントをセットアップします。 Ubuntuが最新のタグをDocker Hubの新しいベースイメージで更新すると、プロダクションDockerイメージにパッケージ依存関係の問題や非互換性が発生することがあります。
さらに、一般パッケージをインストールするのではなく、特定のパッケージバージョンをインストールするようにしてください。このようなデータベースの認証情報とAPIキーなどの機密データを使用して機密データ
を含めないでください次のようになります。ステップ4 apt-get install mysql-server
推奨しない
例
推奨apt-get install mysql-server-5.5
Dockerの難しい課題です。
ドッカーイメージ
内の任意のログイン資格情報は、この制限を克服するためにハードコードしない、あなたは効果的に環境変数を使用する必要があります。
たとえば、Mysql DBに接続するDrupalイメージを作成すると、Drupal MySQL DBの設定を次のように空白にできます。
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => '',
'username' => '',
'password' => '',
'host' => '',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);
今、私たちは以下のように実行時にDrupalのMySQLのDBの資格情報を交換するために、環境変数を活用するENTRYPOINT
を使用することができます。
#!/bin/sh
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /var/run/apache2.pid
# Define Drupal home file path
DRUPAL_HOME="/var/www/html"
# Define Drupal settings file path
DRUPAL_SETTINGS_FILE="${DRUPAL_HOME}/sites/default/settings.php"
# Check the avilability of environment variables
if [ -n "$DRUPAL_MYSQL_DB" ] && [ -n "$DRUPAL_MYSQL_USER" ] && [ -n "$DRUPAL_MYSQL_PASS" ] && [ -n "$DRUPAL_MYSQL_HOST" ] ; then
echo "Setting up Mysql DB in $DRUPAL_SETTINGS_FILE"
# Set Database
sed -i "s/'database' *=> *''/'database' => '"$DRUPAL_MYSQL_DB"'/g" $DRUPAL_SETTINGS_FILE
# Set Mysql username
sed -i "s/'username' *=> *''/'username' => '"$DRUPAL_MYSQL_USER"'/g" $DRUPAL_SETTINGS_FILE
# Set Mysql password
sed -i "s/'password' *=> *''/'password' => '"$DRUPAL_MYSQL_PASS"'/g" $DRUPAL_SETTINGS_FILE
# Set Mysql host
sed -i "s/'host' *=> *''/'host' => '"$DRUPAL_MYSQL_HOST"'/g" $DRUPAL_SETTINGS_FILE
fi
# Start Apache in foreground
tail -F /var/log/apache2/* &
exec /usr/sbin/apache2ctl -D FOREGROUND
最後に、以下のようにDockerランタイム中に環境変数を定義することができます。
docker run -d -t -i
-e DRUPAL_MYSQL_DB='database'
-e DRUPAL_MYSQL_USER='user'
-e DRUPAL_MYSQL_PASS='password'
-e DRUPAL_MYSQL_HOST='host'
-p 80:80
-p 443:443
--name <container name>
<custom image>
ステップ5:実行CMD/Entypoint非特権ユーザー
からそれだけでなく、セキュリティの観点から優れている非特権ユーザーを使用して生産システムを実行するために、常に良い選択です。
DockerfileにUSER
のエントリをCMD
またはENTRYPOINT
の前に入力するだけです。
# Set running user of ENTRYPOINT
USER www-data
# Start entrypoint
ENTRYPOINT ["entrypoint"]