Edited at

Alpine Linux で軽量な Docker イメージを作る

More than 3 years have passed since last update.


どれくらい小さくなるのか

ハンズオンをするにも、携帯でテザリングするにも

これくらい小さければいける・・かもしれないレベル。


サイズ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 addapk --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 を指定してパッケージをインストールできますが

このオプションで仮の名前をつけてインストールしておけば、

後でそれらを仮の名前で一括削除できます。


--virtual

RUN apk add --no-cache --virtual .ruby-builddeps curl gcc make .. && \

curl ... && \
... && \
make install ... && \
apk del .ruby-builddeps

これで削除もれも防げるし、とても便利ですね!


apk del --purge の利用

パッケージを削除する際に --purge オプションを渡すことで、

関連する設定ファイルも合わせて削除することができます。


おまけ


参考文献


Alpine の読み方

アルプス(山脈)とかアルペン(スキー)とか日本語だと候補が複数あるんですが

発音記号を見るとアルパインな気がします。自信がないのでおもむろに Mac で


MacOSX

say alpine


を実行しましたが、やっぱりアルパインと聞こえる気がします。

たぶんアルパインなのでしょう・・

 





  1. DockerHub で見える、データ圧縮状態でのサイズ 



  2. 現在 Alpine のパッケージマネージャ apk で MySQL をインストールすると MariaDB が入る状態。オフィシャルの MySQL イメージが洗練され 完成度高すぎ なので、ここだけは 111MBで妥協してもいいと思ってます.. 



  3. バージョン 1.8 の Alpine 版なら、なんと 3MB です。また、SSL や RealIP を静的コンパイルした Nginx がほしければ、こんな感じ で作れます。 



  4. docker history というコマンドも便利 



  5. Go なら Linux 向けにビルドしたものを scratch に突っ込む 方法が最軽量。