Googleは、コンテナを効果的に作成するための7つのベストプラクティスを公式ブログで公開した。
Googleは2018年7月10日(米国時間)、コンテナを効果的に作成するための7つのベストプラクティスを「Google Cloud Platform」の公式ブログで紹介した。概要は以下の通り。
コンテナは、内部で1つのアプリケーションが実行されるときに最も効果的に機能する。このアプリケーションは、親プロセスが1つでなければならない。例えば、同じコンテナでPHPとMySQLを実行してはならない。コンテナごとに1つのアプリケーションをパッケージングすれば、アプリケーションのライフサイクルに合わせてコンテナのライフサイクルを管理できる。
KubernetesとDockerは、コンテナ内のアプリケーションを停止するために、Linuxシグナルを送信する。このシグナルは、プロセス識別子(PID)が「1」のプロセスに送信される。アプリケーションを必要なときに適切に停止させるには、このシグナルを適切に扱わなければならない。
Dockerはイメージのレイヤーをキャッシュし、後で行われるビルドを高速化する。これは非常に便利な機能だが、Dockerfileの作成時に注意が必要になる。例えば、アプリケーションのソースコードは、Dockerfileにできるだけ後で追加しなければならない。そうすれば、ベースイメージとアプリケーションの依存関係がキャッシュされ、ビルドのたびに再構築されることがなくなる。
以下のDockerfileの例では、上側のサンプルのうち、2行目と3行目を入れ替えて、下側のように変更すべきだ。
FROM python:3.5 COPY my_code/ /src RUN pip install my_requirements
FROM python:3.5 RUN pip install my_requirements COPY my_code/ /src
新しいバージョンでは、pipコマンドの実行結果がキャッシュされるので、ソースコードが変更されるたびに、pipコマンドが再実行されることはない。
ホストシステムのアタックサーフェス(攻撃対象領域)を狭くすることは良いアイデアだ。コンテナを使えば、従来のシステムよりはるかに簡単に実現できる。アプリケーションが必要としないものは、全てコンテナから削除するとよい。ディストリビューションなしで、またはスクラッチイメージで、アプリケーションだけをコンテナに含めることができればなおよい。さらに、可能であれば、コンテナのファイルシステムは読み取り専用にする。
イメージのサイズは、できるだけ小さくすることが望ましい。ダウンロード時間とコールドスタート時間、ディスク使用量が減るからだ。イメージサイズを小さくするコツは、ベースイメージの最小化とイメージ間の共通レイヤーの利用、Dockerのマルチステージビルド機能の利用だ。
タグは、ユーザーがイメージのどのバージョンをどのように選んだかを示す。タグを付ける主な方法は、セマンティックバージョニングと、アプリケーションのGitコミットハッシュを使うことだ。どちらの方法でも、イメージを使うユーザーの期待を明確に表すように設定する。
注意点は、ユーザーは一部のタグ(「latest(最新)」のような)を除いて、タグを不変と考えることだ。このため、例えばイメージの特定のバージョンにタグを付けたら、そのタグを絶対に移動しないようにする。
作業の出発点として公開イメージを使うと便利だ。だが本番環境で使うと、特に制約が多い環境では、さまざまな問題に直面することがある。例えば、内部を管理する必要があるかもしれないし、外部リポジトリに依存したくないかもしれないといったことだ。
他方、全てのソフトウェアについて独自のイメージを作成するのは、容易なことではない。上流ソフトウェアのセキュリティ更新に対応する必要があることが大きな理由だ。ユースケースに応じて、公開イメージを使うかどうかを慎重に考えなければならない。
Copyright © ITmedia, Inc. All Rights Reserved.