めも
Dockerの復習
Dockerコンテナ...Dockerイメージをもとに実行されるプロセス。特徴はポータビリティの高さ。(Dockerさえあれば良い)。ゲストOSのカーネルを利用したまま、namespaceや、cgroups(control groups)を用いた制御によって独立したOSのような環境を実現している。
cgroups...1つ以上のプロセスを含むグループに対して、**リソースの制限(CPUやメモリなど)**を行う仕組み。cgroupfsというファイルシステムを介して操作する。
Dockerコンテナの仕組み -namespace、cgroup、overlayfs-
namespace...namespace内のプロセスは他のnamespace内のプロセスとリソースが隔離されていて、プロセスごとに環境を構築することが可能。(独立したネットワーク・ファイルシステムの構築、ユーザー権限の制限など)
Docker内部で利用されているLinuxカーネルの機能 (namespace/cgroups) - Qiita
Dockerコンテナの仮想マシンとの比較
- 軽量
- 起動・停止が高速...仮想マシンはハイパーバイザー(仮想マシンの作成・実行をするソフトウェア)を用いてゲストOSを起動するが、コンテナはホストOSのカーネルを利用する
Dockerコンテナの設計上の注意
- 1コンテナ1プロセス...複数プロセスが存在すると、アプリケーション同士で干渉し合う可能性あり。Dockerコンテナは、アプリケーションの実行を容易にすることが目的の一つであるため、それに反する。
- Immutable Infrastructure(不変)なイメージにする
- 環境を変更する際は古い環境を廃棄して新しく作る...k8sを使ってたら勝手にそうなるので、k8sを使う上ではあまり考慮の必要はない。
- 一度作られた環境は変更されないことを徹底する...コンテナ起動後に環境を変更されないように設計する。(ライブラリのインストールなどは、できるだけ全てDockerfileに書く)
- 軽量なDockerイメージにする...pullする際の時間の短縮→サービス反映速度を向上。手法として、マルチステージビルド、キャッシュファイルの削除、diveといったイメージ調査ツールを用いるなどがある。
- プロセスの実行ユーザーの権限を最小化する...セキュリティリスクの軽減。プロダクションでは、判別できるように専用ユーザーを作成した方が良い。
Immutable Infrastructure...インフラを管理する手法の一つで「一度構築した本番環境には更新やパッチの提供などの変更を加えず稼働させる」という考え方。度重なる更新によるサーバー環境の複雑化や、それによるアプリケーション実行の不安定化を防ぐ。
公式のイメージにも、更新の滞っているものがあったり、脆弱性が潜んでいるものがある。脆弱性検出の必要。
→コンテナのセキュリティスキャンツール…Trivy, Clairなど