Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

-動機-

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

既にかなり置き換えてる

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Alpine Linuxは Docker界の新機軸

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

開催決定

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

新鮮でない例(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有り

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Alpine本番運用した話

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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が必要になってイメージがデブる

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

-まとめ-

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Thank you