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

     - OS, 開発ツール  


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

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

前編はこちらです

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

■複数プロセス起動

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

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

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

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

[html autolinks=”true”]
[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 /]#
[/html]

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

●nginxインストール

[html autolinks=”true”]
[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: nginx-1.9.0.tar.gz'

100%[=============================================================================================>] 854,462 278K/s in 3.0s

2015-XX-XX XX:XX:XX (278 KB/s) - 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
[/html]

●nginx設定

[html autolinks=”true”]
[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
~省略~
[/html]

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

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

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

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

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

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

[html autolinks=”true”]
[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
[/html]

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

[html autolinks=”true”]
[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
[/html]

※ includeを有効化する

[html autolinks=”true”]
###############################################################################
## Includes
###############################################################################
##
## It is possible to include additional configuration parts from other files or
## directories.
#
include /etc/monit.d/*
[/html]

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

[html autolinks=”true”]
[root@ClientServer etc]# mkdir /etc/conf.d/
[root@ClientServer etc]# cd conf.d/
[/html]

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

●nginx起動プロセス

[html autolinks=”true”]
[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
———————
[/html]

●sshd起動プロセス

[html autolinks=”true”]
[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
———————
[/html]

●起動テスト

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

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

[html autolinks=”true”]
[root@DockerServer /]# docker commit centos64:6.4
[/html]

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

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

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

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

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

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

[html autolinks=”true”]
[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
~省略~
[/html]

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

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

[html autolinks=”true”]
[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
~省略~
[/html]

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

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

[html autolinks=”true”]
[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 ~]$
[/html]

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

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

[html autolinks=”true”]
[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
[/html]

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

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


DACエンジニア採用情報

  関連記事

Safari10(iOS10)のインライン動画再生についてまとめてみた

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

Vagrantの機能を使って開発環境の効率をあげてみた。

プラットフォーム・ワンのシステムの運用・保守担当のエンジニアです。 保守の仕事に関わると、 ユーザからのお問い合わせだったり、監視アラートによる検知から システムを調査することがあります。 ログとソースコードを見て、不具合を特定し改修する。 すぐできればカッコいいですが、 「本番環境に反映して別のエ …

modern.IEを使ってMac上でWindows10を動かす

Microsoftが提供している modern.IE というプロジェクトがある。そこで提供されている仮想環境を使って、MacにWindows10をインストールしてみる。ちなみに、このプロジェクトの本来の目的はInternet Explorerの表示確認やデバッグの支援。 VirtualBoxの準備 …

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

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

初心者がRailsで開発 – deviseでユーザー認証設定 –

こんにちは、2年目のYukaです。 開発部所属でありながら実は、、 実際に自分で手を動かして開発する機会がなかなかありませんでした。。 しかしついに、、、 開発初心者がRailsでWebアプリの開発に挑戦します!! 今回のゴールは社内でも使用しているGoogleアカウントで簡単にログインができるよう …

x-callback-urlを使ってみた

x-callback-urlとは? iOSのアプリ間連携の仕様の一つみたいです。簡単に言うと、ディープリンクを行うためにカスタムURLスキームを利用するが、アプリ毎にバラバラな規則でURLスキームを設定するとアプリ間連携をスムーズに行うことができないため、どのような規則でURLスキームを設定するかを …

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

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

全ファイルを検索
意外と知らないかも? Chrome DevTools の機能10選

みんな使っている Chrome DevTools。 Web開発やトラブルシューティングには必須ですが、便利な機能を知らないで使っている人がいたり、Web で使い方を調べても古い情報だったりすることがあるので、部内で Chrome DevTools についての勉強会を開催しました。 ここでは、その中か …

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

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

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

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