社内共有用
dockerに関する情報共有
Dockerの社内プレゼン・ハンズオンやるやるいっててやれていないのでQiitaを使って一部代用。
docker image を自作するには
自作する方法はあるのだけれど、
今時点だとMac OS Xな環境で行う場合どうすれば楽にできるんだろうか、
って思ったので個人的にメモとしてまとめておく。
今回boot2dockerを利用するため、
以下のブログエントリを参考しました。大変ありがたかったです。 m(_ _)m。
環境構築
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 <futoase@gmail.com>
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を以下のように書く。
FROM centos
MAINTAINER Keiji Matsuzaki <futoase@gmail.com>
# 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がやってること
- remi yum リポジトリの登録
- nginx yum リポジトリの登録
- ruby-install のインストール
- ruby v2.1.1のインストール
- bundlerをインストール
- 用意したサンプルアプリをgithubのリポジトリからcloneする
- startup.shスクリプトをホストからdocker imageにコピー・実行権限付与
- 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のdocumentにVBoxManageコマンドを実行せよ、と書かれている。
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の作成手順については以上