Scientific LinuxのDockerイメージを作成する

Docker Indexに公式に提供されている、Scientific Linuxのベースイメージがなかったので、自分で作ってみました。

成果物はこちら。

- Scientific Linuxのベースイメージ: [ringo/scientific](https://registry.hub.docker.com/u/ringo/scientific/)
- ベースイメージを作成するのに利用したスクリプト: [github.com/ringohub/docker-base-image](https://github.com/ringohub/docker-base-image)

## 対象のVMを作成する

まず、Scientific Linux 6.5のDocker用ベースイメージを作成したい場合、
Scientific Linux 6.5のVMを作成します。

作り方はなんでもいいですが、Packerを使って作成する手順をまとめたのがこちらです。

- [Packer で Scientific Linux 6.5 の base box を作成してみる](http://qiita.com/ringo/items/13822cc54c3e8a6e981a)

以降の作業はこのVMの中で行います。

## Dockerのインストール

まず、ベースイメージを作るためにDocekrをインストールします。

### yumにEPELリポジトリを追加

```sh
sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y update
```

もう、EPELリポジトリ以外はアップデート済みの場合は、
`sudo yum -y update epel-release`でもいいです。

### Dockerのインストール

Dockerのインストールは普通にyumで行うだけ。簡単！

```sh
sudo yum -y install docker-io
```

## Dockerベースイメージの作成

`febootstrap`というツールを使って作成します。
(詳しく知らないけど、[debootstrap](https://wiki.debian.org/Debootstrap)みたいなもの？？）

作成用のシェルスクリプトを書きます。
名前は適当にsl65.shとかにしました。

```sh
#!/bin/bash

MIRROR_URL="http://ftp.riken.jp/Linux/scientific/6.5/x86_64/os/"
MIRROR_URL_UPDATES="http://ftp.riken.jp/Linux/scientific/6.5/x86_64/updates/security/"

yum install -y febootstrap xz

febootstrap -i bash -i coreutils -i tar -i bzip2 -i gzip -i vim-minimal -i wget -i patch -i diffutils -i iproute -i yum scientific scientific65  $MIRROR_URL -u $MIRROR_URL_UPDATES
touch scientific65/etc/resolv.conf
touch scientific65/sbin/init

tar --numeric-owner -Jcpf scientific-65.tar.xz -C scientific65 .
```

あとは、これを実行するだけ。

```sh
sudo ./sl65.sh
```

## 動作確認

シェルスクリプトを実行すると次のようなファイルが出来てます。

```sh
[vagrant@localhost ~]$ ls -l
total 51960
-rw-rw-r--  1 vagrant vagrant 53195204 Jun  1 15:10 scientific-65.tar.xz
dr-xr-xr-x 21 root    root        4096 Jun  1 15:07 scientific65
-rwxr-xr-x  1 vagrant vagrant      595 Jun  1 15:06 sl65.sh
```

こいつを、dockerにインポートします。

まず、dockerを起動。

```sh
sudo service docker start
```

次に、インポート。
リポジトリを`local/scientific`にして、tagを`6.5`にしました。

```sh
cat scientific-65.tar.xz | sudo docker import - local/scientific:6.5
```

imageを確認。

```sh
[vagrant@localhost ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
local/scientific    6.5                 ad81296d21b0        13 minutes ago      309.6 MB
```

`docker run`してみます。

```sh
[vagrant@localhost ~]$ sudo docker run local/scientific:6.5 cat /etc/system-release
Scientific Linux release 6.5 (Carbon)
```

よさそう。

## Docker Indexにpushする

コマンドメモしか保存していなかったので、
ここから先はScientific Linux 6.4で実行ログを収集しました。

まず、実行している（いた）コンテナ一覧をみます。

```sh
[vagrant@localhost ~]$ sudo docker ps -a
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS                      PORTS               NAMES
a266aa1f5c10        local/scientific:6.4   cat /etc/system-rele   37 minutes ago      Exited (0) 37 minutes ago                       determined_feynman
```

このコンテナをコミットします。
- `a266aa1f5c10`は`ps`で確認したCONTAINER ID
- `ringo/scientific`はDocker Indexで作成した自分のリポジトリ
- `:`の後ろにタグ

```sh
[vagrant@localhost ~]$ sudo docker commit a266aa1f5c10 ringo/scientific:6.4
0bdd7adac72c6d381e0fe56320252ffbfd39f1a965964115c598f2153fd7a9a8
```

`ringo/scientific`ができました。

```sh
[vagrant@localhost ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ringo/scientific    6.4                 0bdd7adac72c        10 seconds ago      308.9 MB
local/scientific    6.4                 c5cb7eb15e7e        38 minutes ago      308.9 MB
```

Push しましょう!!

```sh
[vagrant@localhost ~]$ sudo docker push ringo/scientific
The push refers to a repository [ringo/scientific] (len: 1)
Sending image list

Please login prior to push:
Username: ringo
Password:
Email:
Login Succeeded
The push refers to a repository [ringo/scientific] (len: 1)
Sending image list
Pushing repository ringo/scientific (1 tags)
c5cb7eb15e7e: Image successfully pushed
0bdd7adac72c: Image successfully pushed
Pushing tag for rev [0bdd7adac72c] on {https://registry-1.docker.io/v1/repositories/ringo/scientific/tags/6.4}
```

## ベースイメージを使ってみる

まず、pullします。

```sh
[vagrant@localhost ~]$ sudo docker pull ringo/scientific
Pulling repository ringo/scientific
0bdd7adac72c: Download complete
1a2eb0bba51b: Download complete
c5cb7eb15e7e: Download complete
ae0b1be0b6ae: Download complete
[vagrant@localhost ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ringo/scientific    6.4                 0bdd7adac72c        About an hour ago   308.9 MB
ringo/scientific    6.5                 1a2eb0bba51b        10 days ago         322.8 MB
```

つぎに、runします。

```sh
[vagrant@localhost ~]$ sudo docker run -i -t ringo/scientific:6.5 cat /etc/system-release
Scientific Linux release 6.5 (Carbon)
```

動いたー。

## 最後に

Scientific Linuxのベースイメージは[ringo/scientific](https://registry.hub.docker.com/u/ringo/scientific/)においてあります。

また、ベースイメージを作成するのに利用した、スクリプトは[github.com/ringohub/docker-base-image](https://github.com/ringohub/docker-base-image)においてあります。
よかったら、参考にどうぞ。

おわり！

## 参考

- [Building a RHEL/CentOS Docker base image](http://failshell.io/docker/building-a-centos-docker-base-image/)
- [Official CentOS base image #290](https://github.com/dotcloud/docker/issues/290)
- [docker向けRHLE系のbase imageを作る](http://qiita.com/tnaoto/items/f9e7f72a63670f1ecda7)