Docker で Alpine Linux と apk (パッケージ管理ツール) を使ってみる

Alpine Linux という、Docker コンテナ向けの超軽量な Linux ディストリビューションを使ってみる。内部的には BusyBox を使って軽量化を実現している模様。

Docker を使って、Alpine Linux の最新版のイメージを落としてみる。

$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
8e402f1a9c57: Pull complete
Digest: sha256:644fcb1a676b5165371437feaa922943aaf7afcfa8bfee4472f6860aad1ef2a0
Status: Downloaded newer image for alpine:latest

$ docker images
REPOSITORY    TAG       IMAGE ID        CREATED       SIZE
alpine        latest    5cb3aa00f899    7 days ago    5.53MB

5.53MB とか軽すぎィ!

以下でシェルを起動。「Bash」はデフォルトでは入っていない。デフォルトは組み込み系に多い ash (Almquist Shell) というモノらしい。

$ docker run -it alpine sh

echo $PATH でコマンドが入っているパスを探した。

$$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

この内、実行可能ファイルがあるのは以下の4箇所。殆どは BusyBox へのシンボリックリンクになっていた。

alias でエイリアスを調べたが何もなし。

パッケージのインストールは apk コマンドで行う。

$$ apk list
WARNING: Ignoring APKINDEX.b89edf6e.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.737f7e01.tar.gz: No such file or directory

何かエラーが出ちゃったので apk update で修正。

$$ apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
v3.9.2-18-g2ddb597aa5 [http://dl-cdn.alpinelinux.org/alpine/v3.9/main]
v3.9.2-17-g62e588759e [http://dl-cdn.alpinelinux.org/alpine/v3.9/community]
OK: 9754 distinct packages available

9754?なんじゃこのパッケージ数は…。よく分からんけど進めてみる。

標準のシェルだと機能が少なくて辛いので Bash を入れてみる。apk add がインストールコマンド。

$$ apk add bash

# 以下で起動できる
$$ bash

# Docker コンテナ起動時に Bash で始めるならこんな感じ
$ docker exec -it 【Alpine Linux のコンテナ ID】 bash

Node.js とかもインストールできる。npm コマンドは別れているので一緒にインストールする。

$$ apk add nodejs npm

$$ node -e 'console.log("Node.js!")'
$$ npm -version

こんな感じ。なお、node:alpine という名前で Node.js 公式が Alpine Linux イメージを出してくれているので、インストールが面倒なら公式の Docker イメージを使うとよろし。


今回はココまで。apk を使えば主要なコマンドやツールはとりあえずインストールできるので、とにかくコンテナサイズを小さく保ちたい場合はベースイメージに使えると思う。