$30 off During Our Annual Pro Sale. View Details »

軽量イメージ時代を 生きるためのAlpine Linux

軽量イメージ時代を 生きるためのAlpine Linux

2016/04/21 Alpine Linux Meetup #1

stormcat24

April 21, 2016
Tweet

More Decks by stormcat24

Other Decks in Programming

Transcript

  1. 軽量イメージ時代を
    生きるためのAlpine Linux
    20160421 Alpine Linux Meetup #1
    @stormcat24

    View Slide

  2. ‣ @stormcat24
    ‣ Akinori Yamada
    ‣ CyberAgent, Inc.
    ‣ Technical Engineer
    ‣ DevOps
    ‣ http://blog.stormcat.io
    ‣ ‭‭‭‭‭FRESH!

    View Slide

  3. Alpineだけじゃなく
    Dockerネタも多いです

    View Slide

  4. -動機-

    View Slide

  5. View Slide

  6. 既にかなり置き換えてる

    View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. DockerHub現状
    ‣ オフィシャルの有名どころは着々とAlpineベース
    に置き換えられている
    ‣ タグは -alpine をつけて他のディストリビューショ
    ンと差別化している
    ‣ 非オフィシャルでも進んでいる。-alpine無しで
    alpineなものもある(Dockerfileとサイズで判断)

    View Slide

  11. Alpineが選ばれる理由
    ‣ めっちゃ小さい
    ‣ ISOで83MB
    ‣ 公式Dockerイメージ2MB
    ‣ イメージは小さければ小さいほど価値を持つ
    ‣ docker pull/push, Deploy時間短縮
    ‣ オートスケールでの迅速なサービスイン

    View Slide

  12. 非Alpineなら
    ‣ centos/debian/ubuntuベース
    ‣ 慣れ親しんだパッケージマネージャ(yum/apt)
    ‣ 大きくなりがち
    ‣ scratchベース
    ‣ amazon/amazon-ecs-agent(9MB)
    ‣ 扱いは難しい

    View Slide

  13. Alpine Linuxは
    Docker界の新機軸

    View Slide

  14. その割には、我々は
      あまりにも
      Alpineを知らない

    View Slide

  15. 開催決定

    View Slide

  16. -とりあえず触ってみる-

    View Slide

  17. さくっと環境構築
    ‣ VagrantでVirtualBoxにVM立てるのが楽
    ‣ vagrant init maier/alpine-3.3.1-x86_64
    ‣ vagrant up
    ‣ vagrant ssh

    View Slide

  18. 単一バイナリ
    ‣ 基本プログラムは、/bin/busybox(単一バイナ
    リ)へのシンボリックリンク
    ‣ 単一のバイナリに複数アプリケーションが含まれて
    いる
    ‣ 例)ls -l は、事実上の /bin/busybox ls -l

    View Slide

  19. bashなど無い
    ‣ デフォルトシェルはash(組み込み系で有名)
    ‣ bashはプリインストールされていない
    ‣ bashが必要ならapk(Alpineのパッケージマネー
    ジャ)でインストールすると良い

    View Slide

  20. apk
    ‣ Alpineのパッケージマネージメントシステム
    ‣ ある程度有名所は揃うが、バージョンが新鮮とは限
    らない
    ‣ 欲しいバージョンはビルドする必要性

    View Slide

  21. 新鮮でない例(Nginx)
    $ apk search nginx
    nginx-1.8.1-r0
    collectd-nginx-5.5.0-r1
    nginx-lua-1.8.0-r5
    nginx-lua-doc-1.8.0-r5
    nginx-vim-1.8.1-r0
    ※Alpine v3.3での結果。edgeでは1.9.14有り

    View Slide

  22. apk 基本コマンド
    ‣ apk update
    ‣ apk add
    ‣ apk del

    View Slide

  23. apk update
    ‣ リモートapkリポジトリから、最新のインデックス
    に更新する
    ‣ yum update/apt-get update みたいなもの

    View Slide

  24. apk add
    ‣ パッケージを追加するコマンド
    ‣ 1回で複数パッケージ指定可能
    ‣ apk add bash zsh
    ‣ バージョン指定、範囲指定
    ‣ apk add ruby=2.2.4-r0
    ‣ apk add 'nginx<1.8.2'

    View Slide

  25. apk add —virtual
    ‣ パッケージ群をひとまとめにして、別名をつける
    ‣ apk add --virtual=build-dependencies build-
    base perl-dev
    ‣ ビルドには必要だが、実行には不要な産業廃棄物を
    後からまとめて削除しやすい

    View Slide

  26. apk del
    ‣ パッケージを削除するコマンド
    ‣ apk del ruby-dev
    ‣ —virtualで別名を定義していれば、別名に定義さ
    れたパッケージを一括で削除できる
    ‣ apk del build-dependencies

    View Slide

  27. Alpine本番運用した話

    View Slide

  28. █████FRESH!
    ‣ 動画配信プラットフォーム
    ‣ Amazon EC2 Container Service(ECS)
    ‣ Microservices
    ‣ Nginx/Go/Node/HAProxyコンテナ等
    ‣ UbuntuベースからAlpineベースに移行
    ‣ 今のところ特に問題なし

    View Slide

  29. Nginx(Ubuntu時代)
    ‣ confに環境変数埋め込むために、
    HttpPerlModule利用
    env SERVER_NAME;
    http {
    perl_set $env_server_name 'sub { return $ENV{“SERVER_NAME"}; }';
    }
    server {
    listen 80;
    server_name $env_server_name;
    charset utf-8;
    # hogehoge
    }
    ※perlが必要になってイメージがデブる

    View Slide

  30. Nginx軽量化
    ‣ Alpineに変更
    ‣ HttpPerlModuleをやめた
    ‣ entrykitを導入

    View Slide

  31. entrykit
    ‣ github.com/progrium/entrykit
    ‣ docker runのタイミングで、設定ファイルのテン
    プレートに環境変数を埋め込んでレンダリングする
    仕組み

    View Slide

  32. entrykit使用
    server {
    listen 80;
    server_name {{ var “SERVER_NAME" | default “www.example.com” }};
    charset utf-8;
    # hogehoge
    }
    ※これはテンプレ nginx.conf.tmpl
    server {
    listen 80;
    server_name www.example.com;
    charset utf-8;
    # hogehoge
    }
    ※runしたときの完成形 nginx.conf

    View Slide

  33. Alpine化と
    モジュールの省力化は
    セットでやるのが重要

    View Slide

  34. glibc問題
    ‣ 素のAlpineイメージにはglibcがありません
    ‣ CircleCI(Ubuntuベース)でビルドしたGoのバイ
    ナリをAlpineイメージにコピーして動かないとか
    で消耗する
    ‣ frolvlad/alpine-glibc とかあります

    View Slide

  35. ダイエット結果
    ‣ Nginx: 20MB
    ‣ Go: 40-60MB
    ‣ Node: 45MB(アプリ入れると200MB。アプリの
    ダイエットの余地あり)
    ‣ HAProxy: 10MB

    View Slide

  36. -まとめ-

    View Slide

  37. 言いたかったこと
    ‣ apkが扱えるようになれば、Alpine Linuxは難しく
    はありません
    ‣ Alpine化は軽量化の入り口にすぎない
    ‣ モジュールを省いたりして、シンプルなイメージに
    保つことが重要
    ‣ まあアルパインって名前がかわいいですよね 

    View Slide

  38. Thank you

    View Slide