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

  • 249
    いいね
  • 5
    コメント
この記事は最終更新日から1年以上が経過しています。

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

ハンズオンをするにも、携帯でテザリングするにも
これくらい小さければいける・・かもしれないレベル。

サイズ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 に突っ込む 方法が最軽量。