Engine 1.10 への移行¶
Docker Engine バージョン 1.10 以降は、ディスク上にイメージ・データを割り当てる方式が完全に変わります。従来は、各イメージとレイヤに対してランダムな UUID を割り当てていました。バージョン 1.10 からは、イメージとレイヤ・データの安全なハッシュ値を元にした ID を使い、中身を指定できる手法を実装しました。
新しい手法は、利用者を更に安全にします。組み込まれた方式は ID の衝突を防止し、pull ・ push ・ load ・ save を実行した後のデータを保証します。また、レイヤの共有を改善しました。たとえ同時に構築していなくても、多くのイメージ間でレイヤを自由に共有できるようになります。
イメージに対して内容に関する情報を割り当てることで、既にダウンロード済みのイメージがあるかどうかの検出も容易になります。これはイメージとレイヤが分離しているためであり、オリジナルの構築チェーンに含まれる各イメージを、それぞれ取得(pull)する必要はありません。また、構築命令のためにレイヤを作成する必用がなくなったため、ファイルシステムを変更しません。
連想機能(content addressability;コンテント・アドレッサビィティ)とは、新しい配布機能の基礎です。イメージの取得(pull)と送信(push)の手法は、ダウンロード/アップロード・マネージャの概念を扱うために調整されました。これにより、イメージの送受信がより安定し、並列リクエスト時の問題を軽減します。ダウンロード・マネージャはダウンロードの失敗時にリトライできるようになり、ダウンロードにおける適切な優先度付けも行えるようにもなりました。
更に、新しいマニフェスト・フォーマットも導入しました。これは連想機能をベースにしています。これは連想イメージ(content addressable image)の設定やレイヤのチェックサムを直接参照できます。この新しいマニフェスト・フォーマットにより、複数のアーキテクチャやプラットフォームのためにマニフェスト・リストが利用できるでしょう。新しいマニフェスト・フォーマットへの移行は、完全に透過的です。
アップグレードの準備¶
現在のイメージを新しいモデルで利用できるようにするには、連想ストレージ(content addressable storage)への移行が必要です。すなわち、現在のデータの安全なチェックサムを計算することを意味します。
Docker Engine 1.10 の初回起動時は、現時点における全てのイメージ、タグ、コンテナが自動的に新しい基盤上に移行します。そのため、コンテナを読み込む前に、デーモンは現時点のデータに対するチェックサムを全て計算する必要があります。計算が終わったら、全てのイメージとタグは新しい安全な ID に更新されます。
これは非常に単純な操作ですが、各ファイルに対する SHA256 チェックサムを計算するため、多くのイメージ・データがあれば計算に時間を消費します。 データの移行プロセスにかかる時間は、およそ平均して1秒あたり 100MB と想定されます。この処理の間、Docker デーモンはリクエストに応答できません。
移行時間の最小化¶
一度だけの処理が許容できるのであれば、Docker Engine のアップグレードと、デーモンの再起動により、イメージの移行が透過的に行われます。しかしながら、デーモンの停止時間を最小化したい場合は、古いデーモンを動かしたまま移行ツールを使えます。
このツールは現在のイメージを全て探し出し、それらのチェックサムを計算します。デーモンのアップグレードと再起動を行った後、移行するイメージに対するチェックサム・データが既に存在していれば、デーモンは計算処理を行いません。移行とアップグレード期間中に新しいイメージが追加されている場合は、1.10 へのアップグレードのプロセス中で処理されます。
移行ツールは Docker イメージとしても実行することができます。移行用ツールのイメージを実行している間、このコンテナに対して Docker のデータを直接公開する必要があります。
$ docker run --rm -v /var/lib/docker:/var/lib/docker docker/v1.10-migrator
devicemapper ストレージ・ドライバを使っている場合は、 --privileged
フラグを指定することで、ツールがストレージ・デバイスにアクセス可能となります。
参考
- Migrate to Engine 1.10
- https://docs.docker.com/engine/migration/