どれくらい小さくなるのか
ハンズオンをするにも、携帯でテザリングするにも
これくらい小さければいける・・かもしれないレベル。
サイズ1 を比較してみる
イメージ | version | Official | Alpine版 | Dockerfile |
---|---|---|---|---|
Golang | 1.6.2 | 254MB | 72MB | golang:1.6.2-alpine (Official) |
Java | 8 | 243MB | 52MB | java:8-alpine (Official) |
Clojure | Leiningen 2.6.1 | 257MB | 71MB | clojure:alpine (Official) |
Maven | 3.3 | 252MB | 51MB | pottava/maven:3.3 |
Gradle | 2.11 | - | 89MB | pottava/gradle:2 |
PlayFramework | 1.4 | - | 130MB | pottava/play:1.4 |
AWS-DynamoDB | - | - | 103MB | pottava/aws-dynamodb-local |
MySQL | 5.6 | 111MB | - | なし2 |
Nginx | 1.11 3 | 71MB | 19MB | nginx:1.11-alpine (Official) |
Node.js | 6.3 | 256MB | 16MB | pottava/nodejs:6.3 |
PHP + Apache | 5.6 + 2.4 | 152MB | 28MB | php:5.6-alpine (Official) |
PostgreSQL | 9.4 | 100MB | 9MB | kiasaki/alpine-postgres:9.4 |
Python | 2.7 | 261MB | 19MB | python:2.7-alpine (Official) |
AWS-CLI | 1.10 | - | 27MB | pottava/awscli:1.10 |
Sphinx | 1.4 | - | 38MB | pottava/sphinx:1.4 |
Redis | 3.0 | 62MB | 5MB | redis:3.0-alpine (Official) |
Ruby | 2.3 | 276MB | 40MB | ruby:2.3-alpine (Official) |
オフィシャルでない Alpine イメージを使うなら
上の表の通り、最近はオフィシャルでも Alpine 版があったりしますが
なければ、サイズの小さなサードパーティ製でも全然よいと思います。
選ぶなら、最低限 Automated Build
で作成されており
Dockerfile から操作履歴が明瞭なもの4 がよさそうです。
ADD / COPY をしているものは GitHub に行けば中身を確かめることもできます。
もしくは、まるっとコピーして自分でイメージを作るのも手です。
アプリのベースイメージに Alpine
いずれにせよ、特定 OS のシェルを直接叩くようなアプリでない限り、
Alpine はとてもいい選択肢と言えそうです。
Golang 製でもなければ5、Alpine でよさそう。
参考資料でサイバーエージェント山田さんが 書かれている ように
重いイメージはほんとにいいことがありません。
軽くしましょう!
どうやって作るのか
基本はベストプラクティス
効率的に安全な Dockerfile を作るには にもチラっと書きましたが
せっかくベースイメージで Alpine を使っても、Dockerfile がイケてないと台無しです。
以下あたりには注意しましょう!
- レイヤの数を最小に(&&でのコマンドチェーンなどを駆使)
- 同一レイヤー上で、最終的に不要なパッケージ・ソースコードは削除する
- ADD / COPY するなら
.dockerignore
も書いておく
apk --update add
と apk --no-cache add
Alpine Linux は 3.3 から apk で --no-cache
というオプションが使えます。
従来は --update add
でインストールした後に rm -rf /var/cache/apk/*
で
不要なゴミファイルを削除していたようですが、いまや --no-cache
で OK です。
apk add --virtual
の利用
apk では --virtual
を指定してパッケージをインストールできますが
このオプションで仮の名前をつけてインストールしておけば、
後でそれらを仮の名前で一括削除できます。
RUN apk add --no-cache --virtual .ruby-builddeps curl gcc make .. && \
curl ... && \
... && \
make install ... && \
apk del .ruby-builddeps
これで削除もれも防げるし、とても便利ですね!
apk del --purge
の利用
パッケージを削除する際に --purge
オプションを渡すことで、
関連する設定ファイルも合わせて削除することができます。
おまけ
参考文献
-
お前のDockerイメージはまだ重い💢💢💢
Alpine Linux についても触れられていますが、とてもいい資料!
-
Alpine Linux package management
Comparison with other distros
ちょろっと目を通しておくといいかもしれない。
Alpine の読み方
アルプス(山脈)とかアルペン(スキー)とか日本語だと候補が複数あるんですが
発音記号を見るとアルパインな気がします。自信がないのでおもむろに Mac で
say alpine
を実行しましたが、やっぱりアルパインと聞こえる気がします。
たぶんアルパインなのでしょう・・
-
DockerHub で見える、データ圧縮状態でのサイズ ↩
-
現在 Alpine のパッケージマネージャ apk で MySQL をインストールすると MariaDB が入る状態。オフィシャルの MySQL イメージが洗練され 完成度高すぎ なので、ここだけは 111MBで妥協してもいいと思ってます.. ↩
-
バージョン 1.8 の Alpine 版なら、なんと 3MB です。また、SSL や RealIP を静的コンパイルした Nginx がほしければ、こんな感じ で作れます。 ↩
-
docker history
というコマンドも便利 ↩ -
Go なら Linux 向けにビルドしたものを scratch に突っ込む 方法が最軽量。 ↩