2016/04/21 Alpine Linux Meetup #1
軽量イメージ時代を生きるためのAlpine Linux20160421 Alpine Linux Meetup #1@stormcat24
View Slide
‣ @stormcat24‣ Akinori Yamada‣ CyberAgent, Inc.‣ Technical Engineer‣ DevOps‣ http://blog.stormcat.io‣ FRESH!
AlpineだけじゃなくDockerネタも多いです
-動機-
既にかなり置き換えてる
DockerHub現状‣ オフィシャルの有名どころは着々とAlpineベースに置き換えられている‣ タグは -alpine をつけて他のディストリビューションと差別化している‣ 非オフィシャルでも進んでいる。-alpine無しでalpineなものもある(Dockerfileとサイズで判断)
Alpineが選ばれる理由‣ めっちゃ小さい‣ ISOで83MB‣ 公式Dockerイメージ2MB‣ イメージは小さければ小さいほど価値を持つ‣ docker pull/push, Deploy時間短縮‣ オートスケールでの迅速なサービスイン
非Alpineなら‣ centos/debian/ubuntuベース‣ 慣れ親しんだパッケージマネージャ(yum/apt)‣ 大きくなりがち‣ scratchベース‣ amazon/amazon-ecs-agent(9MB)‣ 扱いは難しい
Alpine LinuxはDocker界の新機軸
その割には、我々は あまりにも Alpineを知らない
開催決定
-とりあえず触ってみる-
さくっと環境構築‣ VagrantでVirtualBoxにVM立てるのが楽‣ vagrant init maier/alpine-3.3.1-x86_64‣ vagrant up‣ vagrant ssh
単一バイナリ‣ 基本プログラムは、/bin/busybox(単一バイナリ)へのシンボリックリンク‣ 単一のバイナリに複数アプリケーションが含まれている‣ 例)ls -l は、事実上の /bin/busybox ls -l
bashなど無い‣ デフォルトシェルはash(組み込み系で有名)‣ bashはプリインストールされていない‣ bashが必要ならapk(Alpineのパッケージマネージャ)でインストールすると良い
apk‣ Alpineのパッケージマネージメントシステム‣ ある程度有名所は揃うが、バージョンが新鮮とは限らない‣ 欲しいバージョンはビルドする必要性
新鮮でない例(Nginx)$ apk search nginxnginx-1.8.1-r0collectd-nginx-5.5.0-r1nginx-lua-1.8.0-r5nginx-lua-doc-1.8.0-r5nginx-vim-1.8.1-r0※Alpine v3.3での結果。edgeでは1.9.14有り
apk 基本コマンド‣ apk update‣ apk add‣ apk del
apk update‣ リモートapkリポジトリから、最新のインデックスに更新する‣ yum update/apt-get update みたいなもの
apk add‣ パッケージを追加するコマンド‣ 1回で複数パッケージ指定可能‣ apk add bash zsh‣ バージョン指定、範囲指定‣ apk add ruby=2.2.4-r0‣ apk add 'nginx<1.8.2'
apk add —virtual‣ パッケージ群をひとまとめにして、別名をつける‣ apk add --virtual=build-dependencies build-base perl-dev‣ ビルドには必要だが、実行には不要な産業廃棄物を後からまとめて削除しやすい
apk del‣ パッケージを削除するコマンド‣ apk del ruby-dev‣ —virtualで別名を定義していれば、別名に定義されたパッケージを一括で削除できる‣ apk del build-dependencies
Alpine本番運用した話
█████FRESH!‣ 動画配信プラットフォーム‣ Amazon EC2 Container Service(ECS)‣ Microservices‣ Nginx/Go/Node/HAProxyコンテナ等‣ UbuntuベースからAlpineベースに移行‣ 今のところ特に問題なし
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が必要になってイメージがデブる
Nginx軽量化‣ Alpineに変更‣ HttpPerlModuleをやめた‣ entrykitを導入
entrykit‣ github.com/progrium/entrykit‣ docker runのタイミングで、設定ファイルのテンプレートに環境変数を埋め込んでレンダリングする仕組み
entrykit使用server {listen 80;server_name {{ var “SERVER_NAME" | default “www.example.com” }};charset utf-8;# hogehoge}※これはテンプレ nginx.conf.tmplserver {listen 80;server_name www.example.com;charset utf-8;# hogehoge}※runしたときの完成形 nginx.conf
Alpine化とモジュールの省力化はセットでやるのが重要
glibc問題‣ 素のAlpineイメージにはglibcがありません‣ CircleCI(Ubuntuベース)でビルドしたGoのバイナリをAlpineイメージにコピーして動かないとかで消耗する‣ frolvlad/alpine-glibc とかあります
ダイエット結果‣ Nginx: 20MB‣ Go: 40-60MB‣ Node: 45MB(アプリ入れると200MB。アプリのダイエットの余地あり)‣ HAProxy: 10MB
-まとめ-
言いたかったこと‣ apkが扱えるようになれば、Alpine Linuxは難しくはありません‣ Alpine化は軽量化の入り口にすぎない‣ モジュールを省いたりして、シンプルなイメージに保つことが重要‣ まあアルパインって名前がかわいいですよね
Thank you