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

     - OS, 開発ツール  


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

前回、前編としてDockerについて書き、早半年も経ちました。

前編はこちらです

今回は後編として、以下について書いてみたいと思います。

■複数プロセス起動

前編で書いた通り、通常のOS起動時とは異なり、コンテナ上で個別にプロセスを起動する必要があります。
今回は後述しますが、コンテナ起動時にnginxとsshdの2プロセスを起動させます。

まず、nginxのインストール・設定を行うため、コンテナを起動します。

[root@DockerServer /]# docker run -d -t -i -h ClientServer centos64:6.4 /bin/bash
39cadf5202ab2154e7cbe45efdcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

次にIDを確認した上で、バックグラウンドで起動したコンテナにアタッチします。

[root@DockerServer /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
centos64:6.4 "/bin/bash" 22 seconds ago Up 22 seconds thirsty_mayer

[root@DockerServer /]# docker attach
[root@ClientServer /]#

では、nginxのインストールと設定を実施します。
※ 尚、nginxは動作確認だけできればいいため、ポート変更しか設定していません。

●nginxインストール

[root@ClientServer /]# cd /usr/local/src/
[root@ClientServer src]# wget http://nginx.org/download/nginx-1.9.0.tar.gz
--2015-XX-XX XX:XX:XX-- http://nginx.org/download/nginx-1.9.0.tar.gz
Resolving nginx.org... 206.251.255.63
Connecting to nginx.org|206.251.255.63|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 854462 (834K) [application/octet-stream]
Saving to: <code>nginx-1.9.0.tar.gz'

100%[=============================================================================================&amp;gt;] 854,462 278K/s in 3.0s

2015-XX-XX XX:XX:XX (278 KB/s) - </code>nginx-1.9.0.tar.gz' saved [854462/854462]

[root@ClientServer src]# ls
nginx-1.9.0.tar.gz

[root@ClientServer src]# tar xzvf nginx-1.9.0.tar.gz
[root@ClientServer src]# cd nginx-1.9.0
[root@ClientServer nginx-1.9.0]# ./configure
[root@ClientServer nginx-1.9.0]# make
[root@ClientServer nginx-1.9.0]# make install

●nginx設定

[root@ClientServer nginx-1.9.0]# cd /usr/local/nginx/conf/
[root@ClientServer conf]# ls
fastcgi.conf fastcgi_params.default mime.types nginx.conf.default uwsgi_params
fastcgi.conf.default koi-utf mime.types.default scgi_params uwsgi_params.default
fastcgi_params koi-win nginx.conf scgi_params.default win-utf

[root@ClientServer conf]# cp -p nginx.conf nginx.conf.org
[root@ClientServer conf]# vi nginx.conf
~省略~

nginxの設定は省略しますが、テストのためポートを80から10080に変更しました。

●sshd設定
次にnginxと共にsshdも起動しますが、sshdのポートもテストのため、22から10022に変更してみます。
※ sshdのポート変更は省略します。

●monitインストール・設定
今回のようにnginxとsshdの2プロセスを常駐させたいといった場合、
複数のプロセスを起動・常駐させることができるプロセス管理ツールを使用します。

プロセス管理ツールは、Supervisorやmonitといったものがあります。
どちらも大きくは変わらないですが、今回はmonitを使用してみたいと思います。
まずmonitは、以下のような機能を提供します。
・指定したプロセスを監視
・プロセス停止時には自動的にプロセスを再起動

このmonitの機能を使用してコンテナ起動時に、nginxとsshdを起動します。
monitの詳細は公式サイトをご確認ください。

まずmonitをインストールします。

[root@ClientServer src]# cd /usr/local/src/
[root@ClientServer src]# wget http://mmonit.com/monit/dist/monit-5.9.tar.gz
[root@ClientServer src]# tar xzvf monit-5.9.tar.gz
[root@ClientServer src]# cd monit-5.9
[root@ClientServer monit-5.9]# ./configure
[root@ClientServer monit-5.9]# make
[root@ClientServer monit-5.9]# make install

次に設定ファイルであるmonitrcを編集します。

[root@ClientServer monit-5.9]# cp -p monitrc /etc/
[root@ClientServer monit-5.9]# chmod 600 /etc/monitrc
[root@ClientServer monit-5.9]# cd /etc/
[root@ClientServer etc]# cp -p monitrc monitrc.org
[root@ClientServer etc]# vi monitrc

※ includeを有効化する

###############################################################################
## Includes
###############################################################################
##
## It is possible to include additional configuration parts from other files or
## directories.
#
include /etc/monit.d/*

ディレクトリがないため、作成します。

[root@ClientServer etc]# mkdir /etc/conf.d/
[root@ClientServer etc]# cd conf.d/

そして、今回考えているnginxとsshdの設定ファイルを作成します。
それぞれの設定は以下の通りです。

●nginx起動プロセス

[root@ClientServer etc]# vi nginx
---------------------
check process nginx matching "nginx"
start program = "/usr/local/nginx/sbin/nginx"
stop program "/usr/local/nginx/sbin/nginx -s quit"
if 5 restart within 5 cycles then timeout
---------------------

●sshd起動プロセス

[root@ClientServer etc]# vi sshd
---------------------
check process sshd matching "sshd"
start program = "/etc/init.d/sshd start"
stop program "/etc/init.d/sshd stop"
if 5 restart within 5 cycles then timeout
---------------------

●起動テスト

[root@ClientServer conf.d]# /usr/local/bin/monit -I
Starting Monit 5.9 daemon with http interface at [localhost:2812]

では、一度「Ctrl + d」でコンテナのプロンプトから抜け、コンテナが終了させ、
変更した内容を保存するため、commitします。

[root@DockerServer /]# docker commit centos64:6.4

commit後、再度コンテナを起動しますが、nginxとsshdを自動起動させるため、
以下のコマンドで実施します。
また、接続確認するため、ポートフォワーディングも合わせて実施します。

[root@DockerServer /]# docker run -d -t -i -p 80:10080 -p 22:10022 -h ClientServer centos64:6.4 /usr/local/bin/monit -I
bfea56bdc5XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

「/usr/local/bin/monit -I」はmonitを起動するコマンドで、コンテナ起動時に指定します。
これにより、コンテナ起動時にmonitが起動され、さらにmonitがnginxとsshdを起動します。

●動作確認
動作確認のため、コンテナのIPを確認します。

[root@DockerServer /]# docker inspect --format="{{ .NetworkSettings.IPAddress }}" <コンテナID>
172.17.XX.XX

まず、DockerServerからコンテナ上のnginxに対してcurlします。
コンテナ上では10080ポートでnginxを起動しているため、10080ポートにリクエストします。

[root@DockerServer /]# curl -I http://172.17.XX.XX:10080
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 20 May 2015 11:57:38 GMT
~省略~

正常に200 ステータスが返却されました。

次にグローバル経由でテストしてみます。
コンテナ起動時に80ポートと10080ポートをフォワーディングしているため、80ポートにcurlします。
また、リクエスト先はDockerを起動しているホストOSのEC2グローバルIPアドレスとなります。

[root@DockerServer /]# curl -I http://YY.YY.YY.YY/
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 20 May 2015 11:57:41 GMT
~省略~

こちらも正常に200 ステータスが返却されました。
これでnginxが正常に起動されていることを確認できました。

次にsshdも正常に起動していることを確認します。

[root@DockerServer /]# ssh testuser@172.17.XX.XX -p 10022
The authenticity of host '[172.17.XX.XX]:10022 ([172.17.XX.XX]:10022)' can't be established.
RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[172.17.XX.XX]:10022' (RSA) to the list of known hosts.
testuser@172.17.XX.XX's password:
Last login: Wed May 20 20:55:16 2015 from 172.17.XX.XX
[testuser@ClientServer ~]$

sshdも正常に接続可能であることが確認できました。

最後にプロセス起動状況を確認してみます。
monitが起動されており、PID「1」であるmonitがnginxとsshdを起動していることが確認できます。

[testuser@ClientServer ~]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 20:57 ? 00:00:00 /usr/local/bin/monit -I
root 22 1 0 20:57 ? 00:00:00 /usr/sbin/sshd
root 25 1 0 20:57 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 26 25 0 20:57 ? 00:00:00 nginx: worker process
root 27 22 0 20:57 ? 00:00:00 sshd: testuser [priv]
testuser 29 27 0 20:57 ? 00:00:00 sshd: testuser@pts/0
testuser 30 29 0 20:57 pts/0 00:00:00 -bash
testuser 58 30 0 20:57 pts/0 00:00:00 ps -ef

コンテナのIP固定化やDockerfile作成といったこともご説明したいところですが、
Dockerについてはこれにて終了としたいと思います。

ありがとうございました。


DACエンジニア採用情報

  関連記事

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

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

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

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

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 / …

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

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

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

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

logomono-tableau-software-mono
Tableauを利用してMySQLとRedshiftのクロスDBジョインを実現する

はじめに RedshiftやTreasureDataなどのデータマート用のDBにはID単位の解析結果が格納され、ローカルのMySQLにはIDに紐づいた名称マスタが管理されている構成の場合、データマートのクロス集計結果に対してIDに紐づいた名称を付与したいことがあります。 データマート用に用意したDB …

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

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

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

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

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

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

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

こんにちは。 インフラ開発部の上田です。 普段は自社開発システムのインフラ担当として、日々頑張って仕事をしています。 今回は、近年話題になっているDockerについて、取り上げてみようと思います! なぜDockerなのか・・・? そもそもDockerとは何か・・・?   当社では様々なサー …