はじめに
docker
とCI ツール
を使ったテスト環境構築事例が色々と出てきていてとにかく楽しそうdocker
とjenkins
を使った構築事例はあるので altria で試してみることにした- 特定の環境に特化したテスト環境ではなく、色々なテストに利用出来るような環境構築を目指す
- 今回はワンボタンで CI で使うコンテナを作成するところまでを作ってみることにする
参考
- Docker + Jenkins + serverspecでpuppetのmanifestをCIする
- Dockerを使ってJenkinsのジョブごとにテスト実行環境を分離する
- 第8回Jenkins勉強会で「Jenkins with Docker」というLTをしました #jenkinsstudy
altria について
準備の準備
altria について
docker について
Ubuntu
環境であれば下記のようにとても簡単に docker
を導入することが出来る。
sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -" sudo sh -c "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" sudo apt-get update apt-get install lxc-docker
必須ぢゃないけど
今回、root
ユーザー以外で全て(altria
や docker
)動作させることを前提としている為(altria
ユーザーで動作させる)、ホストの /etc/sudoers
に以下を追加した。
altria ALL=(ALL) NOPASSWD:/usr/bin/docker*
また、後々に docker inspect
でコンテナの情報を取得する際に JSON
で返ってくる結果をよろしくやってくれる jq
もインストールしておくと便利。(jk
ではありません)
sudo apt-get install jq
準備
Dockerfile
altria
が動作させるホスト上に altria
というユーザーを作り、$HOME
以下に適当にディレクトリを作成(任意)し、以下のような Dockerfile
を置く。
FROM inokappa/wheezy-7.2-basic # ENV DEBIAN_FRONTEND noninteractive RUN dpkg-divert --local --rename --add /sbin/initctl RUN ln -sf /bin/true /sbin/initctl RUN apt-get update RUN apt-get install -y sudo openssh-server curl lsb-release build-essential RUN mkdir -p /var/run/sshd RUN useradd -d /home/altria -m -s /bin/bash altria RUN echo altria:altria | chpasswd RUN echo 'altria ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
Dockerfile
の細かい説明はおググり頂ければと思うが、ざっくり書くと...
FROM
でコンテナの元となるコンテナイメージを指定ENV
で環境変数を指定(今回はDEBIAN_FRONTEND
にnoninteractive
を指定することでパッケージのインストール時に発生する質問を抑制する)RUN
で実行するコマンドを書く
という感じ。ん、Dockerfile
を使えば chef
とか要らなくね?と思ってしまう。そもそもコンテナなのでべき等性もあまり気にする必要がない(コケたら捨てれば良い)のでお気軽に仮想環境を作っては捨て、作っては捨てが出来てしまうのが良いな。
試しに altria からコンテナを立ち上げる
早速、altria
にコンテナを起動するジョブを追加してみる。
altria
にアクセスして New
ボタンをクリックして新しいジョブを追加する。
上記のように Script
欄に以下のようなスクリプトを記述して Create Job
をクリックして作成を完了する(画像では Update job
となっているが適宜、読み替えて頂ければ幸いです)。
cd ~/docker sudo docker build -t test . sudo docker run -t -d -p 22 test /usr/sbin/sshd -D
そして...いよいよ..
Run
ボタンをポチっとなでしばらくすると...
はい。コンテナいっちょあがり。ちなみに、初めてコンテナを作成する際には Dockerfile
に記述された各コマンド等が実行される為、その分の時間が発生するが、初回以降はサクッと一瞬でコンテナが起動する。ココが docker
の良いところ!
確認
念の為、コマンドラインからコンテナが正常に起動しているかを確認する為に alltria
のジョブの最後の部分からコンテナの ID
を確認する。
赤枠で囲まれたコンテナの ID
を使って docker inspect
コマンドでコンテナの情報(ホスト名と IP
アドレス)を取得してみる。
docker inspect 69382d43a22ca9babc184223675817b5fdb1b7e2f09dcdcebeeaaeb99c3a4b28 | jq '.[].Config.Hostname, .[].NetworkSettings.IPAddress'
以下のように出力される。
"69382d43a22c" "172.17.0.3"
この情報を基にしてコンテナに ssh
を使ってアクセスしてみる。既に docker run
の際に sshd
を起動した状態なので、以下のように普通に ssh
コマンドでアクセスする。
ssh altria@172.17.0.3
以下のようにログインすることが出来た。
Linux tpX1-Carbon 3.8.0-30-generic #44-Ubuntu SMP Thu Aug 22 20:52:24 UTC 2013 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. altria@69382d43a22c:~$ cat /etc/debian_version 7.2 altria@69382d43a22c:~$
おお、とっても簡単。
さいごに
Dockerfile
を上手く使うことで簡単に CI 環境からコンテナをワンクリックで作ることが出来たdocker inspect
を使えばコンテナの情報を簡単に取得することが出来る- 取得したコンテナの情報をうまく使いまわすことで、コンテナ構築後アクションを柔軟に定義することが出来る!(と思う)
- カジュアル、カジュアル!