入門docker 復習(6)

プロダクションでの活用

イメージの仕組み

Container

  • DockerImageはReadOny
  • Docker Containerを作成することで変更可能なレイヤーが生成され、レイヤーの上でプロセスを動かす
  • docker diffによりコンテナ起動後に変更されたファイルを確認できる

Unison FileSystem

  • Containerレイヤーに操作対象のパスが存在しない場合、Imageレイヤーにファイルが無いか確認する
  • Docker ContainerからDocker Imageへファイルを読み込む際は1レイヤーごとに操作するため、オーベーヘッドが大きくなる可能性がある
  • dockerのデフォルトのファイルの読み書きはコピーライトオン形式(元データは変更せず、新規更新を新たな場所に書き込みむこと)のため、ファイルの更新頻度が高いログなどはDataVolumeを使用してオーバーヘッドを小さくするべき

Dockerイメージ

  • イメージは複数のイメージの積み重ねで出来ている
  • 積み重なったイメージを中間イメージと呼ぶ、docker history <イメージ名>で確認可能
  • RUNコマンドをパイプで繋げることで中間イメージを減らし、軽量化が可能になる
  • レイヤーを作成するコマンド(RUN , COPY , ADD )を極力増やさない

Dockerfileのベストプラクティス

軽量なイメージを作る

  • イメージはサイズが軽く、レイヤーが少ないものが良い
  • サイズが思いpullに時間がかかり、レイヤーが増えるとオーバヘッドが増加する

最小限の構成にする

  • 1コンテナ1プロセスにする
  • 複数のプロセスを使用する場合は、それぞれのコンテナに分けてオーケストレーションツールによりコンテナを協調させる

軽量なベースイメージを使用する

  • Alpine OSという軽量なOSでイメージを作成する

.dockerignoreを使う

  • Dockerfileのビルド時に無視するファイルやディレクトリを指定する
  • .gitのようなコンテナ内に不要な情報、node_modulesのような上書きされると困るものを記載する

Build

キャッシュを意識する

  • DockerImageは各コマンド毎にキャッシュを作成する(中間レイヤー)
  • ビルド後にファイルに変更があった場合、変更直前のキャッシュからビルドを実行する

Multi-Stage Build

  • 複数のDockerImageを作成し、その中から特定のファイルを抽出して1つのDockerImageを作成する