会社でNginxのDockerfileを作ったので、記事を書こうと思ったものの書くことがあまりに多すぎて、カフェインとアルコール漬けの僕の脳みそでは一度で全部書ききれないので、まずベースに使用したAlpine Linuxについて書きます。

上司が「DockerならAlpine Linuxですよ!アルパインアルパイン!」というので、Dockerイメージを作るのにAlpine Linuxなるものをベースにすることにしました。
「ただでさえDocker知らないのにAlpine Linuxとかいうディストリビューションだされてますますわけ解んね~よ」と思ったし、いろんなことを同時に覚えないといけないというプレッシャーからかなり精神的に消耗したのですが、結論から書くと別に難しくないので「Alpine Linuxとかしらねえよ」って人も使ってみたらいいと思います。

ちなみに、この記事に書いてあることは大体以下の記事で記述されてます。

Alpine Linux入門 -内部構造とapkでパッケージインストール編-

既に書かれていることを書いてるので、ネットにゴミをばらまくような気がして気が引けるのですが、まあ、私のブログだし。
ブログって日記だし、自分がこういうのやりましたってのを残すために書いてるので、要するに自分のための記事です。

Alpine Linuxとは


組み込み系でよく使われているBusyBoxをベースにしたLinuxディストリビューションです。BusyBoxの解説はちょっと古いけど、こちらが詳しい。このBusyBoxにapkというパッケージマネージャーを備えたものがAlpine Linuxだと思えばいい(と思います)

Docker界隈ではイメージを軽量にすることがトレンドらしいので、そのために軽量なAlpine Linuxを使うという流れになってきているようです。
なお、私は実運用には至ってないので、軽量化がどれほど大事かはまだよくわかってないです。

お前のDockerイメージはまだ重い💢💢💢

Dockerの公式イメージファイルもUbuntuからAlpine Linuxになっていくようです。
ちなみに、今回NginxのDockerfileを作りましたが、 Nginxの公式イメージはAlpine Linuxのものも提供していました。
最低限の機能しかないのでbashがなかったりllコマンド打ってもエイリアスが設定されてないので「そんなのね~よ」とか言われるので作業するのにちょっとメンドクサイ感がありますが、そうすることで軽量になってます。

apk パッケージマネージャー


とりあえずupdateadddelとそれらに関するオプションを覚えておけばよいです。
小言としてはaddでなくてinstalldelでなくてremoveにしておいてほしかった感がある。

パッケージの一覧はこちら

update

これやらないとaddできないので、まず初めにやること。

add

要するにapt-getyumでいうinstallにあたる。
3.3以降はオプションで--no-cacheというオプションが使えるので、これを使うとインストール後の不要なファイルを削除できるので楽でよい。Dockerのイメージは軽くすることが重要らしいので--no-cacheは覚えておくとよいです。

もう一つ、重要なオプションが--vertualaddの際に、インストールするパッケージをグルーピングできます。
これにより、後でグルーピングしたパッケージをまとめて削除できます。要するに削除漏れを防ぐことができる。

くどいけど、Dockerだとイメージを軽量化することが大事(らしい)ので、インストール後にビルドだけに必要なパッケージは削除してしまおうということらしい。
(※Alpine Linuxのapk addでインストールされるパッケージは最新ではないことが多いので、コードからビルドしてインストールするのが主流(?)のようです)

実際に実行するとこんな感じ。

1
2
3
4
5
6
7
8
9
10
11
12
/ # apk --no-cache add --virtual build-dependencies curl build-base
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/community/x86_64/APKINDEX.tar.gz
(1/24) Installing ca-certificates (20160104-r4)
(2/24) Installing libssh2 (1.7.0-r0)
(3/24) Installing libcurl (7.50.3-r0)
...
(23/24) Installing build-base (0.4-r1)
(24/24) Installing build-dependencies (0)
Executing busybox-1.24.2-r11.trigger
Executing ca-certificates-20160104-r4.trigger
OK: 158 MiB in 35 packages

上記の例だとcurlbuild-basebuild-dependenciesという名前でグルーピングしてインストールしている。

バージョン指定

よくある-v 1.0.0とかじゃなくて=で指定する。
しかもパッケージ名の後ろに-r0とかついてるので注意。

こんな感じ

1
apk add nginx=1.10.1-r1

del

インストールしたパッケージの削除。
要するにapt-getyumでいうremoveにあたる。
delの時に大事なのが--purgeオプションを指定することで関連するパッケージの設定ファイルも削除してくれる、

実際に実行するとこんな感じ。さっきのadd--virtualオプションで指定したbuild-dependenciesというグループをまとめて削除してます。

1
2
3
4
5
6
7
8
9
10
11
12
/ # apk del --purge build-dependencies
WARNING: Ignoring APKINDEX.167438ca.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.a2e6dac0.tar.gz: No such file or directory
(1/20) Purging build-dependencies (0)
(2/20) Purging curl (7.50.3-r0)
(3/20) Purging build-base (0.4-r1)
...
(18/20) Purging mpfr3 (3.1.2-r0)
(19/20) Purging gmp (6.1.0-r0)
(20/20) Purging libgomp (5.3.0-r0)
Executing busybox-1.24.2-r11.trigger
OK: 9 MiB in 20 packages

まとめ


とりあえず、Docker向けにAlpine Linux使うにはapkパッケージマネージャーだけ覚えればよいので大して難しくないです。
まあ、使い始めたばかりなので断言できないですけど…

追記


2016/10/9

1週間ほど使ってみて、デフォルトで入ってるパッケージがほとんどないので、事あるごとに追加でインストールする必要があるってのがわかった。
加えて、パッケージ名が他のディストリビューションと微妙に違ったりで、初めてDockerやるならとりあえずUbuntuあたりでやるのでもいいのではないかと思った。

私は使い始めたのでこのまま使うけども…