はちゅにっき

こっちのブログはまったり更新

自分用に Debian の Docker Image を構築する

Docker Hub に Debian のイメージがあるので、それを使えばいいんだけれど、タイムゾーンJST にしたかったり、やっぱりなんか自分で作ってみたかったので試してみることに。
あくまでもスタートとなる Base Image だけを作りたいので、Packer とか Ansible とかは使わないことに。
アプリケーションを構築するときには使おうかな。
内容としては以下の記事を大いに参考している。というか、写経みたいなものです。


dockerのカスタムベースイメージを作成する - @znz blog

Base Image の生成

Debian の Base Image は docker が github 上で公開しているツールを使えば、簡単に作成することができるみたい。


docker/docker · GitHub

Base Image を作成するには docker ソースコードの contrib ディレクトリ配下にある mkimage.sh というスクリプトを実行すれば OK。
Debian 以外の Base Image も作成できるみたいだけど、基本的には動かしている OS と同じディストリビューションしか作れないんじゃないかな?
Debian の場合は debootstrap が実行されるため root 権限が必要です。

$ git clone --depth 1 https://github.com/docker/docker.git
$ cd docker/contrib
$ sudo ./mkimage.sh -d "../../" debootstrap --verbose --variant=minbase --include=iproute,locales --arch=amd64 jessie http://cdn.debian.net/debian

今回はロケールの設定をしたかったので "--include=iproute,locales" とインストールするパッケージを明示的に指定しました。iproute は必須とのこと。
しばらく待つと、指定したディレクトリに rootfs.tar.xz というファイルが Dockerfile と共にできあがります。
sudo で実行したため、生成されたファイル等がすべて root 権限になっているので注意。

$ cd ../../
$ pwd
/home/hatyuki/working
$ ls
Dockerfile  docker  rootfs.tar.xz

この rootfs.tar.xz ファイルが docker へと import 可能な Base Image になるみたい。

完成した Image をバラす

今回はここから手を加えたいので、tar ファイルをバラします。

$ pwd
/home/hatyuki/working
$ mkdir my-debian-image
$ sudo tar xvf rootfs.tar.xz -C my-debian-image
$ ls my-debian-image/
bin/  boot/  dev/  etc/  home/  ...

もう完全に chroot してくれという形になっているので、あとは chroot でカスタマイズしていきます。

カスタマイズしてみる

とりあえず chroot して、locale の設定と タイムゾーンの設定をします。
この辺は no interactive に設定する方法もあるようですが、今回は packer などを使っているわけではないので、普通に interactive に設定をしていきました。

$ sudo chroot my-debian-image/ dpkg-reconfigure locales

... ()

Locales to be generated: 275   # ← ja_JP.UTF-8 の番号を選んでいる

... ()

Default locale for the system environment: 1   # ← デフォルトのロケールは変えない

Generating locales (this might take a while)...
  ja_JP.UTF-8... done
Generation complete.
$ sudo chroot my-debian-image/ dpkg-reconfigure tzdata

... ()

地理的領域: 6    # ← Asia 選んでいる

... ()

時間帯: 75   # ← Tokyo 選んでいる

Current default time zone: 'Asia/Tokyo'
Local time is now:      Wed Nov 19 20:00:00 JST 2014.
Universal Time is now:  Wed Nov 19 11:00:00 UTC 2014.

chroot して好きにカスタマイズしたらいいという感じですね。

docker に import

カスタマイズを終えたら、docker に import します。
と、その前に mkimage.sh にならい不要なファイルを消しておきます。

$ sudo rm -rf my-debian-image/dev
$ sudo rm -rf my-debian-image/proc
$ sudo mkdir -p my-debian-image/dev my-debian-image/proc

その後 docker に import します。念のためタグを付けておきます。

$ cd my-debian-image
$ sudo tar --numeric-owner -c . | docker import - hatyuki/debian-jessie-ja:vanilla

起動してみる

期待通りに Image が作られたか確認してみます。

$ docker run hatyuki/debian-jessie-ja:vanilla date
Thu Nov 19 21:00:00 JST 2014

無事に JST で時刻が表示されました。やったね!
と、いうことで BaseImage を作ることができました。
これから先は packer や ansible を使って、用途別に Image を作っていきたいと思います。