入門docker 復習(5)
プロダクションでの活用
設計
1コンテナ=1プロセス
- Dockerは1プロセスをフォアグラウンドで走らせるため、1コンテナ=1プロセスの粒度で設計する
- ただし、設計上1プロセスが難しい場合は1コンテナにつき1つの関心事にする
永続的なデータはマネージドサービスに任せる
- 永続的なステータスにより依存が発生した場合、Dockerの性能に影響を及ぼす
- ステートを持たない設計をする
セキュリティ
rootユーザーを使わない
- コンテナ内に侵入された時の影響を最小限にするため
- Docer Imageのデフォルトがrootユーザーのため注意が必要
USER
コマンドでユーザーを変更する
野良のDocker Imageをベースイメージにしない
- ユーザー製のイメージは過去に何度もマイニング(処理能力が使われる)や攻撃を受けているため
- ベースイメージは公式のものを使用する
ビルド時に機微情報を与えない
- ビルド時に秘密鍵やパスワードなどを与えない
- どうしても必要な場合は
--secret
や--ssh
オプションを使用してセキュアにビルドする - パスワードや接続情報は環境変数やVault(セキュリティフォルダ)へ格納する
ホストのファイルのマウントの仕方
- ホストのファイルをマウントする際は最小限の権限とパスで範囲を狭くする
- 特にdockerソケットはCIや監視でマウントを要求するソフトが増えてきている
- ソケットをマウントする場合はRead-Onlyでマウントする
.dockerignoreファイルを使う
- Dockerビルド時に無視するパスを記述するファイル
.env
などのDBへの接続情報や.git
やnode_modules
のようなビルドに不要なパスは無視することでビルドが高速かつイメージが軽量になる
デバッグ
- イメージの確認
docker images
ホスト上の全てのコンテナを確認
docker container ls -a
- 実行中のコンテナだけ確認
docker container
コンテナの停止
docker stop <コンテナID>
- 全コンテナの停止
docker stop $(docker ps -q)
コンテナの削除
docker rm <コンテナID>
- 全コンテナの削除
docker rm $(docker ps -q -a)
イメージの削除
docker rmi <イメージID>
- 全イメージの削除
docker rmi $(docker images -q)
コンテナにログインしてbashで操作(起動中のみ)
docker exec -it <コンテナID> bash
コンテナのログを確認
docker logs <コンテナID>
- 起動したプロセスの標準出力と標準エラーのログのため、ファイルに書き込まれるログは確認出来ない
停止したコンテナに入る
- 停止したコンテナから新しいイメージを作成する
docker commit <コンテナID> <新しいコンテナ名>
- 新しいコンテナにログインする
docker run -it exited-container bash
- 停止したコンテナから新しいイメージを作成する