【個人メモ】docker image を作っていく流れ


社内共有用

dockerに関する情報共有

Dockerの社内プレゼン・ハンズオンやるやるいっててやれていないのでQiitaを使って一部代用。

docker image を自作するには

自作する方法はあるのだけれど、
今時点だとMac OS Xな環境で行う場合どうすれば楽にできるんだろうか、
って思ったので個人的にメモとしてまとめておく。

今回boot2dockerを利用するため、
以下のブログエントリを参考しました。大変ありがたかったです。 m(_ _)m。

boot2dockerでdockerを試す

環境構築

boot2dockerを使おう

boot2dockerでdockerを試す
の通りインストールすればよいので割愛

homebrewでインストールをして
起動準備をして、起動を行う。

boot2dockerインストール時に合わせてdockerもインストールされる。

> brew install boot2docker
> boot2docker init
> boot2docker start

docker hostの設定をする

homebrewでインストールを行い、
DOCKER_HOST環境変数に
boot2dockerのゲストマシンのエンドポイントを指定

> brew install homebrew
> export DOKCER_HOST='tcp://localhost:4243'

これで準備完了

dockerの動作確認

docker pull ubuntuを試す

> docker pull ubuntu

で、docker imageをpullすることが出来れば
boot2docker, dockerの設定は成功。

Dockerfileの構築

ディレクトリ・ファイルの構成

僕は以下の形で
スクリプトや設定ファイルを収めたディレクトリ、
Dockerfileを配置している。

各ディレクトリに何を置いて、
そしてDockerfileに何を書くのかを簡単に書いていく。

まずはDockerfile書いてdocker imageをビルドだ

Dockerfileに以下のコマンドを書いていく。

FROM centos

MAINTAINER Keiji Matsuzaki <[email protected]>

MAINTAINERの部分は適宜自分の名前・メールアドレスに書き換えること。
docker indexに表示される

この状態で、docker build を実行する。

docker公式の centos docker imageを利用し、
docker imageが構築される。

この場合、特に何もしないから公式のdocker imageと同じものができあがる。

作りたてのdocker imageを起動する

作りたてのdocker imageのIMAGE IDを取得する。

> docker images -q | head -1
9f3172f57d27

取得したdocker imageのIMAGE IDを利用し、
docker run コマンドを実行する。

> docker run -i -t $(docker images -q | head -1) /bin/bash
bash-4.1#

-i でインタラクティブモード、
-t で仮想端末を有効にする。
そして最後に渡している/bin/bash は、
docker containerで実行するコマンドだ。

以上のオプションを渡すことにより、
入力待ち状態にすることができた。
またdocker containerを作ることもできた!

ただこのままだとdocker containerから抜けた瞬間に
docker containerが消えてしまうけれど。

docker templateを書いていこう

簡素なdocker templateを書いて、
試しに動作させてみよう

以下の要件(真顔)を満たす感じで。

  • 利用するdocker imageは docker official imageにあるcentos とする
  • reverse proxyとして nginx を利用する
  • 予め用意しておいたウェブアプリを動作させる
  • 各サービスを起動させるスクリプトをdocker run時に実行させるようにする
  • docker containerの外からは80番ポートでアクセスできるようにする

Dockerfile

Dockerfileを以下のように書く。

Dockerfile
FROM centos

MAINTAINER Keiji Matsuzaki <[email protected]>

# setup remi repository
RUN wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN curl -O http://rpms.famillecollet.com/RPM-GPG-KEY-remi; rpm --import RPM-GPG-KEY-remi
RUN rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
RUN yum -y update && yum -y upgrade

# setup nginx yum repository
ADD ./templates/nginx.repo /etc/yum.repos.d/nginx.repo
RUN yum -y update

# setup tools
RUN yum -y groupinstall --enablerepo=epel,remi "Development Tools"

# install nginx
RUN yum -y install --enablerepo=nginx nginx

# mkdir /tmp/download
RUN mkdir -p /tmp/download

# setup ruby-install
RUN wget -O /tmp/download/ruby-install-0.4.0.tar.gz https://github.com/postmodern/ruby-install/archive/v0.4.0.tar.gz
RUN cd /tmp/download && tar -xvzf ruby-install-0.4.0.tar.gz
RUN cd /tmp/download/ruby-install-0.4.0 && make install

# cleanup
RUN rm -rf /tmp/download

# install ruby 2.1.1
RUN ruby-install ruby 2.1.1

ENV PATH /opt/rubies/ruby-2.1.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

RUN gem install bundle --no-ri --no-rdoc 

# install sinatra-hello-world
RUN adduser -m app
RUN mkdir -p /var/app && chown app:app /var/app
RUN su app -c 'git clone https://github.com/Substanz/sinatra-hello-world.git /var/app/sinatra-hello-world'
RUN su app -c 'cd /var/app/sinatra-hello-world && bundle ins --path vendor/bundle'

# add startup.sh
ADD ./scripts/startup.sh /var/app/startup.sh
RUN chown app:app /var/app/startup.sh
RUN chmod +x /var/app/startup.sh
CMD ["/var/app/startup.sh"]

Dockerfileがやってること

  1. remi yum リポジトリの登録
  2. nginx yum リポジトリの登録
  3. ruby-install のインストール
  4. ruby v2.1.1のインストール
  5. bundlerをインストール
  6. 用意したサンプルアプリをgithubのリポジトリからcloneする
  7. startup.shスクリプトをホストからdocker imageにコピー・実行権限付与
  8. CMD により、detach した時に実行されるコマンドを登録(上記の場合、startup.shを利用)

ネットワーク経由で手に入らないリソースについて

nginx.conf, nginx.repo, startup.sh については
ホスト側にあるtemplates, scriptsディレクトリから
必要なファイルをコピーしている。

  • nginx.repo ファイルを利用してyum nginx リポジトリを登録
  • nginx.conf ファイルを利用してnginx の設定を行う
  • startup.sh ファイルを利用してgit clone を行ったアプリケーションを起動する

templatesディレクトリ

僕は、templatesディレクトリに
マシンのミドルウェアを設定するためのファイルをおいている。

今回はnginxのyum リポジトリ設定ファイル、
リバースプロキシ設定ファイルを置いている。

scriptsディレクトリ

scriptsディレクトリについては、
マシン起動時に実行するコマンドを書いた
スクリプトファイルをまとめるようにしている。

今回は、docker run -d (detach mode)の時に
実行するスクリプトファイルを置いた。

docker imageを作成する。

> docker build .

boot2dockerのポートフォワードを指定

dockerのdocumentVBoxManageコマンドを実行せよ、と書かれている。

boot2dockerをstopさせたあと、ポートフォワードの設定を行う

> boot2docker stop
> VBoxManage modifyvm "boot2docker-vm" --natpf1 "nginx,tcp,,8080,,8080";

boot2docker マシンのIPアドレス設定やポートフォワードなどについては
既に本家にPRが上がっている。

PR#93がmergeされれば
便利になると思う...

動作確認

終わったら、boot2dockerを起動し、
docker containerを立ち上げ、
http://localhost:8080/ にアクセスする。

> boot2docker up
> docker run -p 8080:8080 -d $(docker images -q | head -1) 
> open http://localhost:8080/

Welcome to underground... が出ればOK

docker imageの作成手順については以上

他参考