DACエンジニアブログ:アドテクゑびす界

DACのエンジニアやマーケター、アナリストが執筆するアドテクの技術系ブログです。

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

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

前回、前編として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についてはこれにて終了としたいと思います。

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