0. 前提
dockerに正式対応したRHEL6.5/CentOS6.5を対象とした記事です。
dockerを使う分には、docker pullして更新リポジトリにあるコンテナイメージを使えば良いですが、そのイメージの安全性に疑問がある場合、特に企業で使う場合などなかなか不安だと思います。
そこでタイトルにもある通りbaseイメージを作ります。
ubuntu系は探せば出てきますが、RHEL系は見かけないので書いてみます。
作業環境
MacBookPro Retina
VirtualBox
1.準備
docker自体はLXCなので、ホストとなるLinuxが必要です。
ホストは何でも良いんですが、せっかくなのでホストもRHEL系で行きます。
記事は、CentOS6.5の作業ベースで書いていきますが、筆者はRHEL6.5でも検証を行ったので、差分も合わせて記載しておきます。
あまり差はないですが、差が生じている部分はその趣旨を書いておきます。
ホストOSを作成します。
手で入れるのめんどくさいので、筆者はveeweeを使っています。
手で入れようとpackerで入れようと自由です。
あとでvagrant用のboxにもできるの便利です。
作るのがめんどくさい人は、vagrant用のboxイメージでも拾ってきてください
RHELの場合でもCentOS65のテンプレートを転用して同じようにイメージを作っています。yumコマンドが効かないので、ks.cfgに必要なパッケージを書いておくと楽ちんです。
1.1 プロキシ配下にいる場合
dockerは、dockerデーモンが通信をバイパスするのか、プロキシ情報を与えておく必要があります。
serviceコマンド経由の起動なので、以下のファイルの適当な場所に環境変数と追記します。
/etc/init.d/functions
export http_proxy=http://xxxx:8080
/etc/environmentあたりにも書いておくのがおすすめ
2.dockerのインストール
インストール自体は、dockerのサイトに乗っているまんまでいけます。
http://docs.docker.io/en/latest/installation/rhel/
ただし、EPELを使うので、先にリポジトリを有効にする必要があります。
[root@localhost ~]# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
あとは、ドキュメントにしたがってdockerをインストールします。
RHEL6.5の場合、DVDイメージをマウントするかコピーして、yum コマンドが動く環境を作っておきます。
[root@localhost ~]# yum -y install docker-io
[root@localhost ~]# service docker start
[root@localhost ~]# chkconfig docker on
- ここまででvbox化するとホストとして使いには楽です。
3. docker上で動くまで
3.1 準備
公式ドキュメントのこのあたりの話です。
http://docs.docker.io/en/latest/use/baseimages/
実はdockerコンテナイメージは、lxcコンテナイメージそのままなので、lxcコンテナを作るのと同じです
ぐぐったら、同じようなことしてる人があっさり見つかりました。
http://failshell.io/docker/building-a-centos-docker-base-image/
まず、ツール入れます。
[root@localhost ~]# yum install febootstrap
3.2 imageを作る
リンク先を察するとどうやら、コンテナとして作るときにあって欲しいパッケージを-iで指定しているようです。
そいえば、dockerのリポジトリにはCentOS6.4あったなぁと思ったので、探していたらこんなの見つめました。
https://github.com/dotcloud/docker/issues/290
これをヒントに、以下で実行します。
[root@localhost ~]# febootstrap -i bash -i coreutils -i tar -i bzip2 -i gzip -i vim-minimal -i wget -i patch -i diffutils -i iproute -i yum centos centos65 http://ftp.iij.ad.jp/pub/linux/centos/6/os/x86_64/ -u http://ftp.iij.ad.jp/pub/linux/centos/6/updates/x86_64/
RHELの場合、外部サイトにパッケージはありませんので、http://~の部分をfile:///mntのように書き換えます。-uのアップデート部分はなくても問題ありません。
上記コマンドを実行した結果、コマンドを実行したディレクトリ配下にフォルダが作成されます。今回はcentos65というフォルダができて、linuxのフォルダ構成っぽいのができています。この配下のものがコンテナとして動きます。
先ほどのgithubのissuesのページによれば、以下も実行されているので、適当にやっておきます。(理由は知りませんw)
[root@localhost ~]# touch centos65/etc/resolv.conf
[root@localhost ~]# touch centos65/sbin/init
あとはdockerにimportします。手順は公式サイトに戻って以下の通り
3.2 imageをimportする
[root@localhost ~]# tar -C centos65 -c . | sudo docker import - centos65
[root@localhost ~]# tar -C centos65 -c . | sudo docker import - centos65
045a7a198ad02420cc9b8c1736c4c74c1a2a11bd01453b929f1528873491da47
すると、以下のように入っていることを確認
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos65 latest 045a7a198ad0 3 minutes ago 309.8 MB (virtual 309.8 MB)
300M...なんかずいぶんデカイ・・・
3.3 作ったimageの起動
とりあえず、docker起動してみると
[root@localhost ~]# docker run -i -t centos65 /bin/cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d2adb131ea3 centos65:latest /bin/cat /etc/redhat About a minute ago Exit 0 cocky_einstein
大丈夫そうですね。
あとは、commitすれば公式リポジトリにも登録できるでしょう(未検証)
誰か試してくれると幸いです。
RHELで作った人はpushしちゃうと、使われ放題になってライセンス違反になりますのでご注意ください。
そいえば、登録したもの消す方法ってできたんでしたっけ?
終わりに
記事にしてみたらあっさりでしたが、ここまで来るのにいろいろ調べてほぼ一日かかっています。
一回わかればどーってことない話でした、
記事に間違いがありましたら、ご指摘いただけると助かります