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