WordPressのサイトをローカル環境(docker)に移行する方法 | もやしほーむ WordPressのサイトをローカル環境(docker)に移行する方法 | もやしほーむ

もやしほーむ

作成したプログラムの紹介や、日々の徒然について更新

WordPressのサイトをローカル環境(docker)に移行する方法

time 2022/05/09

WordPressのサイトをローカル環境(docker)に移行する方法

sponsored link

目次

WordPressのサイトをローカル環境(docker)に移行する方法について

docker(ドッカー)を使用する

dockerをインストールする

まずは、dockerをインストールしてローカル環境を作るところから始めたいと思います。

Windows Home に Docker Desktop をインストール

こちらのサイトが参考になるかと思います。

Docker Hub」より、最新版のdockerをインストールします。

「Docker Desctop for Windows」をクリックします。すると自動でインストールが始まります。

デスクトップにショートカットを作りたい場合は、「Add shortcut to desktop」にチェックを入れて、「OK」を押します。

インストールが開始されるので、しばらく待ちます。

インストールが完了したら、「Close」を押して終了します。

左下のWindowsマークを押して、スクロールさせたところから「Docker Desktop」がインストールされていることを確認してください。

「Docker Desctop」を起動します。(“C:\Program Files\Docker\Docker”下にdockerはインストールされます)

dockerの初回起動時に、規約に同意するかどうかを聞かれるのでチェックを入れて同意(Accept)します。


次の画面が出るので、しばらく待ちます。

チュートリアルは特に今回は必要がないと思うので、「Skip tutorial」を押します。

これで「docker」を使う準備は整いました。

以下、このサイトを参考に、作業を進めていきたいと思います。

Docker 公式 httpd イメージを利用して Docker を体験してみよう

次に、コマンドプロンプトまたはPowerShellから「docker」でイメージをインストールしていく手段について紹介していきます。

imageをインストールする(Apacheのhttpd)

まず、dockerにimageがインストールされているかを確認するコマンド(docker images)を入力してみます。

PS C:\Users\rabit> docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

何もインストールされていないことが確認できます。

では、Apacheをインストールしていきます。

httpdというimageをインストールすることでApacheがインストールされます。コマンドは「docker pull httpd」となります。

PS C:\Users\rabit> docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
1fe172e4850f: Pull complete
e2fa1fe9b1ec: Pull complete
60dd7398e74e: Pull complete
ea2ca81c6d4c: Pull complete
f646c69a26ec: Pull complete
Digest: sha256:e02a2ef36151905c790efb0a8472f690010150f062639bd8c0760e7b1e884c07
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest

コマンドを打って、イメージがインストールされたかを確認します。コマンドは「docker images」です。

PS C:\Users\rabit> docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        latest    c30a46771695   2 weeks ago   144MB

ここで重要となるのは、IMAGE IDです。コンテナに乗せた後で必要となる番号となります。

コンテナという言葉が出てきました。dockerというのは、イメージを取得して、コンテナに乗せて動かすというものです。コンテナに乗せるには、「run」コマンドを使用します。

取得したApacheをコンテナ(Container)で走らせる

ポート8080を使用して、localhostでApacheを走らせてみます。

PS C:\Users\rabit> docker run -d -p 8080:80 httpd
cbff091ab5a2a26228c1115f2e08b56b5336596bec22b1ee053405676a8811d2

今回「docker run」コマンドを走らせたときに使ったオプション、「-d」と「-p」ですが、それぞれ次のような意味になります。

「-d」・・・コンテナの実行をバックグラウンドで行います。これを指定しなかった場合、ターミナルのコマンド操作が「Ctrl+C」を押すまでできなくなり、コンテナに操作を奪われてしまいます。

「-p」・・・コンテナのポート番号とローカルのコンピュータのポート番号を紐づけるオプションです。今回実行したコンテナはhttpdの機能を持っているので、80番ポートでサービスが開始されます。ただし80番ポートでの待ち受けを開始したのはあくまでもコンテナであり、docker を実行しているローカルマシンではありません。 そこでこの「-p」オプションでコンテナとローカルのポートを紐づけることで、あたかもローカルマシンでhttpdサービスを提供しているかのような状況を作ることができます。上の例では、ローカルマシンの8080番ポートをコンテナの80番ポートに紐づけています。

試しにWebブラウザを立ち上げて「http://localhost:8080」と打ってみてください。成功であれば画面に、「It works!」と表示されるはずです。また、ポートを80として実行すれば、80を省略して「http://localhost」だけで画面を表示することができます。

実行中のコンテナを確認する

PS C:\Users\rabit> docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                NAMES
cbff091ab5a2   httpd     "httpd-foreground"   12 minutes ago   Up 12 minutes   0.0.0.0:80->80/tcp   boring_edison

ここで、コンテナのIDを確認しておきます。確認したIDは、コンテナを停止させるときに使用します。

コンテナを停止させてみる

PS C:\Users\rabit> docker stop cbff091ab5a2
cbff091ab5a2

dockerのコンテナのプロセスから、Apacheが外れたことがコマンド「docker ps」で確認できます。

PS C:\Users\rabit> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

これで、一通りの操作ができました。補足ですが、imageファイルを消したい場合には、「docker rmi -f httpd」コマンドで行うことができます。

停止させたコンテナを再起動させる

停止させたコンテナを確認するには、「docker ps -a」コマンドを使います。

PS C:\Users\rabit> docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS                     PORTS     NAMES
33b9b0587d2e   httpd     "httpd-foreground"   10 minutes ago   Exited (0) 7 seconds ago             determined_bell

再起動させるには、「docker start」コマンドを使います。

PS C:\Users\rabit> docker start 33b9b0587d2e
33b9b0587d2e
PS C:\Users\rabit> docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                NAMES
33b9b0587d2e   httpd     "httpd-foreground"   12 minutes ago   Up 20 seconds   0.0.0.0:80->80/tcp   determined_bell

プロセスが動いていることが確認できます。

PS C:\Users\rabit> docker exec -it 33b9b0587d2e bash
root@33b9b0587d2e:/usr/local/apache2# 

上のコマンド(docker exec)で、docker(Linux環境下)内にアクセスすることができます。

root@33b9b0587d2e:/usr/local/apache2# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs  modules
root@33b9b0587d2e:/usr/local/apache2# cd htdocs
root@33b9b0587d2e:/usr/local/apache2/htdocs# ls
index.html
root@33b9b0587d2e:/usr/local/apache2/htdocs# cat index.html
<html><body><h1>It works!</h1></body></html>
root@33b9b0587d2e:/usr/local/apache2/htdocs#

また、テストで表示されるindex.htmlファイルですが、「/usr/local/apache2/htdocs」の下に置かれていることがわかりました。自分の作ったサイトを表示する場合は、ここを指定して変える必要がありそうですね。

下準備をしてから、やってみました。

PS C:\Users\rabit> docker run -d -p 80:80 -v "C:\Users\rabit\htdocs\:/usr/local/apache2/htdocs/" httpd
ee5c90ce0bf2b76744a10ca98eea1c35c60d82107fb281e757c33de48e5cb9df

これでローカル環境を、docker内部で動かすことができることが確認できました。ただ、PHPが動かなかったです。まあ当たり前ですよね、ただのApacheなので。

どうやら、php:7.4-apacheというimageでやらないといけないようです。

とりあえず、「http」で動くことはわかりました。これから、「SSL」環境下で、Apacheを動かす方法について触れていこうと思います。

続きは、明日。では。

php:7.4-apacheを導入する

php:7.4-apacheのimageを取得

PS C:\Users\rabit> docker pull php:7.4-apache
7.4-apache: Pulling from library/php
1fe172e4850f: Already exists
012a3732d045: Pull complete
43092314d50d: Pull complete
4f615e42d863: Pull complete
cd39010a4efc: Pull complete
d983c9ce24de: Pull complete
ecbdd59ae430: Pull complete
9d02b88c8618: Pull complete
50a246031d43: Pull complete
a6c0267e6c34: Pull complete
787ca6348cef: Pull complete
da8ad43595e2: Pull complete
e191f9e80e29: Pull complete
Digest: sha256:5ef51d9bf6851f6c4c8e11c9020a5dc505716370ad920c3019c01d0e82fdd953
Status: Downloaded newer image for php:7.4-apache
docker.io/library/php:7.4-apache

imageを取得します。

php:7.4-apacheをphp74という名前を付けて実行する

PS C:\Users\rabit> docker run --name php74 -d -p 80:80 -v "C:\Users\rabit\htdocs\:/usr/local/apache2/htdocs/" php:7.4-apache
8a37022d92b6387c5e3b52d55aa25b31bf0753ce21030152eca2eae877dc650a

実行します。

PS C:\Users\rabit> docker exec -it php74 bash
root@8a37022d92b6:/var/www/html#

起動した、php74に入ってみると、htmlの実行アドレスが表示されます。php74を「/usr/local/apache2/htdocs/」下で動かすと指定していたので、それが間違いであったことがわかりましたので、コンテナを「stop」させ、削除(rm)し、再度「/var/www/html」下で動かすように指定して実行します。

PS C:\Users\rabit> docker stop php74
php74
PS C:\Users\rabit> docker rm php74
php74
PS C:\Users\rabit> docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED       STATUS                      PORTS     NAMES
PS C:\Users\rabit> docker run --name php74 -d -p 80:80 -v "C:\Users\rabit\htdocs\:/var/www/html" php:7.4-apache
f3ee62febcfbd58c505a698c603b0830afd7fb49fb9a169011806f10a9ff31cf
PS C:\Users\rabit>

こうしたところ、サイトが表示されていることが確認できました。

Apacheの設定ファイルを調べる

PS C:\Users\rabit> docker exec -it php74 bash
root@f3ee62febcfb:/var/www/html# ls -l /etc/apache2/apache2.conf
-rw-r--r-- 1 root root 7224 Mar 14 16:28 /etc/apache2/apache2.conf
root@f3ee62febcfb:/var/www/html#

「docker exec」コマンドで、dockerのLinux環境に入り、その後、Apacheの設定ファイル(apache2.conf)の場所を確認します。

Apacheのサイト構成ファイルの場所を調べる

root@f3ee62febcfb:/var/www/html# ls -l /etc/apache2/sites-available/000-default.conf
-rw-r--r-- 1 root root 1332 Aug  8  2020 /etc/apache2/sites-available/000-default.conf
root@f3ee62febcfb:/var/www/html#

ファイルがあることが確認できます。

PHPの設定ファイルの場所を調べる

root@f3ee62febcfb:/var/www/html# php -r "phpinfo();" | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php
root@f3ee62febcfb:/var/www/html# ls /usr/local/etc/php -l
total 148
drwxr-xr-x 1 root root  4096 Apr 20 12:14 conf.d
-rw-r--r-- 1 root root 72554 Apr 20 12:14 php.ini-development
-rw-r--r-- 1 root root 72584 Apr 20 12:14 php.ini-production
root@f3ee62febcfb:/var/www/html#


これで、ApacheとPHPの設定ファイルの場所と名前が分かったので、それをホスト側(ローカル下)にコピーします。この作業は、一旦bashを抜けてホスト側で、「docker cp」コマンドを使って行います。

PS C:\Users\rabit> docker cp php74:/etc/apache2/apache2.conf .
PS C:\Users\rabit> docker cp php74:/etc/apache2/sites-available/000-default.conf .
PS C:\Users\rabit> docker cp php74:/usr/local/etc/php/php.ini-development .
PS C:\Users\rabit> docker cp php74:/usr/local/etc/php/php.ini-production .
PS C:\Users\rabit> ls


    ディレクトリ: C:\Users\rabit


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2020/08/08     16:47           1332 000-default.conf
-a----        2022/03/15      1:28           7224 apache2.conf
-a----        2022/04/20     21:14          72554 php.ini-development
-a----        2022/04/20     21:14          72584 php.ini-production

lsコマンドで、コピーが正しく行えたかを確認し、正しく行えたことがわかります。

apache2.confファイルとは、OpenSSLで証明書を作成してMAMPのローカル環境でSSL設定する方法(Windows)の記事で言うところの、httpd.confファイルになります。

000-default.confファイルとは、MAMPで言うところの恐らく、httpd-vhosts.confファイルに相当すると思われます。

php.ini-developmentファイルは、dockerのコンテナ内の「/usr/local/etc/php/php.ini」ファイルに相当します。

これらを編集して環境を作ると、こちら↓のサイトで書かれていました。参考にしてください。

Docker コンテナイメージの作成(Build)

ただ、自分の場合、SSL環境でのWordPressのサイトを構築しているので、更に、続きを書いていきたいと思います。

Apache+PHP+MySQLの環境を構築する

DockerでApache+PHP+MySQLの環境を構築してみる

こちらを参考にしました。docker-compose.ymlファイルが鍵となります。

ディレクトリ(フォルダ)構成

ディレクトリ
 |_docker-compose.yml
 |_Dockerfile
 |_config
 |   |_mysql
 |   |   |_my.cnf
 |   |   | |_my.conf
 |   |   |_init_scripts 
 |   |   | |_01_give_full_privileges_to_mysql_user.sh
 |   |_php
 |       |_php.ini
 |_htdocs
     |_index.php
     |_connect.php

ディレクトリ構成は、このようにしました。

docker-compose.ymlファイルの作成

version: '3.1'
services:
    php:
        build: .
        container_name: php74
        volumes:
            - ./config/php/php.ini:/usr/local/etc/php/php.ini
            - ./htdocs/:/var/www/html
        privileged: true
        ports:
            - 80:80
        depends_on:
            - mysql
    mysql:
        image: mysql:5.7
        container_name: mysql57
        volumes:
            - ./mysql:/var/lib/mysql
            - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
            - ./config/mysql/init_scripts:/docker-entrypoint-initdb.d
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=test_db
            - MYSQL_USER=test_user
            - MYSQL_PASSWORD=test_password
        ports:
            - 3306:3306
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        volumes:
            - ./phpmyadmin/sessions:/sessions
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=mysql
            - PMA_USER=root
            - PMA_PASSWORD=root
        links:
            - mysql
        ports:
            - 4040:80


「version: '3'」としていますが、これは参考にしたサイトでこのような指定が多かったのでこうしたまででした。なぜバージョン「3」なのかは不明で、実際に動かしているdockerのバージョンは「4.8.1」です。なんのバージョンを示しているのか不明ですが、とりあえずこのような指定とさせていただきました。

Dockerfileの作成

FROM php:7.4-apache

RUN apt-get update && apt-get install -y \
    libonig-dev \
  && docker-php-ext-install pdo_mysql mysqli opcache


COPY ./config/php/php.ini /usr/local/etc/php/

php.iniファイルをコピーしていますが、docker-compose.ymlファイルのほうでphp.iniファイルの場所を指定しているので、このコピーがいるのかは不明ですが、一応参考サイトでそう書かれているので、書いたままにしておきました。ちなみに「opcache」をおまじないのようにいれているのは、これを入れておくと、ローカル環境でも、多少の高速化が測れるからです。

configファイルの作成(my.conf)

my.confファイルの作成

[mysqld]
default_autentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-charctrer-set=utf8mb4

php.iniファイルの作成

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

[size]
memory_limit = "80G"
post_max_size = "80M"
upload_max_filesize = "80M"

phpファイルの作成

index.phpの作成

確認のための、phpinfoを表示させるページを作っておきます。

<?php
    phpinfo();

connect.phpの作成

DBとの接続確認用のコードを記述します。

<?php 
    try {
        $dsn = 'mysql:host=mysql;dbname=test_db;charset=utf8';
        $db = new PDO($dsn, 'test_user', 'test_password');

        $sql = 'SELECT version();';
        $contact = $db->prepare($sql);
        $contact->execute();
        $result = $contact->fetchAll(PDO::FETCH_ASSOC);
        var_dump($result);
    } catch (PDOException $e) {
        echo $e->getMessage();
        exit;
    }

作成したdocker-composeを実行

「docker-compose up -d」コマンドで起動します。

PS C:\Users\rabit\docker_local> docker-compose up -d
Creating network "docker_local_default" with the default driver
Building php
[+] Building 38.3s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.2s
 => => transferring dockerfile: 220B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.1s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/php:7.2-apache                                                  0.0s
 => [1/3] FROM docker.io/library/php:7.2-apache                                                                    0.8s
 => [internal] load build context                                                                                  0.2s
 => => transferring context: 225B                                                                                  0.0s
 => [2/3] RUN apt-get update && apt-get install -y     libonig-dev   && docker-php-ext-install pdo_mysql mysqli   36.7s
 => [3/3] COPY ./config/php/php.ini /usr/local/etc/php/                                                            0.1s
 => exporting to image                                                                                             0.4s
 => => exporting layers                                                                                            0.3s
 => => writing image sha256:53354114f494e73628bb6c0d7431d543b8fb733e2fce2947ee69b8409018bee6                       0.0s
 => => naming to docker.io/library/docker_local_php                                                                0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
WARNING: Image for service php was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating mysql57 ... done
Creating phpmyadmin ... done
Creating php72      ... done
PS C:\Users\rabit\docker_local>
PS C:\Users\rabit\docker_local> docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                  NAMES
c2bb132cbd73   phpmyadmin/phpmyadmin   "/docker-entrypoint.…"   13 seconds ago   Up 11 seconds   0.0.0.0:4040->80/tcp   phpmyadmin
7027b9771978   php:7.2-apache          "docker-php-entrypoi…"   13 seconds ago   Up 11 seconds   0.0.0.0:80->80/tcp     php72
6e463897e5f2   mysql:5.7               "docker-entrypoint.s…"   17 seconds ago   Up 13 seconds   3306/tcp, 33060/tcp    mysql57
PS C:\Users\rabit\docker_local>

「docker ps」コマンドで、コンテナが立ち上がっていることを確認できました。

環境が整ったかの確認作業

phpinfoの確認

http://localhost」へ接続します。

phpinfoが表示されたことが確認できました。

DBの接続確認

http://localhost/connect.php」を実行

バージョン情報など、dumpが表示されるはずなのですが、次のようなエラーが出てしまいました。

could not find driver

原因は、

php:
    build: .

とするところを、

php:
    image: php:7.4-apache

としていたことでした。(修正済みです)

array(1) { [0]=> array(1) { ["version()"]=> string(6) "5.7.38" } }

と、正しくDBを参照できたことが確認できました。

phpMyAdminへの接続

http://localhost:4040」へ接続したところ、無事画面が出ました。

DBへの接続は、できているということでしょうか。「データベースを作成する権限がありません」と出ていた問題は、ymlファイルのphpMyAdminの部分を、「PMA_USER=root」「PMA_PASSWORD=root」としたところ解決しました。

倉庫クエを参考に、接続できるかを確認してみました。すると、DBの設定のところでdocker独自の癖のようなものがあることがわかりました。

<?php
// DBのユーザー名とパスワード
$user = "root";     // docker環境
$pass = "root";     // docker環境

// DB接続(ローカル、ネットワーク切り替え)
$dbh = new PDO('mysql:host=mysql;dbname=moyasea_kanbi;charset=utf8', $user, $pass);
//$dbh = new PDO('mysql:host=mysql8.star.ne.jp;dbname=moyasea_kanbi;charset=utf8', $user, $pass);

$userと$passをymlファイルで設定した、phpMyAdminのユーザーとパスである「root」を指定する必要がありました。

また、「mysql:host=localhost」と通常書くところを「mysql:host=mysql」とする必要がありました。

参考までに。

これで、PHPの動作と、DBの動作を確認することができました。

次は、いよいよSSL接続について触れていきたいと思います。

docker環境で、SSL接続を行おう!

Chocolateyをインストールする

ターミナルを管理者権限で開き、次の文言を書いて、実行します。

PS C:\WINDOWS\system32> Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

すると、次のような文字が表示されて、Chocolateyのインストールが完了します。

Forcing web requests to allow TLS v1.2 (Required for requests to Chocolatey.org)
Getting latest version of the Chocolatey package for download.
Not using proxy.
Getting Chocolatey from https://community.chocolatey.org/api/v2/package/chocolatey/1.1.0.
Downloading https://community.chocolatey.org/api/v2/package/chocolatey/1.1.0 to C:\Users\rabit\AppData\Local\Temp\chocolatey\chocoInstall\chocolatey.zip
Not using proxy.
Extracting C:\Users\rabit\AppData\Local\Temp\chocolatey\chocoInstall\chocolatey.zip to C:\Users\rabit\AppData\Local\Temp\chocolatey\chocoInstall
Installing Chocolatey on the local machine
Creating ChocolateyInstall as an environment variable (targeting 'Machine')
  Setting ChocolateyInstall to 'C:\ProgramData\chocolatey'
WARNING: It's very likely you will need to close and reopen your shell
  before you can use choco.
Restricting write permissions to Administrators
We are setting up the Chocolatey package repository.
The packages themselves go to 'C:\ProgramData\chocolatey\lib'
  (i.e. C:\ProgramData\chocolatey\lib\yourPackageName).
A shim file for the command line goes to 'C:\ProgramData\chocolatey\bin'
  and points to an executable in 'C:\ProgramData\chocolatey\lib\yourPackageName'.

Creating Chocolatey folders if they do not already exist.

WARNING: You can safely ignore errors related to missing log files when
  upgrading from a version of Chocolatey less than 0.9.9.
  'Batch file could not be found' is also safe to ignore.
  'The system cannot find the file specified' - also safe.
chocolatey.nupkg file not installed in lib.
 Attempting to locate it from bootstrapper.
警告: Not setting tab completion: Profile file does not exist at
'C:\Users\rabit\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1'.
Chocolatey (choco.exe) is now ready.
You can call choco from anywhere, command line or powershell by typing choco.
Run choco /? for a list of functions.
You may need to shut down and restart powershell and/or consoles
 first prior to using choco.
Ensuring Chocolatey commands are on the path
Ensuring chocolatey.nupkg is in the lib folder
PS C:\WINDOWS\system32>

警告がでましたが、インストールできたと思います。確認するには、「choco list -l」を入力します。

PS C:\WINDOWS\system32> choco list -l
Chocolatey v1.1.0
2 validations performed. 1 success(es), 1 warning(s), and 0 error(s).

Validation Warnings:
 - A pending system reboot request has been detected, however, this is
   being ignored due to the current command being used 'list'.
   It is recommended that you reboot at your earliest convenience.

chocolatey 1.1.0
1 packages installed.
PS C:\WINDOWS\system32>

警告は出ていますね。でも、きっと使えるはず・・・きっと・・・。SSL認証のkeyが発行できればいいので、気にしないことにします。

mkcertをインストールする

「choco install mkcert」コマンドと「mkcert –install」コマンドで、インストールを行います。

PS C:\WINDOWS\system32> choco install mkcert
PS C:\WINDOWS\system32> choco install mkcert
Chocolatey v1.1.0
2 validations performed. 1 success(es), 1 warning(s), and 0 error(s).

Validation Warnings:
 - A pending system reboot request has been detected, however, this is
   being ignored due to the current Chocolatey configuration.  If you
   want to halt when this occurs, then either set the global feature
   using:
     choco feature enable -name=exitOnRebootDetected
   or pass the option --exit-when-reboot-detected.

Installing the following packages:
mkcert
By installing, you accept licenses for the packages.
Progress: Downloading mkcert 1.4.4... 100%

mkcert v1.4.4 [Approved]
mkcert package files install completed. Performing other installation steps.
 ShimGen has successfully created a shim for mkcert.exe
 The install of mkcert was successful.
  Software installed to 'C:\ProgramData\chocolatey\lib\mkcert'

Chocolatey installed 1/1 packages.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

Enjoy using Chocolatey? Explore more amazing features to take your
experience to the next level at
 https://chocolatey.org/compare
PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> mkcert --install
PS C:\WINDOWS\system32> mkcert --install
Created a new local CA 💥
The local CA is now installed in the system trust store! ⚡️
Note: Firefox support is not available on your platform. ℹ️

PS C:\WINDOWS\system32> 

これで、mkcertがインストールできました。

ディレクトリ構成2

ディレクトリ
 |_docker-compose.yml
 |_Dockerfile
 |_private 
 |   |_localhost-key.pem 
 |_certs 
 |   |_localhost.pem 
 |_config
 |   |_mysql
 |   |   |_my.cnf
 |   |   | |_my.conf
 |   |   |_init_scripts 
 |   |   | |_01_give_full_privileges_to_mysql_user.sh
 |   |_php
 |       |_php.ini
 |_htdocs
     |_index.php
     |_connect.php

SSL認証ファイルを作るために、「certs」フォルダを作成しました。

サーバー証明書を発行する

発行する前に、ディレクトリを移動させておきます。

PS C:\Users\rabit\docker_local\certs>

サーバー証明書を発行します

「mkcert localhost」と打って、サーバー証明書を発行します。

PS C:\Users\rabit\docker_local\certs> mkcert localhost

Created a new certificate valid for the following names 📜
 - "localhost"

The certificate is at "./localhost.pem" and the key at "./localhost-key.pem" ✅

It will expire on 12 August 2024 🗓

PS C:\Users\rabit\docker_local\certs>
PS C:\Users\rabit\docker_local\certs> ls


    ディレクトリ: C:\Users\rabit\docker_local\certs


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2022/05/12     18:14           1704 localhost-key.pem
-a----        2022/05/12     18:14           1489 localhost.pem


PS C:\Users\rabit\docker_local\certs>

「localhost-key.pem」ファイルと「localhost.pem」ファイルが作成されました。ここで、「localhost-key.pem」ファイルを「private」フォルダ下に移動させておきます。

Dockerfileの修正

FROM php:7.4-apache

RUN apt-get update && apt-get install -y \
    libonig-dev \
  && docker-php-ext-install pdo_mysql mysqli opcache \
  && rm -rf /var/lib/apt/lists/* \
  && a2enmod ssl \
  && a2enmod rewrite


COPY ./config/php/php.ini /usr/local/etc/php/

# SSL化
COPY ./certs/localhost.pem /etc/ssl/certs/
COPY ./private/localhost-key.pem /etc/ssl/private/

RUN sed -i 's!/etc/ssl/certs/ssl-cert-snakeoil.pem!/etc/ssl/certs/localhost.pem!g' /etc/apache2/sites-available/default-ssl.conf \
    && sed -i 's!/etc/ssl/private/ssl-cert-snakeoil.key!/etc/ssl/private/localhost-key.pem!g' /etc/apache2/sites-available/default-ssl.conf

RUN a2enmod ssl \
    && a2ensite default-ssl.conf

ここで、コンテナを停止させておきます。

PS C:\Users\rabit\docker_local> docker-compose down --volum
Stopping phpmyadmin ... done
Stopping php74_ssl  ... done
Stopping mysql57    ... done
Removing phpmyadmin ... done
Removing php74_ssl  ... done
Removing mysql57    ... done
Removing network docker_local_default
PS C:\Users\rabit\docker_local>

docker-compose.ymlファイルの修正

version: '3.1'
services:
    php:
        build: .
        container_name: php74_ssl
        volumes:
            - ./config/php/php.ini:/usr/local/etc/php/php.ini
            - ./htdocs/:/var/www/html
            - ./certs:/etc/ssl/local/certs
            - ./private:/etc/ssl/local/private
        privileged: true
        ports:
            - 80:80
            - 443:443
        depends_on:
            - mysql
    mysql:
        image: mysql:5.7
        container_name: mysql57
        volumes:
            - ./mysql:/var/lib/mysql
            - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
            - ./config/mysql/init_scripts:/docker-entrypoint-initdb.d
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=test_db
            - MYSQL_USER=test_user
            - MYSQL_PASSWORD=test_password
        ports:
            - 3306:3306
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        volumes:
            - ./phpmyadmin/sessions:/sessions
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=mysql
            - PMA_USER=root
            - PMA_PASSWORD=root
        links:
            - mysql
        ports:
            - 4040:80

コンテナを再度立ち上げる

PS C:\Users\rabit\docker_local> docker-compose up -d --build
Creating network "docker_local_default" with the default driver
Building php
[+] Building 1.8s (12/12) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.1s
 => => transferring dockerfile: 738B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/php:7.4-apache                                                  0.0s
 => [1/7] FROM docker.io/library/php:7.4-apache                                                                    0.0s
 => [internal] load build context                                                                                  0.0s
 => => transferring context: 231B                                                                                  0.0s
 => CACHED [2/7] RUN apt-get update && apt-get install -y     libonig-dev   && docker-php-ext-install pdo_mysql m  0.0s
 => CACHED [3/7] COPY ./config/php/php.ini /usr/local/etc/php/                                                     0.0s
 => CACHED [4/7] COPY ./certs/localhost.pem /etc/ssl/certs/                                                        0.0s
 => CACHED [5/7] COPY ./private/localhost-key.pem /etc/ssl/private/                                                0.0s
 => [6/7] RUN sed -i 's!/etc/ssl/certs/ssl-cert-snakeoil.pem!/etc/ssl/certs/localhost.pem!g' /etc/apache2/sites-a  0.6s
 => [7/7] RUN a2enmod ssl     && a2ensite default-ssl.conf                                                         0.8s
 => exporting to image                                                                                             0.2s
 => => exporting layers                                                                                            0.1s
 => => writing image sha256:79185d87800842603e84561dd74248e6a34e4111dcf0e7a8402cd5d7a18ad9de                       0.0s
 => => naming to docker.io/library/docker_local_php                                                                0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
Creating mysql57 ... done
Creating php74_ssl  ... done
Creating phpmyadmin ... done
PS C:\Users\rabit\docker_local>

はい!うまく動いた!

大変苦労しましたが、無事SSL認証に成功です。

次は、いよいよ、WordPressをSSL環境下で動かすといったことに挑んでいきたいと思います。

WordPressをSSL環境下で動かす

ディレクトリ構成

ディレクトリ
 |_docker-compose.yml
 |_Dockerfile
 |_private 
 |   |_localhost-key.pem 
 |_phpmyadmin 
 |   |_sessions 
 |   |_phpmyadmin-misc.ini 
 |_mysql 
 |_certs 
 |   |_localhost.pem 
 |_config
 |   |_mysql
 |   |   |_my.cnf
 |   |   | |_my.conf
 |   |   |_init_scripts 
 |   |   | |_01_give_full_privileges_to_mysql_user.sh
 |   |_php
 |       |_php.ini
 |_htdocs
     |_index.php
     |_connect.php

phpmyadmin-misc.iniファイルの追加

このままでは、WordPressのデータベースからエクスポートしたデータ容量がでかすぎるとのエラーが出るので、それを解決していきます。

「phpmyadmin」フォルダの下に、「phpmyadmin-misc.ini」ファイルを追加します。以下、内容です。

allow_url_fopen = Off
max_execution_time = 600
memory_limit = 16G
post_max_size = 16G
upload_max_filesize = 16G

docker-compose.ymlファイルの修正

version: '3.1'
services:
    php:
        build: .
        container_name: php74_ssl
        volumes:
            - ./config/php/php.ini:/usr/local/etc/php/php.ini
            - ./htdocs/:/var/www/html
            - ./certs:/etc/ssl/local/certs
            - ./private:/etc/ssl/local/private
        privileged: true
        ports:
            - 80:80
            - 443:443
        depends_on:
            - mysql
    mysql:
        image: mysql:5.7
        container_name: mysql57
        volumes:
            - ./mysql:/var/lib/mysql
            - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
            - ./config/mysql/init_scripts:/docker-entrypoint-initdb.d
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=test_db
            - MYSQL_USER=test_user
            - MYSQL_PASSWORD=test_password
        ports:
            - 3306:3306
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        volumes:
            - ./phpmyadmin/sessions:/sessions
            - ./phpmyadmin/phpmyadmin-misc.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=mysql
            - PMA_USER=root
            - PMA_PASSWORD=root
        links:
            - mysql
        ports:
            - 4040:80

準備ができたら、コンテナを停止し、再起動します。

PS C:\Users\rabit\docker_local> docker-compose down --volum
Stopping phpmyadmin ... done
Stopping php74_ssl  ... done
Stopping mysql57    ... done
Removing phpmyadmin ... done
Removing php74_ssl  ... done
Removing mysql57    ... done
Removing network docker_local_default

(---- ここから再起動 ----)

PS C:\Users\rabit\docker_local> docker-compose up -d
Creating network "docker_local_default" with the default driver
Creating mysql57 ... done
Creating phpmyadmin ... done
Creating php74_ssl  ... done
PS C:\Users\rabit\docker_local>

インポートできる容量が、64MByteに増えたことが確認できました。

サーバー環境でエクスポートしたWordPressのデータベースをローカル環境にインポートする

サーバー環境でSQL形式でエクスポートしたデータをローカル環境へインポートします。

インポートが成功しました。

ローカル環境のデータベースの変更を行います

本番環境のドメイン(moyashihome.com)をローカル環境サイトURL(localhost/moyashihome)に変更します。

変更は、「phpMyAdmin」から行います。次のSQL文を流します。

UPDATE `wp_options` SET option_value=REPLACE (option_value,'moyashihome.com','localhost/moyashihome');
UPDATE `wp_posts` SET guid=REPLACE (guid,'moyashihome.com','localhost/moyashihome');
UPDATE `wp_posts` SET post_content=REPLACE (post_content,'moyashihome.com','localhost/moyashihome');
UPDATE `wp_postmeta` SET meta_value=REPLACE (meta_value,'moyashihome.com','localhost/moyashihome'); 

「実行」をクリックします。

変更が完了しました。

ローカル環境のWordPress設定ファイル「wp-config.php」の変更を確認します

// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'moyasea_home' );

/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'root' );

/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'root' );

/** MySQL のホスト名 */
define( 'DB_HOST', 'mysql' );

/** データベースのテーブルを作成する際のデータベースの文字セット */
define( 'DB_CHARSET', 'utf8' );

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define( 'DB_COLLATE', '' );

.htaccessの作成

#SITEGUARD_PLUGIN_SETTINGS_START
#SITEGUARD_PLUGIN_SETTINGS_END
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /moyashihome/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /moyashihome/index.php [L]

# END WordPress

恐らく、本番環境とほぼ同じ設定で動くと思います。

ローカル環境での動作確認

アドレスバーに「https://localhost/moyashihome/」と入力してアクセスをします。

「MAMP」環境下でもそうだったのですが、時間がかかります。

恐らく、ネット上では通信ができていた何かが、ローカル環境になり通信ができなくなったことで、リロードを繰り返している場所があるのではないかと推測しています。

ここが解消できれば、もしかすると「MAMP」環境下でも速く動作するようになるかもしれません。

完全な表示はできませんでしたが、ひとまず完成ということで!

ということでしたが、解決策がありました。

wp-configファイルに次の文言を追加

/* 追加 2022/05/15 */
define('WP_HOME','http://moyashihome.com/');
define('WP_SITEURL','http://moyashihome.com/');

これで、ネットとローカルをリロードルームせずに、時間短縮してローカル環境でサイトを開くことができました。

解決できてよかったです。

長々とお読みいただき、ありがとうございました。

sponsored link

down

コメントする

コメントは日本語で入力してください。(スパム対策)




もやしほーむ

白川秋

白川秋

こんにちは。各種プラットフォームでのWordpress、EC-CUBEの使い方や、PHPプログラミングについて書いています。よろしくお願いいたします。



sponsored link

カテゴリー

表示できるコメントはありません。
2022年5月
1234567
891011121314
15161718192021
22232425262728
293031