読者です 読者をやめる 読者になる 読者になる

怠惰のすゝめ。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しか利用できません。CentOSUbuntuの最新だとサポートされていますが、Windowsはサポートされていません。

 

Dockerを使ってみよう

コンテナ型仮想化について長々と話をしましたが、今もっとも注目を集めているコンテナ型仮想化ソフトウェアが「Docker」です。

さっそくですがDockerを使ってみましょう。

 

環境はCentOS6.5を想定しています。

dockerのリポジトリをダウンロードして、インストールし起動しましょう。

$ sudo yum update -y

$ 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

Docker version 0.11.1, build fb99f99/0.11.1

 

次に、runオプションでDockerを起動することができ、-tオプションで使用するコンテナイメージを指定します。

その次に、コマンドを指定すると、コンテナ内で指定されたコマンドを実行します。

$ docker run -t centos /bin/echo "Hello Docker"

Hello Docker

 

実は、これらのコンテナは実行が完了すると同時に停止状態に入ります。

コンテナを稼働し続けるには、-d -i オプションを追加します。

$ docker run -d -i -t centos /bin/bash

fc17d479d70c5e4bebb14311a3ffe9de17e24cf1cf0a41b24708f4c830c3c570

 

出力された文字列は、割り当てられたコンテナIDです。

 

コンテナの一覧表示

docker ps コマンドで稼働しているコンテナの一覧が表示されます。

先ほど実行したコンテナが稼働していることが分かります。

$ 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オプションをつけると、停止状態にあるコンテナも含めて表示されます。

$ docker ps -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)

$ docker rm -f fc17d479d70c

fc17d479d70c

 

コンテナIDを上4桁ぐらいで削除ができます。

docker rm の後ろに コンテナID を指定します。(今回は aaf3b3999924)

$ docker rm aaf3

aaf3

 

コンテナが削除されたことを確認しましょう。

$ docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

 

コンテナからイメージを作成

実は、コマンドの -t centosCentOSのオフィシャルコンテナイメージを使っています。

Dockerでは自分で作成したコンテナをイメージ化して使うことができます。

 

まずはコンテナを作成しましょう。 -i オプションで対話形式で起動できます。

そして、コンテナにユーザーを追加しましょう。

$ docker run -i -t centos /bin/bash

bash-4.1# useradd cyberz

bash-4.1# exit

exit

 

作成したコンテナを表示します。

$ docker ps -a

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)

$ docker commit 4b28d439833f centos/test

1ee83caf1269f760af5105b1e547740dfb53ec5095e50d061e0680ee844e012f

 

出力された文字列は、付与されたイメージIDです。

 

これまでの手順で作成したイメージを使ってコンテナを起動します。

-t オプションに、付与したタグ名を指定します。 ここでは "-t centos/test" を指定します。

$ docker run -i -t centos/test /bin/bash

bash-4.1# su - cyberz

[cyberz@6a4c3a530139 ~]$

 

先ほど追加したユーザーに切り替えれることができました。

CentOSのオフィシャルコンテナイメージに、cyberzというユーザーを追加したものをイメージとして登録できたことが分かります。

コンテナのイメージ

Dockerfileを使ってイメージを作成

Dockerfileという定義ファイルを使って、Tomcatが動く環境を作ってみます。

 

~/docker/Dockerfile に次のコードを書き込む

# CentOSをベースに

FROM centos

 

# 作成者

MAINTAINER Taichi Shindo

 

# RUN コマンドを使って、yum コマンドを実行してインストールする

RUN yum update -y && yum -y upgrade

RUN yum install -y sudo

RUN yum install -y passwd

RUN yum install -y httpd

# Javaのインストール

RUN yum install -y java-1.7.0-openjdk-devel.x86_64

# Tomcatリポジトリを追加して、インストール

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を利用して、イメージを作成します。

$ cd ~/docker/

$ sudo docker build -t centos:tomcat .

 

 

先ほど作成したイメージを使って、コンテナを起動します。

-p オプションでポートフォワーディングを使うことで、ホストOSのIPアドレスからポートを指定することで、コンテナ上のTomcatにアクセスすることができます。

$ sudo docker run -d -i -t -p 8080:8080 centos:tomcat

 

コンテナが起動していることを確認しましょう。

$ docker ps -a

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の管理画面が表示できます。

tomcat管理画面

Dockerのこれから

2014/05/29時点では、Dockerのバージョンは0.11です。

一応、バージョン1.0のリリース候補とはなっていますが、製品に組み込むには慎重になってしまいます。

blog.docker.com

 

しかしながら、冒頭で述べたようにGoogleのソフトウェアは全てコンテナの上で動いています。

今後、コンテナ型仮想化技術はどんどん発展して、いずれかは取り入れていくべき技術に変わっていくでしょう。

 

Dockerは今、コンテナ型仮想化をサポートするオープンソースとして注目されています。

みなさんもぜひ活用してみてください。

 

最後に

CyberZは、スマートフォンに特化した広告マーケティング会社です。

CyberZでは、一緒に働いていけるエンジニアを募集しています。

 

CyberZ エンジニア採用サイト

cyber-z.co.jp