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バケット等)
ポータビリティ(≒冪等性)
絶対ではない
冪等性を損ねる要素
- Kernelの違い
- アーキテクテャの違い
ARMアーキテクチャ向けのDockerコンテナイメージをWindows/Macでビルドする - ダイナミックリンクライブラリ
- 極力スタティックリンクを使う
コンテナの粒度
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でしか動かないツールを使う手段
- シェルスクリプト
- 負荷テスト