Dockerベースイメージの特徴と比較・選び方

個人的にベースイメージとしての利用を検討したことがあるDockerイメージについて、それぞれの特徴を比較して選ぶために調べたことをまとめます。

## TL;DR;

OS・イメージ毎に以下の点を考慮して、総合的に決める。

## 評価軸

* イメージの生い立ち
  * 誰がどのようなフローで作ったイメージか
* セキュリティ
  * 不要なパッケージの多さ、減らしやすさ
     * 基本的には不要パッケージが少ないほど潜在的なAttack Surfaceが減る
  * 脆弱性があることを検知できるか
  * 脆弱性対応状況が公開されているか
  * 何年セキュリティパッチが受けられるか
* Dockerイメージのサイズ
  * 最小サイズ
* アプリの実行環境を整えるまでに必要な手数
  * パッケージマネージャでインストールできるものの多さ、新しさ
* (場合によっては)有償サポートが受けられるか
* 開発者・運用者のそのOSに対する習熟度
  * 企業なら、既に運用しているOSがあれば

## 評価例(人や企業によらない部分のみ)

### CentOS

* 脆弱性対応状況が公開されているか
  * [RedHat Security Data](https://www.redhat.com/security/data/metrics)
* (場合によっては)有償サポートが受けられるか
  * [Rogue Wave社が商用サポートを行っている?](http://www.roguewave.com/products-services/open-source-support/centos-linux-support)

#### 公式centosイメージ

DockerHub: https://hub.docker.com/_/centos/
GitHub: https://github.com/CentOS/sig-cloud-instance-images

* CentOS Projectによってメンテされている
* Docker Security Scanningで脆弱性情報を閲覧可能 https://hub.docker.com/r/library/centos/tags/

### Debian

* 脆弱性対応状況が公開されているか
  * [Debian Security Bug Tracker](https://security-tracker.debian.org/tracker)
* (場合によっては)有償サポートが受けられるか
  * 一応（失礼)[各国に商用サポートを行っている方がいるらしい](https://www.debian.org/consultants/)が・・・

#### Docker公式debianイメージ

DockerHub: https://hub.docker.com/_/debian/
GitHub: https://github.com/tianon/docker-brew-debian

* tianonさんとDebian開発者のpaultagさんによりメンテされている
  * tianonさん(Tianon Graviさん)は、InfoSiftr社のSVP of Operations
  * tianonさんはDocker公式ubuntuイメージのメンテナでもある
* Docker Security Scanningで脆弱性情報を閲覧可能 https://hub.docker.com/r/library/debian/tags/

#### minideb

https://github.com/bitnami/charts

* Bitnami社がメンテしている
* Debianからコンテナに不要なEssentialパッケージをいくつか削除したもの
* 「aptが使える最小のコンテナイメージ」を目指している

### Ubuntu

* 脆弱性の存在や対応状況が公開されているか?
  * [Ubuntu CVE Tracker](http://people.canonical.com/~ubuntu-security/cve/)
  * [Ubuntu security notices](http://www.ubuntu.com/usn/)
* (場合によっては)有償サポートが受けられるか
  * [CanonicalによるUbuntu Advantage](http://www.ubuntu.com/management)

#### Docker公式ubuntuイメージ

DockerHub: https://hub.docker.com/_/ubuntu/

* イメージの生い立ち
  * Ubuntu公式から提供されているrootfsのイメージを[scratch](https://github.com/tianon/docker-brew-ubuntu-core/blob/master/update.sh#L51-L52)にADDしたあと、少し修正を加えて作られたもの
  * ビルドスクリプト一式は[tianon/docker-brew-ubuntu-core](https://github.com/tianon/docker-brew-ubuntu-core)で公開されている
  * 作者のTianon Graviさんは、[InfoSiftr](http://www.infosiftr.com/)社の[SVP of Operations](http://vegastech.com/meet-tianon-gravi-providing-thought-leadership-in-the-docker-world/)
* 脆弱性があることを検知できるか?
  * Docker Security Scanningによる[検証結果がDockerHubで見られる](https://hub.docker.com/r/library/ubuntu/tags/)
  * [Ubuntuはcoreos/clairがデフォルトで対応している](https://github.com/coreos/clair#default-data-sources)

#### appcontainers/ubuntu

ブログ: http://www.appcontainers.com/appcontainersubuntuxenial/
DockerHub: https://hub.docker.com/r/appcontainers/ubuntu/

* 公式ubuntuイメージから記事に書かれている通り一部パッケージを削除して、export&loadしてレイヤーを一枚にしたもの

#### ubuntu-slim

Docker: gcr.io/google_containers/ubuntu-slim:0.3
GitHub: https://github.com/kubernetes/contrib/tree/master/images/ubuntu-slim

* 公式ubuntuイメージからコンテナOSとして不要なものを削除して、１レイヤーにしたもの
* 公式ubuntuイメージの半分ほどのサイズ
* [削除されたパッケージ](https://github.com/kubernetes/contrib/blob/master/images/ubuntu-slim/Dockerfile.build#L16-L22)
* [削除されたファイル](https://github.com/kubernetes/contrib/blob/master/images/ubuntu-slim/Dockerfile.build#L32-L50)
* Kubernetesコミュニティでメンテされている
* appcontainers/ubuntuより多くのパッケージが削除されているように見える(systemd等)

#### 非公式のSnappy Ubuntu Core

ブログ1: http://andrea.corbellini.name/2015/03/25/running-ubuntu-snappy-inside-docker/
ブログ2: http://www.arvinep.com/2015/12/create-snappy-ubuntu-as-docker-image.html

* 公式ubuntuイメージなどと違って、Ubuntuからrootfsのアーカイブが提供されていないので色々苦労しているみたい

## 参考

* http://distrowatch.com/