DockerのCentOSベースイメージを簡単に作る方法

2014/12/09

ググると沢山出てくるテーマでアレなんですが、これが楽かなと思う方法をご紹介します。

全体像

  • イメージを作る環境自体はVagrant上の仮想マシンを利用する。作成しようとしているOSにあわせておくと良い(バージョンが違っても大丈夫)
  • 仮想マシン自体のセットアップはもちろんのこと、Dockerのイメージを作るところまでVagrantのFile ProvisionerShell Provisonerを使って何度でも同じことができるようにする
  • File Provisionerはepelのレポジトリを有効にするためだけに使っており、Shell Provisonerでイメージの作成をする

作業手順

今回作成するのはCentOSのイメージですが、このルートイメージを作成するためにfebootstrapを使います。febootstrapは標準のyumレポジトリには含まれていないのでepelのレポジトリを有効にする必要があります。いちいち手で仮想マシンに変更を加えるのはあり得ないので、事前に以下の内容でファイルを作っておきます。ファイル名はconf/epel.repoとします。見ればわかる通り、普通のyumの設定ファイルです。本当に必要なときだけコマンドラインでこのレポジトリを有効にすれば良いので、enabled=0にしてあります。

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
enabled=0
failovermethod=priority
gpgcheck=1
gpgkey=http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-6&arch=$basearch
sslverify=true

次にVagrantで色々やる準備をします。以下のような内容でVagrantfileを用意してください。もしboxを他のものに変えたければ適宜指定すればOKです。また以下の例ではbox_urlパラメータが指定されているので、もし手元にboxがなくても自動でダウンロードしてくれます。

たいした肝はありませんが、肝心なのは冒頭の方にあるスクリプトの部分です。epelのレポジトリを有効にしてfebootstrapをインストールし、CentOSのミラーリストを指定した上で最低限のパッケージを導入、さらにいくつか必要なファイルを作成した上で圧縮をかけている、という処理になります。なお圧縮をかける際、xzで圧縮してしまうとDocker 1.3.2のバグを見事に踏まされるので、gzipでの圧縮が良いです。

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

if !File.exists?(File.dirname(__FILE__) + "/export")
  Dir::mkdir(File.dirname(__FILE__) + "/export")
end

version = ENV["CENTOS_BUILD_VERSION"] ? ENV["CENTOS_BUILD_VERSION"] : "6.5"

script = <<SCRIPT
MIRROR_URL="http://mirrors.usc.edu/pub/linux/distributions/centos/#{version}/os/x86_64/"
MIRROR_URL_UPDATES="http://mirrors.usc.edu/pub/linux/distributions/centos/#{version}/updates/x86_64/"
cp /tmp/epel.repo /etc/yum.repos.d/epel.repo
yum install --enablerepo=epel -y febootstrap
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 centos#{version}  $MIRROR_URL -u $MIRROR_URL_UPDATES
touch centos#{version}/etc/resolv.conf
touch centos#{version}/etc/sysconfig/network
touch centos#{version}/sbin/init
tar --numeric-owner -zcpf centos-#{version}.tar.gz -C centos#{version} .
mv centos-#{version}.tar.gz /export/
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "opscode-centos-#{version}"
  config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-#{version}_chef-provisionerless.box"
  config.vm.synced_folder "./export", "/export"
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end

  config.vm.provision "file", source: "./conf/epel.repo", destination: "/tmp/epel.repo"
  config.vm.provision :shell, :inline => script
end

あとは

vagrant up --provision

コマンドを実行すればOKです。しばらくするとカレントディレクトリにcentos-6.5.tar.gzといった名前でファイルが出来上がりますので、

cat export/centos-6.5.tar.gz | docker import - ryuzee/centos:6.5

などとしてローカル環境で登録してください。もちろんこれをdocker.ioに登録したければ、以下のようにすればOKです。

docker push ryuzee/centos:6.5

非常に簡単ですね。



2014/12/09

伊藤 直也, 片山 暁雄, 平山 毅, 舟崎 健治, 吉荒 祐一, 今井 雄太, 八木橋 徹平, 安川 健太, 宮下 剛輔, 田中 慎司, 久保 達彦, 道井 俊介, 飯田 祐基, 桑野 章弘, 松浦 隼人, 中村 俊之, 福永 亘, 杉山 仁則
技術評論社 2014-10-30 2138円

著作

CakePHPで学ぶ継続的インテグレーション

著者/訳者:渡辺 一宏 吉羽 龍太郎 岸田 健一郎 穴澤 康裕

出版社:インプレス( 2014-09-19 )

定価:¥ 4,320


Chef実践入門 ~コードによるインフラ構築の自動化 (WEB+DB PRESS plus)

著者/訳者:吉羽 龍太郎 安藤 祐介 伊藤 直也 菅井 祐太朗 並河 祐貴

出版社:技術評論社( 2014-05-22 )

定価:¥ 2,992


SCRUM BOOT CAMP THE BOOK

著者/訳者:西村直人 永瀬美穂 吉羽龍太郎

出版社:翔泳社( 2013-02-13 )

定価:¥ 2,520


Software in 30 Days スクラムによるアジャイルな組織変革“成功"ガイド

著者/訳者:Ken Schwaber、Jeff Sutherland著、角征典、吉羽龍太郎、原田騎郎、川口恭伸訳

出版社:アスキー・メディアワークス( 2013-03-08 )

定価:¥ 1,680


How to Change the World 〜チェンジ・マネジメント3.0〜

著者/訳者:Jurgen Appelo, 前川哲次(翻訳), 川口恭伸(翻訳), 吉羽龍太郎(翻訳)

出版社:達人出版会

定価:500円

どうすれば自分たちの組織を変えられるだろう?それには、組織に変革を起こすチェンジ・マネジメントを学習することだ。アジャイルな組織でのマネージャーの役割を説いた『Management 3.0』の著者がコンパクトにまとめた変化のためのガイドブック


寄稿

実践 Vagrant

著者/訳者:Mitchell Hashimoto

出版社:オライリージャパン( 2014-02-21 )

定価:¥ 2,808


Ryuzeeについて
Certified Scrum Professional (CSP) / CSM / CSPO in Japan. Twitterアカウントは@ryuzee →サイトが役立ったのでお布施する!

タグ
diary delphi books 書評 trac agile php apache インストールマニアックス maniax iis mysql postgresql perl sqlserver ruby オープンソース wordpress agilo scrum cakephp ユニットテスト yyyayeyaey publication tram 組織 linux プロダクトバックログ リーン ストーリーポイント ベロシティ ストーリー テスト 事例 契約 オフショア 管理職 スクラムマスター プロダクトオーナー デイリースクラム ふりかえり 受託開発 見積もり コーチ リーダー yyyoyy zen xp アンチパターン 可視化 doneの定義 recommended レビュー kaltrua vmware 自動化 fixture hudson 継続的インテグレーション kanban スプリント スクラム道 リリースプランニング カバレージ subversion scrum-of-scrum netbeans 朝会 バーンダウンチャート 調査結果 コミット devlove チーム bdd selenium アジリティ スプリント0 フィードバック ユーザーストーリー tdd sprint task スプリントレビュー スプリント計画会議 scrum-boot-camp scrumbc alm 継続的デリバリー ci user-story migration vagrant product-owner 継続的デプロイ continuous-delivery continuous-deploy continuous-integration jenkins デプロイ どうでもよいこと 日記 centos vim test commitment movie コードレビュー devops リリース 登壇 スコープ 評価 プランニングポーカー 見積り done ready agile-buffet agile-japan 講演 azure team-foundation-server team-foundation-service tfs 導入 eclipse visual-studio microsoft 技術的負債 defects lean daily-scrum grooming scrum-boot-camp-premium git ubuntu homeserver 監視 chef aws sahara packer lxc serverspec sensu dashing capistrano graphite 寿司 grafana docker slack deploy AWS Packer Jenkins AMI