マネージドクラウドを使ってみる (PHP編)

# はじめに

GMOペパボさんが提供されている「ロリポップ! マネージドクラウド」に関して、昨日以下のような記事を書きました。

- [マネージドクラウドを使ってみる (WordPress編)](https://qiita.com/kunit/items/21c90a7a590df83146f0)

とても簡単にWordPressのサイトを作れるなぁという印象でした。

で、その続きといってはあれですが、PHPコンテナを起動して、いろいろ調べてみたいと思います。

(注) ロリポップ! マネージドクラウドでは、その他に Ruby on Rails と Node.js のコンテナが作れますが、私の力量ではそれらは詳しく調査等ができないので、他の方よろしくお願いします・・・

# PHPコンテナ作成

既に WordPress コンテナを追加しているので、今回は新規追加としてPHPコンテナを追加します。

プロジェクト一覧の画面の「新規追加」ボタンを押すと、プロジェクト作成画面に進みます。

![project-list.png](https://qiita-image-store.s3.amazonaws.com/0/111934/dec68f46-2b01-32d6-db7a-d8a1b3c48aa7.png)

前回の記事では、WordPressを選びましたが、今回はPHPを選択します。

![project-add-php.png](https://qiita-image-store.s3.amazonaws.com/0/111934/3f550cfb-2752-0f9e-a8b2-6175202b6a85.png)

PHPプロジェクトでは入力項目は以下の2つだけです。

- カスタムドメイン
    - 独自ドメインを持っている場合設定する
    - 独自ドメインを持ってない場合は「ドメインをお持ちでない場合はこちら」のリンクをクリックして、「lolipop.io」のサブドメインをつける
        - サブドメインを自分でつけないとシステム側で自動付与される
- データベースパスワード
    - 自動的に準備されるMySQLデータベースの接続パスワードを設定する

上記の2つを設定して、プロジェクトを作成すると、これまたサクッと完了します。

![project-add-success.png](https://qiita-image-store.s3.amazonaws.com/0/111934/62d8369d-3ec9-7d69-6dd3-4a105c29d9ba.png)

# 作成されたサイトを見てみる

「あなたのウェブサイトを見る」ボタンをクリックすると以下のようなデザインのページが表示されます。

![default-page.png](https://qiita-image-store.s3.amazonaws.com/0/111934/536bdcd4-4862-9308-c769-6572b529ffc5.png)

# 作成されたコンテナの状態

2018/04/21 現在以下のような形でした。

- PHPのバージョンはもちろん 7.2.4(最新状態)
- ssh接続をすると、接続ユーザのホームディレクトリが `/var/www` になっている
- `/var/www/html` がドキュメントルートとして設定されている
- `/var/www/html` には初期ページを表示するための `index.html` と `img` ディレクトリおよび画像ファイルのみがある

前回の記事で作成した WordPress コンテナは、`/var/www/html` 以下に WordPress 一式が最初から入っているだけで、基本的には同じ構成だと思います。

# コンテナの状態をさらに詳しく

ssh接続したときに入れるのは「SSHコンテナ」というもので、これは実際にWebページを表示しているコンテナではありません。

実際にプロセスを見てみても以下のように、sshdプロセスだけが動いているコンテナということですね。
このコンテナは、ssh接続した際に起動して、sshを切断したあと一定時間で停止するという形になります。

```sh
$ ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  1.1  65600  6092 ?        Ss   02:47   0:00 /usr/sbin/sshd -D
root          6  0.0  1.1  65608  6220 ?        Ss   02:47   0:00 sshd: dummy-user [priv]
dummy-u+     14  0.0  0.5  65608  3028 ?        S    02:47   0:00 sshd: dummy-user@pts/0
dummy-u+     15  0.0  0.6  18324  3384 pts/0    Ss   02:47   0:00 -bash
dummy-u+     28  0.0  0.5  34424  2860 pts/0    R+   02:56   0:00 ps aux
```

では、この「SSHコンテナ」で何ができるかというと、Webページを表示している「PHPコンテナ」とデータボリュームをnfsで共有しているので、「SSHコンテナ」経由でWebコンテンツのデータを修正するということになります。

(注) このドキュメントで「PHPコンテナ」と書いているものは、プロジェクト詳細画面では「Webコンテナ(PHP)」のことです。

「PHPコンテナ」と「SSHコンテナ」で共有されているデータボリューム(ディレクトリ)は以下の3つです。

- `/var/www`
    - webページとして表示するためのデータを永続化するためのデータボリューム
    - 既に説明したとおり `/var/www/html` 以下がドキュメントルートになってる
    - `/var/www` 以下においたファイルはコンテナが再起動しても永続化される
- `/var/log/container`
    - アクセスログを永続化するためのデータボリューム
    - アクセスログおよびエラーログを閲覧するために用意されている
    - `/var/log/container/[プロジェクト名」-ランダム文字列/` にアクセスログとエラーログがある
        - 【疑問】 このランダム文字列はなんだろう？
- `/etc`
    - 各種設定を 永続化するためのデータボリューム

上記でわざわざ「永続化するための」と書いたのは、以下のことを強調するためです。

- 本来「マネージドクラウド」はコンテナ技術を使って動作している
- コンテナは再起動するとコンテナの状態はいつも同じ状態にもどる
    - 起動後の修正は破棄される
- 破棄されると困るものは永続化する必要がある

例えば、さくらインターネットさんがつい最近正式サービスインされた「[Arukas](https://arukas.io/)」では、永続化のためのデータストレージは提供されていない=コンテナを再起動したら基本的にはデータはすべて破棄される前提でサービスを考えないといけないことになります。

それに比べると、マネージドクラウドは10GBのデータストレージが提供されており、そのデータストレージ上でWebコンテンツが管理できるというのは面白い構成だなぁと思っています。

例えば、今回立ち上げたPHPコンテナにしばらくアクセスが来ない状態が続くと、PHPコンテナは停止します。

以下のスクリーンショットを見ていただくと、起動しているコンテナが「0台」になっています。

![container-stop.png](https://qiita-image-store.s3.amazonaws.com/0/111934/6eec1a6b-0f0e-5c4b-f9e2-b46d8424e8d7.png)

この状態で、再度Webページにアクセスすると「PHPコンテナ」が即座に起動します。

以下のスクリーンショットを見ていただくと、起動しているコンテナが「0台」から「1台」になっているのがわかります。

(注) 停止してるからといって、次のアクセス時に時間がかかるとかいうことはなかったです。普通にアクセスできたように見えました。コンテナは本当に一瞬で起動しているようです。すごい・・・

![container-start.png](https://qiita-image-store.s3.amazonaws.com/0/111934/041c1737-6f64-684c-7133-67ebc301cba2.png)

上記のように、「PHPコンテナ」が停止している状態のときに、「SSHコンテナ」経由でWebコンテンツの修正が可能ですし、その修正したデータは次に「PHPコンテナ」が起動した際にきちんと反映されます。

そして、アクセスが増えた際に、同じデータボリュームを参照した「PHPコンテナ」をさくっと増やしてしまえばいいというのが、マネージドクラウドのオートスケール機能ということになります。

# PHPコンテナに入っているPHPについて

PHPのバージョンは 7.2.4 であることは既に書きましたが、PHP拡張がどういうものが入っているのかが気になっている方も多いと思います。

`php -m` の結果は以下のとおりです。最近のフレームワークだと必須なことが多い intl 拡張は入ってますし、CakePHP2 で必要となる mcrypt も入ってますね。

```sh
$ php -m                                                                                                                                                   [PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
imap
intl
json
libxml
mbstring
mcrypt
mysqli
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
soap
sockets
sodium
SPL
sqlite3
standard
tidy
tokenizer
xml
xmlreader
xsl
zip
zlib
```

実は、上記のもの以外に、とある拡張が入っているのですが、それはあえて出さないでおきます。実際にマネージドクラウドを使ってみて、「おお、こんなものをつかっているのか！」と驚いてください。(あえて伏せる必要があるのかはあれですが、個人的におお！と思ったのでそれを共有したいだけです)

# まとめという名の公開質問状

PHPの実行環境をさくっと立ち上げることができて、気軽に運用できるというのはとても便利だなぁと思う「マネージドクラウド」ですが、今後どんな方向に進化していくのがとても興味があります。

既にTwitterで中の人にいくつか質問してしまってるわけですが、使えば使うほどこれはどうなるんだろうと思うことがあるので書いておこうと思います。

- 現状、「PHPコンテナ」の手動での起動/停止は準備されていないが、今後準備されるのだろうか？
    - 何かの理由で自分で再起動したくなることがある気がするんだが、今それができない
    - 本番運用ではなく、開発目的で使う場合は必要なときだけ起動するといった使い方がある気がするが、今は起動/停止がアクセスの有り無しでしか制御されない
- 現状、xdebug が入っていないので、「PHPコンテナ」を開発利用が少々つらいのだが、xdebug拡張のON/OFFみたいなものは準備されるのだろうか？
    - 「PHPコンテナ」の他に「PHPコンテナ+xdebug(開発用)」みたいなプロジェクトテンプレートでもいいかも？
- 現状、ドキュメントルートが `/var/www/html` 固定だが、これを変更可能にすることはできるだろうか？
    - 例えば、CakePHP3の運用をしたい場合、`/var/www` 以下に CakePHP3 のプロジェクトを展開した場合、 `/var/www/webroot` がドキュメントルートだったらうれしいなぁみたいな
    - 「Ruby on Rails」というプロジェクトテンプレートがあるくらいだから、今後は「CakePHP3」とか「Laravel5.6」みたいなテンプレートができるのかな？
- php.ini の設定で、 タイムゾーンの設定が UTC になっているが、 プロジェクト詳細画面から `Asia/Tokyo` に設定変更するということはできるようになるだろうか？
- 現状、MySQLはセットで起動するようになっているが、オプションでいいので、Memcached/Redisコンテナを起動して使えるようになったりしないだろうか？

# 追記:いろんなもののバージョンチェック(2018/04/22現在)

ちょっと気になって、「SSHコンテナ」でチェックしてみました。

### git

```sh
$ git --version
git version 2.7.4
```

### mysql-client

```sh
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper
```

### PHP

(注) 例によってとある拡張の表示を消してます

```sh
$ php -v
PHP 7.2.4 (cli) (built: Apr  3 2018 09:34:07) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
```

### Ruby

```sh
$ ruby -v
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]
```

### Python

```sh
$ python -V
Python 2.7.12

$ python3 -V
Python 3.5.2
```

### Perl

```sh
$ perl -v

This is perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux-gnu-thread-multi
(with 60 registered patches, see perl -V for more detail)

Copyright 1987-2015, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
```

### vi

```sh
$ vi --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge version without GUI.  Features included (+) or not (-):
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic          +file_in_path    +mouse_sgr       +tag_old_static
+autocmd         +find_in_path    -mouse_sysmouse  -tag_any_white
-balloon_eval    +float           +mouse_urxvt     -tcl
-browse          +folding         +mouse_xterm     +terminfo
++builtin_terms  -footer          +multi_byte      +termresponse
+byte_offset     +fork()          +multi_lang      +textobjects
+channel         +gettext         -mzscheme        +timers
+cindent         -hangul_input    +netbeans_intg   +title
-clientserver    +iconv           +packages        -toolbar
-clipboard       +insert_expand   +path_extra      +user_commands
+cmdline_compl   +job             -perl            +vertsplit
+cmdline_hist    +jumplist        +persistent_undo +virtualedit
+cmdline_info    +keymap          +postscript      +visual
+comments        +langmap         +printer         +visualextra
+conceal         +libcall         +profile         +viminfo
+cryptv          +linebreak       -python          +vreplace
+cscope          +lispindent      +python3         +wildignore
+cursorbind      +listcmds        +quickfix        +wildmenu
+cursorshape     +localmap        +reltime         +windows
+dialog_con      -lua             +rightleft       +writebackup
+diff            +menu            -ruby            -X11
+digraphs        +mksession       +scrollbind      -xfontset
-dnd             +modify_fname    +signs           -xim
-ebcdic          +mouse           +smartindent     -xsmp
+emacs_tags      -mouseshape      +startuptime     -xterm_clipboard
+eval            +mouse_dec       +statusline      -xterm_save
+ex_extra        +mouse_gpm       -sun_workshop    -xpm
+extra_search    -mouse_jsbterm   +syntax
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H   -Wdate-time  -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc   -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim        -lm -ltinfo -lnsl  -lselinux  -lacl -lattr -lgpm -ldl     -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm
```