DockerのインストールとWordPressの起動 - さくらのクラウド超入門・サーバ編(3)


# 概要

前回はサーバの安全性を高めるため [TCP Wrapper で SSH のアクセス制限](https://qiita.com/zembutsu/items/c432a3e096729e181df9)  をしました。次は、クラウドを使ってインフラ（IaaS）の操作を行う前段階（の続き）です。

実際のアプリケーション動作環境を想像しやすいように、開発環境から整えます。コンテナを使った開発・実行環境である Docker をセットアップし、WordPress （PHP+MySQL）のコンテナを Docker Compose で実行する手順と、サーバに対する電源操作手順を学びます。

# 解説

## アプリケーション開発と操作を簡単にする Docker とは？

Docker 普及前後で、サーバを準備した後の環境構築方法が大きく変わりました。Apache（アパッチ） や PHP（ピーエイチピー） などウェブサーバや言語開発環境を整える前に、今は「Docker」（ドッカー）をセットアップする方法があります。Docker があれば、yum （ヤム）や apt （アプト）を使わなくても、1つのホスト上で複数のサーバ機能や開発言語の環境を同居できます。 Docker についての詳細は、 [こちらのスライド資料をご覧ください](https://www.slideshare.net/zembutsu/what-isdockerdoing) 。

Docker は、アプリケーションを簡単迅速に開発・移動・実行するためのプラットフォーム（プログラム群）です。Docker Engine（エンジン）というプログラムを通して、アプリケーションをコンテナ（と呼ばれる、名前空間やリソースを分離する技術の組み合わせた、プロセス間の隔離という「特別な状態」）として操作できます。Docker は 2013 年に dotCloud, Inc.（当時のドットクラウド社、現在 はDocker, Inc.）によってオープンソースとして公開されており、誰でも自由に使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/21be470b-6fe7-5255-d18f-5344b6c56c88.png)


Docker でコンテナを操作するには Docker Engine をセットアップする必要があります。セットアップ後は `docker`  コマンドを使うだけで、コンテナ化したアプリケーションを操作できます。

## Docker のインストール用スクリプトの利用

CentOS 7 での Docker インストールは、 [get.docker.com])(https://get.docker.com) で配布されているインストール用スクリプトの利用が便利です。覚えておくのは **get.docker.com**  というホスト名のみ。これをブラウザで開くと、インストール用スクリプトが表示されていて、さらに中にインストール用のコマンドも書かれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/a5488fbc-3c1b-d117-ad03-4e79c85b4276.png)


Docker Engine の正確な手順は、 [パッケージ等のセットアップ](https://docs.docker.com/install/linux/docker-ce/centos/) が必要です。本番向けではないテストや検証用途であれば、Docker Engine のリポジトリと常に最新安定版の Docker Engine をセットアップする方法が簡単です（逆に言いますと、インストールする時点で Docker のバージョンが変わってしまうため、本番環境での利用は推奨されていません）。

インストールするには、サーバにログイン後、以下のコマンドを実行します。

```
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
```

コマンド実行直後は 20 秒間の待機時間です。その段階で `Ctrl+C` をキー入力するとインストールを中断できます。進行後は、セットアップが完了するまで待ちます。

セットアップが終わったら、Docker Engine デーモン（dockerd）の起動と、サーバ起動時に自動起動するコマンドを実行します。

```
systemctl start docker
systemctl enable docker
```

それから、 `docker version` コマンドを実行し、Docker のバージョン情報に `Engine:` の項目が出るかどうかを確認します。もし Engine の項目が表示されず `Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?`  が出る場合、Docker のセットアップが完了していない可能性があります。あるいは、 Docker Engine が停止している場合は、起動します。

以上で Docker のセットアップ作業は完了です。

## Docker で Nginx を動かす

Nginx コンテナを起動して、ウェブサーバが表示できるかどうか確認しましょう。

次のコマンドは `nginx:alpine` という Nginx が Alpine Linux （アルパイン・リナックス）上で動作する小さな Docker イメージを使い、 `--detach` （デタッチ）モードというバックグラウンドでコンテナを実行し、かつ、 `--publish 8080:80` でホスト側ポート `8080` をコンテナ内のポート `80` に割り当て（マッピング）し、 `--name` でコンテナ名を `mynginx` とします。

```
docker run --detach --publish 8080:80 --name mynginx nginx:alpine
```

それから `docker ps` コマンドを実行すると、 `mynginx` という名前でコンテナが実行中（ `Status` が `Up` ）になっているのがわかります。

この状態で、ウェブブラウザを使い、 `http://<サーバのIPアドレス>:8080` を実行します。次のような「Welcome to nginx!」（nginxへようこそ！）と表示されれば正常です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/eef572e9-2ef6-067e-6679-cd26287b5741.png)


実行しおわった後の nginx コンテナは停止・削除します。

```
docker kill mynginx
docker rm mynginx
```

## Docker Compose のインストール

WordPress （ワードプレス）のようなアプリケーションは、複数のプログラムが動作します。複数のコンテナを扱うには、Docker Engine を単体で使うのよりも、Docker Compose（コンポーズ）という名前のツールと一緒に使うのが便利です。コンテナに関する情報などを YAML （ヤムル）ファイルに記述しておきます。

Docker Compose をインストールした環境であれば、コマンド `docker-compose up` を実行するだけで、複数のプログラムを同時に制御できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/752db1cc-72c0-4d35-4898-3b70faf4a839.png)


Docker Compose のインストール方法は複数ありますが、ここでは yum を使ってパッケージをインストールします。

```
yum -y install docker-compose
```

インストール後は、次のようにして、バージョン情報が表示されるかどうかを確認しましょう。

```
# docker-compose  version
docker-compose version 1.18.0, build 8dd22a9
docker-py version: 2.6.1
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017
```

## Docker Compose で WordPress を動かす

Docker Compose でプログラムを動かすには、まず作業用のディレクトリを作成し、移動します。ここでは `mywp` をいう名前のディレクトリを作成して移動します。

```
mkdir mywp
cd mywp
```

それから、 `vi docker-compose.yaml`  などを実行し、同じディレクトリ内に YAML ファイルを作成します。内容は以下の通りにします（ 参考： [Docker Hub の wordpress イメージのドキュメント（英語）](https://hub.docker.com/_/wordpress) ）。 

または、

```
curl https://gist.githubusercontent.com/zembutsu/e46c2a8f2ebb2ef4347a39914ba8e145/raw/9283112c756b7dfdc8066ca456b9adc4d987d909/docker-compose.yaml -o docker-compose.yaml
```
を実行して、 docker-compose.yaml を作成します。

```docker-compose:yaml
version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 80:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:
```

ここまで準備すると、同じディレクトリ内に `docker-compose.yaml` が出来ています。その状態で、次のコマンドを実行し、 Docker イメージのダウンロード（pull） と、Docker Compose のサービスとして複数のコンテナを同時実行します。

```
docker-compose pull
docker-compose up -d
```

そして、 `docker-compose ps` コマンドを実行し、２つのコンテナ（ `mywp_wordpress_1` と `mywp_db_1`）の `State` が `Up` になっているのを確認します。

```
# docker-compose ps
      Name                    Command               State          Ports
-------------------------------------------------------------------------------
mywp_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp
mywp_wordpress_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:80->80/tcp
```

今度はウェブブラウザで `http://<サーバのIPアドレス>` を実行します。今回の docker-compose.yaml の設定では、WordPress の `wordpress` コンテナを、ホスト側のポート 80 に割り当て（マッピング）するようにしました。そのため、ポート番号の入力は不要です（ウェブブラウザは、デフォルトのポート 80 を自動的に表示します）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/07690bb8-7983-f4e6-4d14-a364581fe391.png)


この図のように、WordPress 初期画面が表示されたら、初期設定をしてみましょう。

1. 言語一覧では「日本語」を探し、「続ける」をクリックします。
2. 次の画面では必要情報を入力の上「WordPressをインストール」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/6e7ac57b-3b67-3a49-17b6-244252a68728.png)


さらに次の画面では「ログイン」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/dcb5d1ec-9280-a1b2-0d1e-e6319b3beb6c.png)



そして、ユーザ名とパスワードを入力して「ログイン」しましょう。WordPress の管理画面にログインできたら、サイト名を確認したり、投稿したり、操作してみましょう。



また、 `http://<サーバのIPアドレス>` を実行し、 WordPress のコンテンツが表示されるのも確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/6dc5e681-024d-d2ce-5d01-18808d4d7429.png)


以上で Docker Compose を使った WordPress のセットアップが完了しました。

## サーバ電源操作と WordPress の動作確認

あとは、サーバが再起動しても表示されるかどうか、仮想マシンの停止・再起動を行い確認します。

さくらのクラウドのコントロールパネルを、ウェブブラウザで開き、「サーバ」一覧で対象サーバの情報を確認します。それから「サーバの行」をクリックして、行頭にあるチェックボックスに印を入れ、「電源操作」→「シャットダウン」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/302d7373-49a6-86c9-ef0e-1400f10f7a17.png)


確認画面が表示されますので、作業対象のサーバが違っていないのを確認し、「シャットダウン」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/40ae141f-b5f4-ac26-461e-d166b8f331fc.png)


操作確認ダイアログでは「実行」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/f4a7b0e3-41ba-91a2-a7ec-29bcdbc13e82.png)


そうすると、シャットダウン（停止）命令がサーバに対して送られます。ステータスが「成功」になるまで待ってから、次の確認画面は「閉じる」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/717beefe-8c9d-8206-db3a-e2b931b14311.png)


そのままお待ちいただくと、サーバの状態を表す「緑色」のステータス（起動）が、「赤色」（準備中）から「灰色」（停止）に変わります。もし変わらなければ、コントロールパネル上の再読込ボタンをクリックします。

停止後は、再び起動しましょう。再びサーバをクリックしてチェックを入れ、「電源操作」→「起動」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/187b2c01-9c60-6677-9455-9d983f3b35c1.png)


対象のサーバを確認し、「起動」ボタンをクリックします。

あとは、確認ダイアログでは「実行」をクリックし、次の画面ではステータスが「成功」になってから「閉じる」をクリックします。しばらく待ち、サーバが起動状態になれば SSH の接続も出来ますし、WordPress も自動的に起動します。

ブラウザから `http://<サーバのIPアドレス>` を開き、 WordPress のサイトが表示できるかどうか確認します。


# 振り返り

Docker でコンテナを実行するには、Docker Engineのセットアップが必須です。 [get.docker.com](https://get.docker.com) のセットアップ用スクリプトを使って手軽にセットアップし、Nginx ウェブサーバをコンテナで起動しました。 また、複数のコンテナを簡単に扱うためには、Docker Compose が便利であり、WordPress アプリケーションを Docker Compose で実行しました。あわせて、サーバの電源操作の仕方も学びました。

次回以降は、ここで作成した環境を使って、サーバのコピー方法やディスクの操作方法、クローンの作成の仕方を学びます。

# 参考情報

- [Docker Documentation](https://docs.docker.com/)
  - [Install using the convenience script (docs.docker.com)](https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-convenience-script)
- [Overview of Docker Compose](https://docs.docker.com/compose/)