2022/06/14

目次
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」ファイルに相当します。
これらを編集して環境を作ると、こちら↓のサイトで書かれていました。参考にしてください。
-300x193.jpg)
ただ、自分の場合、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');
-300x198.jpg)
「実行」をクリックします。
2-300x198.jpg)
変更が完了しました。
ローカル環境の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/');
これで、ネットとローカルをリロードルームせずに、時間短縮してローカル環境でサイトを開くことができました。
解決できてよかったです。
長々とお読みいただき、ありがとうございました。
