怠惰のすゝめ。Dockerで環境構築・テスト・デプロイを完全自動化
こんにちは、2014年新卒エンジニアの進藤です。
CyberZに配属されて1ヶ月経ちましたが、優秀な先輩エンジニアに囲まれ、刺激的な毎日を過ごしています。
さっそくですが、いま僕が進めているプロジェクトについてを説明します。
開発中のプロジェクトに対して、環境構築・テスト・デプロイの自動化を進め、開発のサイクルを早める仕組み・体制を整えています。
さらには運用中のプロジェクトに対して「Immutable Infrastructure」の概念を取り入れ、安全な運用体制についても調査しています。
まだ検証の段階ですが、以下の開発フロー構築を進めていこうとしています。
① Gitリポジトリにプッシュが行われる
② リポジトリが更新されたことをJenkinsに通知する
③ ビルド & 単体テストを行う
④ Dockerのコンテナを起動する
⑤ Tomcatを起動する
さて、前置きが長くなりましたが、本日はDockerについてを話します。
Dockerとは
Docker とは、Docker社(旧dotCloud)が開発するオープンソースのソフトウェアです。
Dockerを使うことで、「コンテナ型仮想化」を構築することができます。
いま、Dockerを中心にコンテナ型仮想化が話題を集めていて、多くの企業がコンテナ型仮想化を使った運用を試しています。
先日の記事ですが、Googleでは全てのソフトウェアをコンテナ上で動かしていることで話題になりました。
『すでにGoogleは全部のソフトウェアをコンテナに乗せており、毎週20億個ものコンテナを起動している』
http://www.publickey1.jp/blog/14/google20.html
そして今まさに、CyberZでもコンテナ型仮想化技術を導入すべく、調査・検討をしているとこです。
従来の仮想化技術
PCの性能向上に伴い、仮想化という言葉も一般的になってきました。インフラエンジニアやアプリ開発者だけにとどまらず、一般の方も仮想化技術に触れる機会が多くなったのではないでしょうか。例えば、Macに「BootCamp」や「VirtualBox」といった仮想化ソフトを使って、Windowsを動かした経験のある方は多いことでしょう。
また、インフラエンジニアやアプリ開発者だと「ESXi」や「Hyper-V」といった仮想化ソフトを使ってサーバーへ直接インストールして仮想マシンを動かした経験のある方は多いことでしょう。
前者のように、OS上に土台となる仮想化ソフトウェアをインストールして、その上で仮想マシンを稼働させる方式を『ホストOS型の仮想化』と呼ばれ、
後者のように、サーバーへ直接インストールし仮想マシンを稼働させる方式を『ハイパーバイザー型の仮想化』と呼ばれています。
そして最近では、「Immutable Infrastrucre」 といったキーワードとともに「コンテナ型仮想化」が話題を集めています。
「Immutable Infrastructure」と「コンテナ型仮想化」
「Immutable Infrastructure」をそのまま読めば「不変のインフラ」という意味ですが、その名の通り、一度作成したサーバーの状態を変更しないというのが大原則です。
「運用中にシステムの設定変更を余儀なくされたときは?」「あるアプリケーションをインストールしたいときは?」
はい、サーバーを破棄して作り直せば良いんです。
必要になればサーバーを作り、いらなくなったら破棄する。
これがImmutable Infrastructureの大きな特徴です。
ここまで読んでくれた読者の中には、Windowsの調子が悪くなってOSごと再インストールしてスッキリした経験のある方が多いんじゃないでしょうか。
そのような経験があると、必要になればサーバーを作って、いらなくなったら破棄する考え方はすんなり受け入れられるのではないかと思います。
さて「Immutable Infrastructure」を受け入れることができたとして、サーバーを1から作ることのコストを考えてしまいますね。
そこで、サーバーを作ったり捨てたりを簡単に実現するために最近注目されている技術が「コンテナ型仮想化」というわけです。
従来の『ホストOS型の仮想化』や『ハイパーバイザー型の仮想化』と違って、「コンテナ型仮想化」は非常に軽量です。
この "軽量" こそが注目を集めている最大の理由ですが、それを実現している技術は単純で、ホストOSとの差分だけをコンテナというプロセスに盛り込むことで実現しています。
ホストOSとカーネルを共有しているので、VM(仮想マシン)にOSをインストールする必要はなく、最低限必要なバイナリ・ライブラリ・構成ファイルが含まれた最小構成のVM(仮想マシン)を稼働させることが可能になります。
コンテナ型仮想化のメリットとしては、とにかく環境構築 + 起動が早いことです。なぜなら、ホストOSから見るとコンテナというプロセスを起動しているだけだからです。
デメリットとしては、使用するOSが限られることです。コンテナ仮想化をサポートしているOSしか利用できません。CentOSとUbuntuの最新だとサポートされていますが、Windowsはサポートされていません。
Dockerを使ってみよう
コンテナ型仮想化について長々と話をしましたが、今もっとも注目を集めているコンテナ型仮想化ソフトウェアが「Docker」です。
さっそくですがDockerを使ってみましょう。
環境はCentOS6.5を想定しています。
dockerのリポジトリをダウンロードして、インストールし起動しましょう。
$ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
$ sudo yum install xz docker-io -y
$ sudo service docker start
Dockerのコンテナを稼働させる
Dockerのインストールが正常に完了すると、dockerコマンドが使えるようになります。
versionオプションで、dockerのバージョンを調べてみましょう。
Docker version 0.11.1, build fb99f99/0.11.1
次に、runオプションでDockerを起動することができ、-tオプションで使用するコンテナイメージを指定します。
その次に、コマンドを指定すると、コンテナ内で指定されたコマンドを実行します。
Hello Docker
実は、これらのコンテナは実行が完了すると同時に停止状態に入ります。
コンテナを稼働し続けるには、-d -i オプションを追加します。
fc17d479d70c5e4bebb14311a3ffe9de17e24cf1cf0a41b24708f4c830c3c570
出力された文字列は、割り当てられたコンテナIDです。
コンテナの一覧表示
docker ps コマンドで稼働しているコンテナの一覧が表示されます。
先ほど実行したコンテナが稼働していることが分かります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc17d479d70c centos:centos6 /bin/bash About a minute ago Up About a minute silly_babbage
-aオプションをつけると、停止状態にあるコンテナも含めて表示されます。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc17d479d70c centos:centos6 /bin/bash 1 minutes ago Up 2 minutes silly_babbage
aaf3b3999924 centos:centos6 /bin/echo 'Hello Doc 1 minutes ago Exited (0) 12 minutes ago mad_nobel
先ほど実行されてすぐに停止状態に入ったコンテナも見えています。
コンテナを削除する
不要になったコンテナを削除するには、docker rm コマンドを使います。
先ほど作成した2つのコンテナを削除しましょう。
稼働中のコンテナを削除するには -f オプションをつけます。
docker rm -f の後ろに コンテナID を指定します。(今回は fc17d479d70c)
fc17d479d70c
コンテナIDを上4桁ぐらいで削除ができます。
docker rm の後ろに コンテナID を指定します。(今回は aaf3b3999924)
aaf3
コンテナが削除されたことを確認しましょう。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
コンテナからイメージを作成
実は、コマンドの -t centos はCentOSのオフィシャルコンテナイメージを使っています。
Dockerでは自分で作成したコンテナをイメージ化して使うことができます。
まずはコンテナを作成しましょう。 -i オプションで対話形式で起動できます。
そして、コンテナにユーザーを追加しましょう。
bash-4.1# useradd cyberz
bash-4.1# exit
exit
作成したコンテナを表示します。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b28d439833f centos:centos6 /bin/bash About a minute ago Exited (0) About a minute ago sad_torvalds
上記のコンテナに、testというタグ名を付与したイメージを作成します。
docker commit の後は コンテナID を指定します。(今回は 4b28d439833f)
1ee83caf1269f760af5105b1e547740dfb53ec5095e50d061e0680ee844e012f
出力された文字列は、付与されたイメージIDです。
これまでの手順で作成したイメージを使ってコンテナを起動します。
-t オプションに、付与したタグ名を指定します。 ここでは "-t centos/test" を指定します。
bash-4.1# su - cyberz
[cyberz@6a4c3a530139 ~]$
先ほど追加したユーザーに切り替えれることができました。
CentOSのオフィシャルコンテナイメージに、cyberzというユーザーを追加したものをイメージとして登録できたことが分かります。
Dockerfileを使ってイメージを作成
Dockerfileという定義ファイルを使って、Tomcatが動く環境を作ってみます。
~/docker/Dockerfile に次のコードを書き込む
FROM centos
# 作成者
MAINTAINER Taichi Shindo
# RUN コマンドを使って、yum コマンドを実行してインストールする
RUN yum update -y && yum -y upgrade
RUN yum install -y sudo
RUN yum install -y passwd
# Javaのインストール
RUN yum install -y java-1.7.0-openjdk-devel.x86_64
RUN yum install -y yum-priorities
RUN rpm -Uvh http://mirrors.dotsrc.org/jpackage/6.0/generic/free/RPMS/jpackage-release-6-3.jpp6.noarch.rpm
RUN yum install -y tomcat7-webapps
# EXPOSE コマンドを使って、ポート8080を解放
EXPOSE 8080
# ADD コマンドを使って、ホストOSからwarファイルを取得
# ADD ~/docker/war/hello.war /usr/share/tomcat7/webapps/hello.war
# ENTORYPOINT コマンドを使って、コンテナ起動時に実行するコマンドを与える
ENTRYPOINT /etc/init.d/tomcat7 start && /bin/bash
Dockerfileを利用して、イメージを作成します。
$ sudo docker build -t centos:tomcat .
先ほど作成したイメージを使って、コンテナを起動します。
-p オプションでポートフォワーディングを使うことで、ホストOSのIPアドレスからポートを指定することで、コンテナ上のTomcatにアクセスすることができます。
コンテナが起動していることを確認しましょう。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a5dad26be7a centos:tomcat /bin/sh -c '/etc/ini 4 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp clever_hoover
ホストOSのIPアドレス:8080 でTomcatの管理画面が表示できます。
Dockerのこれから
2014/05/29時点では、Dockerのバージョンは0.11です。
一応、バージョン1.0のリリース候補とはなっていますが、製品に組み込むには慎重になってしまいます。
しかしながら、冒頭で述べたようにGoogleのソフトウェアは全てコンテナの上で動いています。
今後、コンテナ型仮想化技術はどんどん発展して、いずれかは取り入れていくべき技術に変わっていくでしょう。
Dockerは今、コンテナ型仮想化をサポートするオープンソースとして注目されています。
みなさんもぜひ活用してみてください。
最後に
CyberZは、スマートフォンに特化した広告マーケティング会社です。
CyberZでは、一緒に働いていけるエンジニアを募集しています。
CyberZ エンジニア採用サイト