第1章 概要

本書は、コンテナー開発の推奨プラクティスガイドです。本書は、ソリューションアーキテクトによる Red Hat がサポートするコンテナー開発の一連のガイドラインのリクエストに対応して作成されました。現在の Docker ベースのインプリメンテーションにおけるコンテナーは急速に進歩している新テクノロジーですが、本書の作成にあたって、Red Hat 内のコンテナーのサポート状況を確認し、これを分かりやすい方法で説明することを試みました。コンテナーの使用事例は多数あるため、ここでは長期的にサポートされる有効なコンテナー関連の基本的な手法について一般的な推奨を行います。

1.1. コンテナーの出所

ここでは、コンテナーの出所、コンテナーの取得方法、かつコンテナーを安全に取得する方法について説明します。

コンテナーはイメージから構築され、イメージはレジストリーにあるリポジトリーに保存されます。本書では、コマンド docker pull がアクセスできる、(1) docker.io レジストリーおよび (2) 内部 redhat.com レジストリーの 2 つのレジストリーについて説明します。

1.1.1. 「docker pull」の危険性

素 (naked) の状態で使用される docker pull は危険なコマンドになる可能性があります。Docker はソフトウェアの取得とソフトウェアのインストールをほとんど区別しません。これは (たとえば) RPM の場合と異なります。RPM では、これをインストールしない限り、wget を使用してマルウェアを含む RPM を取得しても問題はありません。ただし、Docker を使用してマルウェアを取得するのは危険です。取得の動作はインストールの動作と機能的に同等です。

コンテナーを、取得時に特権付きで開始されるソフトウェアであると考えてください。コンテナーでは設定の操作が行われた後にのみ特権が解除されます。複数コンテナーの分離は通常は任意で行われ、デフォルトでは分離されません。

docker pull コマンドを使用する際は注意してください。

また、docker pull コマンドの使用に危険が伴う理由を理解しておく必要があります。

コンテナーが RH レジストリーにない場合、docker pull は docker.io レジストリーにフェールオーバーします。Red Hat は docker.io から派生するコンテナーのセキュリティーまたは信頼性を検証しません (Docker Inc. も同様です)。イメージの名前付け規則 のセクションも参照してください。

Red Hat レジストリー以外の場所からイメージを取得する場合、docker pull の使用を避けてください。可能な場合は、 docker load および docker save を使用します。docker load および docker save を tarball で使用し、それらを Fedora 内で確認することができます。

docker load および docker savedocker pull の代わりに使用する必要がある理由として、docker load および docker save の使用は、docker pull を実行する場合に Docker Hub へのシステム公開時に避けられないセキュリティーの脆弱性を防ぐ手段となります。

適切なコンテナーの場所および docker pull を使用する際に注意する点については、2014 年 12 月 18 日付の Trevor Jay 氏による Red Hat Security Blog の掲載記事 Before You Initiate a "docker pull" を参照してください。

1.1.1.1. Docker Pull

docker pull の基本的な形式は $ sudo docker pull repo/image:tag です。ここで、repo および tag はオプションになります。repo および tag が指定されない場合、docker はイメージを docker.io レジストリー内で見つけようとします。このため、イメージを取得するレジストリーの名前を常に明示的に設定することが推奨されます。レジストリーが指定されない場合も、docker は docker.io レジストリーでイメージを見つけようとします。tag が指定されていない場合、docker はデフォルトで最新イメージを取得しようとします。

1.1.1.2. Docker Load

docker load の基本的な形式は以下のようになります。

$ sudo docker load -i input.tar

ここで、input.tar はローカルの docker レジストリーにロードされる tar イメージです。-i および input.tar ファイル名はオプションです。-i またはファイル名のいずれも指定されない場合、docker load は STDIN の tar データを予想します。

1.1.1.3. Docker Save

docker save の基本的な形式は以下のようになります。

$ sudo docker save -o output.tar

ここで、output.tar はローカルの docker レジストリーにロードされる tar イメージです。-o および output.tar ファイル名はオプションです。-o またはファイル名のいずれも指定されない場合、docker save は STDOUT にコンテナーデータを出力します。