背景
Dockerイメージの軽量化の話に出てくるAlpine Linuxについて気になったので調べてみました。
Alpine Linuxとは
組み込み系でよく使われているBusyBoxとmuslをベースにしたLinuxディストリビューション。
BusyBoxについては下記がまとまっていて見やすかったです。
http://monoist.atmarkit.co.jp/mn/articles/0802/04/news114.html
Docker界隈でよく見かける言葉ですが特にDocker用とかそういったものでは無い。
BusyBox + パッケージマネージャ(apk)がAlpineLinuxの概要とのことです。
公式サイトは下記です。
https://alpinelinux.org/
(GitHub) https://github.com/alpinelinux
Alpineの特徴に軽量とありますがどれくらい軽量化というと下記比較を見れば一目瞭然
CentOS 約4GB
Ubuntu 約700MB
Alpine 約100MB
ファイル構成
Alpine Linuxがどのような構成になっているかをdockerを使ってサクッと確認してみます。
$ docker container run -it alpine /bin/ash
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
4fe2ade4980c: Already exists
Digest: sha256:621c2f39f8133acb8e64023a94dbdf0d5ca81896102b9e57c0dc184cadaf5528
Status: Downloaded newer image for alpine:latest
/ #
/ # ls -l /
total 52
drwxr-xr-x 2 root root 4096 Sep 11 20:23 bin
drwxr-xr-x 5 root root 360 Dec 11 06:29 dev
drwxr-xr-x 1 root root 4096 Dec 11 06:29 etc
drwxr-xr-x 2 root root 4096 Sep 11 20:23 home
drwxr-xr-x 5 root root 4096 Sep 11 20:23 lib
drwxr-xr-x 5 root root 4096 Sep 11 20:23 media
drwxr-xr-x 2 root root 4096 Sep 11 20:23 mnt
dr-xr-xr-x 303 root root 0 Dec 11 06:29 proc
drwx------ 1 root root 4096 Dec 11 06:30 root
drwxr-xr-x 2 root root 4096 Sep 11 20:23 run
drwxr-xr-x 2 root root 4096 Sep 11 20:23 sbin
drwxr-xr-x 2 root root 4096 Sep 11 20:23 srv
dr-xr-xr-x 13 root root 0 Dec 11 06:29 sys
drwxrwxrwt 2 root root 4096 Sep 11 20:23 tmp
drwxr-xr-x 7 root root 4096 Sep 11 20:23 usr
drwxr-xr-x 11 root root 4096 Sep 11 20:23 var
FHSに準拠して作られている事がわかりますね。
(当たり前といえば当たり前)
/ # ls -l /bin/l*
lrwxrwxrwx 1 root root 12 Sep 11 20:23 /bin/link -> /bin/busybox
lrwxrwxrwx 1 root root 12 Sep 11 20:23 /bin/linux32 -> /bin/busybox
lrwxrwxrwx 1 root root 12 Sep 11 20:23 /bin/linux64 -> /bin/busybox
lrwxrwxrwx 1 root root 12 Sep 11 20:23 /bin/ln -> /bin/busybox
lrwxrwxrwx 1 root root 12 Sep 11 20:23 /bin/login -> /bin/busybox
lrwxrwxrwx 1 root root 12 Sep 11 20:23 /bin/ls -> /bin/busybox
lrwxrwxrwx 1 root root 12 Sep 11 20:23 /bin/lzop -> /bin/busybox
また、/bin配下はすべて/bin/busyboxへのシンボリックリンクとなっている。
busyboxとは何かというと、Alpine LinuxのベースとなっているLinuxのディストリビューション
標準UNIXコマンドで重要な多数のプログラムを単一の実行ファイルに「詰め込んで」提供する、
特殊な方式のプログラムです。詳細は下記wikiをご参照ください。
https://ja.wikipedia.org/wiki/BusyBox
busyboxのサイズもとても小さい
~ # ls -lh /bin/busybox
-rwxr-xr-x 1 root root 777.6K Jul 17 15:22 /bin/busybox
デフォルトで設定されている環境変数を見るとミニマムさに驚きです。
ちなみにbashはデフォルトでないので必要な方はインストールが別途必要です。
ashというシェルが採用されています。
~ # env
HOSTNAME=de9c296717d8
SHLVL=1
HOME=/root
OLDPWD=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
パッケージマネージャ「apk」
パッケージやアプリケーションのインストールにはapkを使用します。
apt-getやらyumやら色々使ってると正直ごっちゃになりますが、Alpineではさらに
別のパッケージマネージャを利用します。
とりあえずupdateとaddとdelとそれらに関するオプションを覚えておけば事は足りそう。
apk help
usageが見たければここらへん。
まあよくあるパッケージマネージャーですね。
特筆して思うことはなし。
$ sudo apk --help
apk-tools 2.10.1, compiled for x86_64.
Installing and removing packages:
add Add PACKAGEs to 'world' and install (or upgrade) them, while ensuring that all dependencies are met
del Remove PACKAGEs from 'world' and uninstall them
System maintenance:
fix Repair package or upgrade it without modifying main dependencies
update Update repository indexes from all remote repositories
upgrade Upgrade currently installed packages to match repositories
cache Download missing PACKAGEs to cache and/or delete unneeded files from cache
Querying information about packages:
info Give detailed information about PACKAGEs or repositories
list List packages by PATTERN and other criteria
dot Generate graphviz graphs
policy Show repository policy for packages
Repository maintenance:
index Create repository index file from FILEs
fetch Download PACKAGEs from global repositories to a local directory
verify Verify package integrity and signature
manifest Show checksums of package contents
Use apk <command> --help for command-specific help.
Use apk --help --verbose for a full command listing.
This apk has coffee making abilities.
インストール済みパッケージの参照 info
初期段階のパッケージの少なさにはほんとに驚きますね。
$ apk info
WARNING: Ignoring APKINDEX.adfa7ceb.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.efaa1f73.tar.gz: No such file or directory
musl
busybox
alpine-baselayout
alpine-keys
libressl2.7-libcrypto
libressl2.7-libssl
libressl2.7-libtls
ssl_client
zlib
apk-tools
scanelf
musl-utils
libc-utils
パッケージアップデート update
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
v3.8.1-142-g179c136670 [http://dl-cdn.alpinelinux.org/alpine/v3.8/main]
v3.8.1-142-g179c136670 [http://dl-cdn.alpinelinux.org/alpine/v3.8/community]
OK: 9548 distinct packages available
パッケージ検索 search
vimを使いたいので検索対象としています。
neovimなどもあるようですがとりあえずデフォルトでいいと思うのでそちらを入れる
/ # apk search vim
charybdis-3.5.5-r4
neovim-doc-0.3.0-r0
vim-8.1.0115-r0
faenza-icon-theme-vim-1.3.1-r4
notmuch-vim-0.25.3-r1
docker-vim-18.06.1-r0
graphviz-2.40.1-r1
neovim-0.3.0-r0
vim-doc-8.1.0115-r0
vim-editorconfig-0_git20170721-r0
py-jinja2-vim-2.9.6-r0
vimdiff-8.1.0115-r0
asciidoc-vim-8.6.10-r0
neovim-lang-0.3.0-r0
nginx-vim-1.14.1-r0
msmtp-vim-1.6.6-r3
protobuf-vim-3.5.2-r0
icinga2-vim-2.8.4-r0
gst-plugins-base-1.14.0-r1
mercurial-vim-4.6.1-r0
インストール add
上記で検索したvimをインストールしています。
=でバージョン指定もできます。
個人的にはaddというサブコマンドよりもinstallとかにしてくれたほうが覚えやすかった。。。
/ # apk add vim
(1/5) Installing lua5.3-libs (5.3.5-r1)
(2/5) Installing ncurses-terminfo-base (6.1_p20180818-r1)
(3/5) Installing ncurses-terminfo (6.1_p20180818-r1)
(4/5) Installing ncurses-libs (6.1_p20180818-r1)
(5/5) Installing vim (8.1.0115-r0)
Executing busybox-1.28.4-r1.trigger
OK: 39 MiB in 18 packages
/ # ls -l /usr/bin/vim
-rwxr-xr-x 1 root root 2193672 Jun 25 15:52 /usr/bin/vim
パッケージ削除 del
パッケージ削除はdelを使用する。
/ # apk del vim
(1/5) Purging vim (8.1.0115-r0)
(2/5) Purging lua5.3-libs (5.3.5-r1)
(3/5) Purging ncurses-libs (6.1_p20180818-r1)
(4/5) Purging ncurses-terminfo (6.1_p20180818-r1)
(5/5) Purging ncurses-terminfo-base (6.1_p20180818-r1)
Executing busybox-1.28.4-r1.trigger
OK: 4 MiB in 13 packages
ちなみにキャッシュは/var/cache/apk配下に設置されるので不要であれば削除しましょう
/ # ls -l /var/cache/apk/
total 1252
-rw-r--r-- 1 root root 752920 Dec 11 06:50 APKINDEX.adfa7ceb.tar.gz
-rw-r--r-- 1 root root 525738 Dec 11 06:50 APKINDEX.efaa1f73.tar.gz
また、リポジトリは下記ファイルへ追記することで追加する事ができます。
/ # cat /etc/apk/repositories
http://dl-cdn.alpinelinux.org/alpine/v3.8/main
http://dl-cdn.alpinelinux.org/alpine/v3.8/community
まとめ
DockerのイメージにAlpineをつかう際に何も知らずにつかうとハマるらしい
Alpineの特性を抑えておく必要があるとのことなので少しでも知れたので良かったと思いました。
VirtualBoxでAlpine Linuxを構築してみるとかもいいのかなと思いました。
ちなみにashは使いにくいと思ってしまったので速攻でbashをインストールして遊んでみてます。
ベストな使い方的には正しくなさそうです。
/ # apk add bash
(1/5) Installing ncurses-terminfo-base (6.1_p20180818-r1)
(2/5) Installing ncurses-terminfo (6.1_p20180818-r1)
(3/5) Installing ncurses-libs (6.1_p20180818-r1)
(4/5) Installing readline (7.0.003-r0)
(5/5) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
Executing busybox-1.28.4-r1.trigger
OK: 13 MiB in 18 packages
/ # bash
bash-4.4#
参考リンク
◼ https://blog.stormcat.io/post/entry/alpine-entry-apk/
◼ https://kakakakakku.hatenablog.com/entry/2016/04/25/223909