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 へのシンボリックリンクになっていた。
/usr/sbin/
/usr/bin/
/sbin/
/bin/
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
- 参考 : Alpine Linux入門 -内部構造とapkでパッケージインストール編- · tehepero note 2.0
- 参考 : Dockerやる前のAlpine Linux - YoshinoriN's Memento
Node.js とかもインストールできる。npm
コマンドは別れているので一緒にインストールする。
$$ apk add nodejs npm
$$ node -e 'console.log("Node.js!")'
$$ npm -version
こんな感じ。なお、node:alpine
という名前で Node.js 公式が Alpine Linux イメージを出してくれているので、インストールが面倒なら公式の Docker イメージを使うとよろし。
今回はココまで。apk を使えば主要なコマンドやツールはとりあえずインストールできるので、とにかくコンテナサイズを小さく保ちたい場合はベースイメージに使えると思う。