入門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への接続情報や.gitnode_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