入門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を作成する