LoginSignup
3
0

More than 3 years have passed since last update.

コンテナ設計方針をまとめてみた

Last updated at Posted at 2020-05-26

Docker化にあたって

全てDocker化できるわけではない

  • ステートレスなものは向いている
    • コンテナはステートレス
  • 極力手作業なしの形で実装する

環境変数を活用する

アプリケーションの挙動を環境変数で制御する

手法
- 実引数
- 設定ファイル
- 設定ファイルに環境変数を埋め込む

永続化データの扱い

  • Data Volumeとしてホストと共有する
  • Data Volumeコンテナとして独立させる

セキュリティ

  • OFFICIALイメージを使う
  • Docker Bench for Securityでチェックを行う
  • 脆弱性が混入する恐れがあるのでdokerfileにはADDは使わない

    • COPY推奨
    • ADDを使うならチェックサムを併用する
  • 適切なアクセス制御を設定する

    • rootログイン禁止
    • ACLを設定する
    • VPNを併用する
  • Dockerデーモンにアクセスできることになるので、/var/run/docker.sockを共有しない

  • アプリケーション実行ユーザを用意し、rootユーザのままで実行しない

機密情報の扱い

  • 環境変数(要暗号化)
  • 外部から(暗号化S3バケット等)

ポータビリティ(≒冪等性)

絶対ではない

冪等性を損ねる要素

コンテナの粒度

1コンテナ = 1関心事

  • 1コンテナ=1プロセスではうまくいかないことも

  • 1つのロール or 1つのドメインに収まる粒度で

より軽いコンテナを

コンテナが重いことの弊害

  • オートスケールでのサービスインまで時間がかかる

  • ビルドに時間がかかる

  • プッシュに時間がかかる

  • ホストへにデプロイするのに時間がかかる

  • ディスク容量を無駄に消費する

  • CIに要する時間が増加する

→ 塵も積もれば、生産性が低下する

軽量ベースイメージ

  • scratch

    • 機能が限定的すぎる
  • BusyBox

    • 標準Cライブラリ別にイメージが作られている
    • パッケージマネージャなし
  • Alpine Linux

    • デファクトスタンダード
  • dlstroless

コンテナサイズの削減手法

  • アプリケーションのサイズを削減する

    • 不要ファイルの削除
    • 不要プログラムの削除
    • 依存ライブラリの削減
    • web asset(主に画像)のサイズ削減
  • .dockerignoreを定義する

  • Doker build時のレイヤ構造を削減する

    • RUNで個別に実行する → "&&"で結合して実行する

      FROM alpine:xx.yy
      RUN apk add --no-cache wget 
      RUN wget https:// hoge.com/fuga.tgz
      RUN tar -xvzf fuga.tgz
      RUN rm fuga.tgz
      RUN mv fuga /bin/fuga
      RUN chmod +x /bin/fuga
      RUN fuga --symlink
      

      FROM alpine:xx.yy
      RUN apk add --no-cache wget &&\
        wget https:// hoge.com/fuga.tgz &&\
        tar -xvzf fuga.tgz &&\
        rm fuga.tgz &&\
        mv fuga /bin/fuga &&\
        chmod +x /bin/fuga &&\
        fuga --symlink
      

      可読性とトレードオフになる

    • multi-stage builds

      • ビルド用コンテナと実行コンテナを分離する
      • ビルド用コンテナで制作したファイルは実行コンテナにコピーし、ビルド用コンテナは破棄される
        = ビルド用にのみ必要なツールをインストールするレイヤは、実行コンテナに存在しなくてよい
      FROM golang:xx AS build
      WORKDIR /
      COPY ./go/src/hoge.com/fuga/piyo
      RUN go get github.com/go-sql-driver/mysql
      RUN go get hoge.in/gorp.v1
      RUN cd /go/src/hoge.com/fuga/piyo && go build -o bin/piyo cmd/main.go
      
      FROM alpine:yy
      COPY --from = build /go/src/hoge.com/fuga/fuga/bin/piyo /usr/local/bin/
      CMD ["piyo"]
      

本番環境適用以外のコンテナ活用法

  • 開発環境の統一・共有
  • CLIの利用
    • Win・MacでLinuxでしか動かないツールを使う手段
  • シェルスクリプト
  • 負荷テスト

参考

Docker/Kubernetes 実践コンテナ開発入門

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0