Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
407
Help us understand the problem. What is going on with this article?
@pottava

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

407
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
407
Help us understand the problem. What is going on with this article?