自社サービスのDocker化(前編)

     - OS, 開発ツール  


こんにちは。
インフラ開発部の上田です。

普段は自社開発システムのインフラ担当として、日々頑張って仕事をしています。
今回は、近年話題になっているDockerについて、取り上げてみようと思います!


なぜDockerなのか・・・?
そもそもDockerとは何か・・・?

 

当社では様々なサービスを自社開発していますが、インフラ環境もオンプレだけではなく、VMwareなどの仮想環境、AWSなどのクラウドサービスなど、サービスに合わせてインフラ環境も適宜選択しています。

このため、やはり話題のDockerについても評価し、自社開発システムにおける今後の構成案の一つとして取り入れられるよう、理解を深めていかなければいけません・・・

ということで、試行錯誤しながらDockerを評価していた内容を交えながら、ご説明したいと思います!

今回はまず前編となります。

  • Dockerとは!?
    多くのサイトのご説明だと、
    ・コンテナ型の仮想化を実現するためのソフトウェア
    ・XenやHyper-V、VMwareのようなサーバ仮想化とは異なる
    ・コンテナ上でプロセスが実行される

あまりピンと来ないですね・・・
イメージでは下記のような構成となります。

image2

左はVMwareのようなサーバ仮想化の一般的な構成ですね。
サーバが下段にあり、VMwareでいうESXiサーバOS上で各ゲストOSが動作します。
そして、各ゲストOS上で複数のプロセスが起動する構成となります。

次に右はDockerを使用したコンテナ構成の構成となります。
サーバが下段にあり、RedHatやCentOSなどのOSがサーバ上でDockerが動作します。
そして、このDocker上でコンテナと呼ばれる各空間上でプロセスが起動する構成となります。

もちろん、コンテナ上で複数のプロセスを起動することは可能ですが、大きな差は右のサーバ仮想化構成とは異なり、

ゲストOSがない!

というところです。

ということは、サーバ仮想化構成のような各ゲストOSのリソース消費がないということがDockerの特徴の一つと言えます。

また、コンテナ構成などをDockerfileと呼ばれるテキストファイルに纏めて記述することが可能なため、全く同じ環境を容易に作成、またはロールバックも可能です。

これにより、構成ズレや構築手順のズレをなくすことができ、バージョン管理ができることも特徴です。

  • 既設自社サービスのDocker化

と、ここまでDockerの構成についてお話しましたが、やっぱりよく分からない!まずはやってみよう!!と思い、既設自社サービスのDocker化をしてみました。

今回は、AWS EC2上の自社開発し、提供している広告配信システムをDocker化してみます。

具体的な個所はオープンにできませんが、この記事を読まれている方は、ApacheやNginxなどのWebサーバを想像して頂ければと思います。

  • base image作成

base imageとは、コンテナとして起動させるベースとなるイメージです。

base imageとして、公式DockerレジストリであるDocker Hubで公開されているコンテナを使用して構築することも可能です。

ただ、今回は既にAWS EC2上に構築済みの広告配信システムをDocker化し、Dockerの理解を深めていきたいと思います!
※ 自社開発していなくても、既に色々とサーバに手を加えている内容を新規環境に設定するのは手間ですしね・・・

また、公式Dockerレジストリは外部公開されているため、今回のような独自のbase imageを作成する場合は、Dockerプライベートレジストリを構築し、base imageを管理しましょう。
※ 自社開発のソースが外部公開されるなんてことが起きたら・・・

尚、docker自体のインストールはyumでできますので記載しておりません。ご了承ください・・・
まずはDockerを起動させるサーバ(以下、DockerServer)上で、既にEC2上に構築済みの広告配信サーバ(以下、ClientServer)のEBSをアタッチします。

アタッチはEC2のコンソールから、実施します。

今回の趣旨とは異なるため、作業イメージとしては、以下のサイトが分かりやすいため、ご参考に確認してみてください。

http://qiita.com/yuppi/items/ceed29f19e2b38fd0a79

次にアタッチしたEBSをDockerServerでマウントします。
※ アタッチしたEBSが/dev/sdfで認識されたこととしています。

これでまずはマウントされ、ClientServerのディスク内容が確認できました。
そして、このClientServerのディスクイメージをbase imageとして作成し、さらにコンテナとしてDocker上で起動できるようにしてみます。

「ClientServer:1.0」はClientServerという名前で作成し、バージョン管理のイメージで1.0としています。

処理は結構時間が掛かりますが、1h程放置していれば終わりました。
完了後、確認してみます。

9GB強のbase imageとしてClientServerができたようです。
尚、「docker images」コマンドで、Docker上で管理しているコンテナ一覧を確認することが可能です。

  • コンテナ起動

では、「docker run」コマンドで作成したコンテナを起動してみます。

各種オプションですが、「-i」でコンテナの標準入力を開く、「-t」でttyを確保します。
今回は/bin/bashでコンテナを操作したいため、指定しています。
また、バックグラウンドではなくフォアグラウンドで起動させたいため、バックグラウンドでの起動オプションは指定していません。

正常に起動できたようですが、ホスト名が違うみたいです。

一度コンテナのプロンプトを抜けるため、「Ctrl + d」で押下します。
そうすると、DockerServer側に戻ることができます。
このとき、フォアグラウンドで起動したため、「Ctrl + d」で戻るとコンテナが終了してしまいます。
ということで、ホスト名を指定してコンテナを起動してみましょう。
先程の起動オプションに「-h ホスト名」を追加することで、指定したホスト名で起動することができます。

これでClientServerというホスト名で起動することができました。

ところで最初に「サーバ仮想化構成のような各ゲストOSのリソース消費がない」、「コンテナと呼ばれる各空間上でプロセスが起動する構成」とお話しましたが、どういうことかと実際に確認すると、

という形で、通常OS起動時にinitが最初に様々なプロセスを起動しますが、コンテナ上では上述のようにありません。
例えばですが、sshdを起動したい場合、実行してあげる必要があります。

では、せっかく起動したsshdなので、リモート接続してみたいところですが、確認するために「Ctrl + d」でコンテナのプロンプトから抜けると、コンテナが終了してしまいます。

ターミナルをもう一つ開いて確認してもいいのですが、これだとずっとコンテナを起動したターミナルを開き続けないといなないため、コンテナをバックグラウンドで起動します。
まずは先程と同じように「Ctrl + d」でコンテナのプロンプトから抜け、コンテナが終了させます。

そして、起動オプションで「-d」を指定して起動します。さらに、「-p」オプションでポートを指定してポートフォワーディングします。

コンテナが正常にバックグラウンドで起動していることを確認するため、「docker ps」コマンドで確認します。

ちなみに起動したコンテナは自動でIPアドレスが割り振られるため、どのIPアドレスが付与されたかを確認する必要があります。
※ IPアドレスの固定化は、次回にでもお話させて頂きます。

最後の「dd3e42XXXXXX」は「docker ps」コマンドで確認できるコンテナIDとなります。このコンテナIDはコンテナ起動毎にランダムで付与されます。

今回は「172.17.0.10」となっていることを確認できたので、sshしてみましょう。

と、sshができました!
ここまで、base imageを作成し、コンテナを起動させることについてお話してみました。
次回は色々と試してみたことについてお話できればと思います。

宜しくお願いします!!


DACエンジニア採用情報

  関連記事

l_077
fastavroとjqでAVRO形式のファイルからデータを取得しよう

AVRO形式のファイルを取り扱いたい AVROとはApacheプロジェクトのひとつとして開発されているデータ交換形式です。 コンパクトなバイナリで高速なシリアライズ・デシリアライズが行えるため、サーバーログなどに利用されています。 弊社内での一部システムのログデータにも利用されているのですが、専用の …

logos
【小ネタ】タスク管理ツール移行: Trello から Asana

  プロジェクトチームのタスク管理ツールを Trello から Asana に変えることになり、 タスクの移行が意外と簡単にできた、というお話です。 Trello と Asana もともと使っていたのは Trello(トレロ)です。 プロジェクト > タスクグループ > タスク …

index
Android 非同期処理についてまとめてみた

Androidには、UIに影響を与えないよういくつか非同期処理が用意されています。 今回は非同期処理の代表的な ・Service ・IntentService ・HandlerThread について違いを踏まえながらまとめます! 非同期処理について(http://codezine.jp/articl …

gnu
いまさらですが… GNU screen チートシート

最近はローカル環境で開発するようになってきたので、screen コマンドを使う機会も少なくなって来たような気がします。で、使ってないと忘れてしまうので、チートシートを作ってみました。 参照サイト GNU screen [quick_reference] 起動 コマンド 動作 screen -S &l …

Apple-Releases-Safari-10-Developer-Beta-3-for-OS-X-Yosemite-and-El-Capitan
Safari10(iOS10)のインライン動画再生についてまとめてみた

はじめに Safari10からvideoタグを用いたインライン動画再生ができるようになったので、挙動を調べてみました。 Safari 10.0 検証環境 項目 詳細 開発環境 Xcode8.0 検証端末 iPhone7 Simulator ブラウザ iOS Safari / UIWebView / …

forest
ActiveDirectoryをフォレスト間で移行する(その2)

こんにちは。インフラ開発部の福本です。 2015年も残り約半分ですね。ボーっとしていると、あっという間に日々が過ぎていきます。 その中、少しずつ迫るWindowsServer2003のサポート期限。 保守切れとなるサーバOSの移行に忙殺されているサーバ管理者の方も、いらっしゃるのではないでしょうか。 …

監視
Charlesを使ってスマホアプリ(iOS)のUAを調べてみた

はじめに ここ最近のスマホアプリには、Webブラウザの機能を実装したものが少なくありません。 (“スマホアプリ内で立ち上がるブラウザ「アプリ内ブラウザ」”の機能は「WebView」というコンポーネントを用いて実装されています。) 昨今のWebサイト、サービス運営に於いて、「通 …

Libra
【HTML5】4ツール出力ファイルサイズ比較

こんにちは、近江です。 前回もHTML5のSwiffyについて書かせて頂きましたが、まだまだHTML5について調査しています。 今回はSwiffyを含めた4つのHTML5系ツールで、同じ素材で同じアニメーションを作成した時のファイルサイズを比較したいと思います。 何故ファイルサイズの比較をするかと言 …

forest
ActiveDirectoryをフォレスト間で移行する(その1)

こんにちは。DACインフラ開発部の福本です。 多くの企業のユーザー管理に使われているであろうActiveDirectory(以下、ADと略します)ですが、 もちろん当社でもADを使用してユーザーや各種認証の連携を行っています。 当記事は、ドメインの管理・運用を考慮して、子ドメインを新規フォレストに移 …

https---www.pakutaso.com-assets_c-2015-06-GREEN_YO20140125-thumb-1000xauto-16638
クラウド電話API “Twilio”で起こされてみた

どうも、開発部のクラヴマガです。 弊社サービスも最近はAWSの様なクラウド環境でサービスを構築することが多くなりました。 そこで問題になるのが、障害などによる深夜対応・・・。 データセンターに物理サーバをおいていた頃は、データセンターから障害発生時に 電話連絡をもらっていたのですが、クラウド環境では …