WordPressのサイトをローカル環境(docker)に移行する方法について
dockerは初めのうちは無料だったのですが2021年9月より条件によっては有料となりました。個人利用もしくはスモールビジネス(従業員数250人未満かつ年間売上高1000万ドル未満)、教育機関、非商用のオープンソースプロジェクトでは引き続き無料で利用できます。
大企業 (従業員 250 名以上、または年間収益 1,000 万ドル以上) で Docker Desktop を商用利用するには、有料のサブスクリプションが必要です。
docker(ドッカー)を使用する
dockerをインストールする
まずは、dockerをインストールしてローカル環境を作るところから始めたいと思います。こちらのサイトが参考になるかと思います。
「Docker Hub」より、最新版のdockerをインストールします。
「Docker Desctop for Windows」をクリックします。ダウンロードしたファイルをクリックするとインストールが始まります。
「Use WSL 2 instead of Hyper V(recommended)」と「Add shotcut to desktop」のチェックボタンがありますが、今回は両方チェックを入れて「OK」をクリックします。
「WSL2」とは「WSL」の次世代の規格で「WindowsでLinuxを動かす環境」から「Windowsで完全なLinuxを動かす環境」へと進化しました。
インストールが開始されるので、しばらく待ちます。
インストールが完了したら、「Close and restart」と表示がされます。これをクリックすると再起動されるのであらかじめ再起動しても良い状態にしておいてからクリックしてください。
再起動が終わると自動でインストールの続きが始まります。(”C:\Program Files\Docker\Docker“下にdockerはインストールされます)
まず、規約に同意するかどうかを聞かれるので「Accept(同意)」をクリックします。
【Docker サブスクリプション サービス契約】
[同意する] を選択すると、サブスクリプション サービス契約、Docker データ処理契約、およびデータ プライバシー ポリシーに同意したことになります。
注: Docker Desktop は、小規模企業 (従業員数 250 名未満、かつ年間収益 1,000 万ドル未満)、個人使用、教育、および非営利のオープンソース プロジェクトには無料です。それ以外の場合、プロ向けの使用には有料のサブスクリプションが必要です。政府機関にも有料のサブスクリプションが必要です。詳細については、よくある質問をお読みください。
推奨設定を使用し、必要な構成は自動的に設定するを選択するので、上の「●」をチェックします。
【Docker Desktop のインストールを完了します。】
・推奨設定を使用する(管理者パスワードが必要)
Docker Desktop は、ほとんどの開発者にとって機能する必要な構成を自動的に設定します。
・詳細設定を使用する
好みの構成を手動で設定します。
次のような画面が出ます。まだユーザー登録をしていないと思いますので、ここは「Continue without signing in(サインインせずに続行する)」を選択してください。
【Docker デスクトップへようこそ】
サインインして Docker デスクトップ サブスクリプションに接続するか、オンライン機能にアクセスします。
すでにアカウントをお持ちですか?サインイン
サインインせずに続行する
次のような画面が出ますが、これはアンケートですので「Skip survey(アンケートをスキップする)」を選んで構いません。
これで「docker」を使う準備は整いました。下図はdockerの起動画面です。※最近のdockerではパソコンを立ち上げると自動で常駐するようになっているようです
次に、現代版コマンドプロンプトであるPowerShellから「docker」でイメージをインストールしていく手段について紹介していきます。「PowerShell」はタスクバーの検索窓から「powershell」と打つと検索候補に出てきます。
imageをインストールする(Apacheのhttpd)
まず、dockerにimageがインストールされているかを確認するコマンド「docker images」を入力してみます。
docker images
PS C:\Users\(ユーザー名)> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
このように何もインストールされていないことが確認できます。
では、Apacheをインストールしていきます。
httpdというimageをインストールすることでApacheがインストールされます。コマンドは「docker pull httpd」となります。
docker pull httpd
PS C:\Users\(ユーザー名)> docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
c57ee5000d61: Pull complete
ef22398cad3c: Pull complete
4f4fb700ef54: Pull complete
f420b40fd7be: Pull complete
ea4892b1a58d: Pull complete
1fe3871b50ff: Pull complete
Digest: sha256:5ee9ec089bab71ffcb85734e2f7018171bcb2d6707f402779d3f5b28190bb1af
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
What's Next?
View a summary of image vulnerabilities and recommendations → docker scout quickview httpd
コマンドを打って、イメージがインストールされたかを確認します。コマンドは先程打った「docker images」です。
docker images
PS C:\Users\(ユーザー名)> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 75a8cb2b38b1 3 weeks ago 167MB
ここで重要となるのは、「IMAGE ID」です。コンテナに乗せた後で必要となる番号となります。(この場合、「75a8cb2b38b1」)
※コンテナという言葉が出てきました。dockerというのは、イメージを取得して、コンテナに乗せて動かすというものです。コンテナに乗せるには、「run」コマンドを使用します。
取得したApacheをコンテナ(Container)で走らせる
ポート8080を使用して、localhostでApacheを走らせてみます。
docker run -d -p 8080:80 httpd
PS C:\Users\(ユーザー名)> docker run -d -p 8080:80 httpd
75a8cb2b38b19fbeaa10c17c441ca717b061286e065ccb6cd108a406f1876ea3
今回「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」だけで画面を表示することができます。
実行中のコンテナを確認する
docker ps
PS C:\Users\(ユーザー名)> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75a8cb2b38b1 httpd "httpd-foreground" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp elastic_margulis
ここで、コンテナのIDを確認しておきます。確認したコンテナID(75a8cb2b38b1)は、コンテナを停止させるときに使用します。
コンテナを停止させてみる
docker stop (コンテナID)
PS C:\Users\(ユーザー名)> docker stop 75a8cb2b38b1
75a8cb2b38b1
dockerのコンテナのプロセスから、Apacheが外れたことがコマンド「docker ps」で確認できます。
docker ps
PS C:\Users\(ユーザー名)> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
これで、一通りの操作ができました。補足ですが、コンテナを削除したい場合には、「docker rm (コンテナID)」コマンドで、imageファイルを消したい場合には、「docker rmi -f httpd」コマンドで行うことができます。また、不用意にこのコマンドは使用しないでください。
docker rm (コンテナID)
docker rmi -f httpd
停止させたコンテナを再起動させる
停止させたコンテナを確認するには、「docker ps -a」コマンドを使います。
docker ps -a
PS C:\Users\(ユーザー名)> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75a8cb2b38b1 httpd "httpd-foreground" 18 minutes ago Exited (0) 6 minutes ago elastic_margulis
再起動させるには、「docker start」コマンドを使います。
docker start (コンテナID)
PS C:\Users\(ユーザー名)> docker start 75a8cb2b38b1
75a8cb2b38b1
きちんと起動したかを確認します。
docker ps
PS C:\Users\(ユーザー名)> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75a8cb2b38b1 httpd "httpd-foreground" 22 minutes ago Up About a minute 0.0.0.0:8080->80/tcp elastic_margulis
プロセスが動いていることが確認できます。とりあえず、コンテナを停止させておきます。
docker stop (コンテナID)
PS C:\Users\(ユーザー名)> docker stop 75a8cb2b38b1
75a8cb2b38b1
docker(Linux環境下)内にアクセスする
docker exec -it (コンテナID) bash
PS C:\Users\(ユーザー名)> docker exec -it 75a8cb2b38b1 bash
root@75a8cb2b38b1:/usr/local/apache2#
上のコマンド(docker exec)で、docker(Linux環境下)内にアクセスすることができます。
ls
cd htdocs
cat index.html
root@75a8cb2b38b1:/usr/local/apache2# ls
bin build cgi-bin conf error htdocs icons include logs modules
root@75a8cb2b38b1:/usr/local/apache2# cd htdocs
root@75a8cb2b38b1:/usr/local/apache2/htdocs# ls
index.html
root@75a8cb2b38b1:/usr/local/apache2/htdocs# cat index.html
<html><body><h1>It works!</h1></body></html>
テストで表示されるindex.htmlファイルですが、「/usr/local/apache2/htdocs」の下に置かれていることがわかりました。自分の作ったサイトを表示する場合には、基本的には「htdocs」フォルダ内にファイルを置く必要があります。
このLinuxプロンプトから抜け出すには「CTRL+D」もしくは「exit」と打つと抜け出すことができます。
CTRL+D
exit
例外として指定したフォルダ下のデータを「htdocs」に置いてあるのと同じように動かすこともできます。今回はCドライブ直下にTESTというフォルダを作成し、その中にindex.htmlを作成して、中身は「<html><body><h1>Hello World !</h1></body></html>」とします。
docker run -d -p 8080:80 -v “C:\TEST\:/usr/local/apache2/htdocs/” httpd
PS C:\Users\(ユーザー名)> docker run -d -p 8080:80 -v "C:\TEST\:/usr/local/apache2/htdocs/" httpd
af0ae1195c82243692757952d117d09a5b5858caa635292b177bbb1a1df72c83
Webブラウザに「http://localhost:8080」と打ってみてください。成功であれば画面に「Hello World !」と表示されます。表示されない場合はパスが間違っていますのでフォルダがあるか、パスが間違っていないかを確認してみてください。
これでローカル環境を、docker内部で動かすことができることが確認できました。ただ、このままではPHPを動かすことができません。まあ当たり前ですよね、ただのApacheなので。
とりあえず動作確認できたので、コンテナを終了させておきます。
docker stop (コンテナID)
PS C:\Users\(ユーザー名)> docker stop 75a8cb2b38b1
75a8cb2b38b1
PHP入りのアパッチを導入するにあたり
PHPをインストールするにあたり、どのバージョンを入れるべきかをちょっと調べてみたら次のようなことがわかりました。
PHPの最新安定バージョンは?
なお、現時点でのPHPの最新安定バージョンはバージョン8.2.12です。 PHP 7.4系統の保守は2022年11月28日に終了しており、PHP 8.0系統の保守は2023年11月26日に終了する予定となっています。
2023/11/14
なので、php:8.2.12-apacheというimageをインストールすることにします。このバージョンは2023年10月にリリースされました。
とりあえず、「http」で動くことはわかりました。これから「PHP」や「SSL」環境下で、Apacheを動かす方法について触れていこうと思います。
php:8.2.12-apacheを導入する
php:8.2.12-apacheのimageを取得
docker pull php:8.2.12-apache
PS C:\Users\(ユーザー名)> docker pull php:8.2.12-apache
8.2.12-apache: Pulling from library/php
1f7ce2fa46ab: Pull complete
48824c101c6a: Pull complete
249ff3a7bbe6: Pull complete
aa5d47f22b64: Pull complete
e83ad87cf6a6: Pull complete
92eeb6cb0068: Pull complete
b3a08d032c4e: Pull complete
12ae875b0b5d: Pull complete
10b882016d7d: Pull complete
3e9b3e7d19f8: Pull complete
85d68fe18b7e: Pull complete
b0523d6fe976: Pull complete
4c49d6d17ff8: Pull complete
Digest: sha256:8983699f10a9055f893b2c2f7f2c7c5a5da833b44967b25fe92bdf42b5821a72
Status: Downloaded newer image for php:8.2.12-apache
docker.io/library/php:8.2.12-apache
What's Next?
View a summary of image vulnerabilities and recommendations → docker scout quickview php:8.2.12-apache
imageが取得できました。
php:8.2.12-apacheをphp82という名前を付けて実行する
docker run –name php82 -d -p 8080:80 -v “C:\TEST\:/usr/local/apache2/htdocs/” php:8.2.12-apache
PS C:\Users\(ユーザー名)> docker run --name php82 -d -p 8080:80 -v "C:\TEST\:/usr/local/apache2/htdocs/" php:8.2.12-apache
abbd56799b842f9b28049694dc30c7192b0dde8a7739da02c43f8ac24e3d8cb2
コンテナ名「php82」が付きました。これでややこしいコンテナIDの代わりにこの名前を使用することができるようになりました。
次に、docker(Linux環境下)内にアクセスしてみます。
docker exec -it php82 bash
PS C:\Users\(ユーザー名)> docker exec -it php82 bash
root@abbd56799b84:/var/www/html#
起動した、php82に入ってみると、htmlの実行アドレスが表示されます。php82を「/usr/local/apache2/htdocs/」下で動かすと指定していたので、それが間違いであったことがわかりましたので、コンテナを「stop」させ、削除(rm)し、再度「/var/www/html」下で動かすように指定して実行します。
docker stop php82
docker rm php82
docker ps -a
PS C:\Users\(ユーザー名)> docker stop php82
php82
PS C:\Users\(ユーザー名)> docker rm php82
php82
PS C:\Users\(ユーザー名)> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af0ae1195c82 httpd "httpd-foreground" 34 minutes ago Exited (0) 14 minutes ago awesome_elgamal
e2cf5ece9fa1 httpd "httpd-foreground" 34 minutes ago Created unruffled_hermann
710a8502f0d6 httpd "httpd-foreground" 39 minutes ago Created boring_easley
75a8cb2b38b1 httpd "httpd-foreground" About an hour ago Exited (0) 37 minutes ago elastic_margulis
docker run –name php82 -d -p 8080:80 -v “C:\TEST\:/var/www/html/” php:8.2.12-apache
PS C:\Users\(ユーザー名)> docker run --name php82 -d -p 8080:80 -v "C:\TEST\:/var/www/html/" php:8.2.12-apache
44ccd8c00c14b96e2703028c7cccc30f6fc1cd73ecf9f3acd1241f0362ed80aa
こうしたところ、サイトが表示されることが確認できました。
Apacheの設定ファイルを調べる
「docker exec」コマンドで、dockerのLinux環境に入り、その後、Apacheの設定ファイル(apache2.conf)の場所を確認します。
PS C:\Users\(ユーザー名)> docker exec -it php82 bash
root@44ccd8c00c14:/var/www/html# ls -l /etc/apache2/apache2.conf
-rw-r--r-- 1 root root 7178 Apr 13 2023 /etc/apache2/apache2.conf
Apacheの設定ファイル(apache2.conf)は「/etc/apache2/」ディレクトリの下にあることがわかりました。
Apacheのサイト構成ファイルの場所を調べる
root@44ccd8c00c14:/var/www/html# ls -l /etc/apache2/sites-available/000-default.conf
-rw-r--r-- 1 root root 1286 Apr 13 2023 /etc/apache2/sites-available/000-default.conf
「/etc/apache2/sites-available/」ディレクトリ下に構成ファイル「000-default.conf」があることが確認できます。
PHPの設定ファイルの場所を調べる
root@44ccd8c00c14:/var/www/html# php -r "phpinfo();" | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php
root@44ccd8c00c14:/var/www/html# ls /usr/local/etc/php -l
total 152
drwxr-xr-x 1 root root 4096 Nov 21 14:50 conf.d
-rw-r--r-- 1 root root 73725 Nov 21 14:50 php.ini-development
-rw-r--r-- 1 root root 73871 Nov 21 14:50 php.ini-production
これで、ApacheとPHPの設定ファイルの場所と名前が分かったので、それをホスト側(ローカル下)にコピーします。この作業は、一旦bashを抜けてホスト側で、「docker cp」コマンドを使って行います。bashを抜けるには「CTRL+D」または「exit」と打つんでしたね。
docker cp php82:/etc/apache2/apache2.conf C;/TEST
docker cp php82:/etc/apache2/sites-available/000-default.conf C:/TEST
docker cp php82:/usr/local/etc/php/php.ini-development C:/TEST
docker cp php82:/usr/local/etc/php/php.ini-production C:/TEST
PS C:\Users\(ユーザー名)> docker cp php82:/etc/apache2/apache2.conf C:/TEST
Successfully copied 9.22kB to C:\TEST
PS C:\Users\(ユーザー名)> docker cp php82:/etc/apache2/sites-available/000-default.conf C:/TEST
Successfully copied 3.07kB to C:\TEST
PS C:\Users\(ユーザー名)> docker cp php82:/usr/local/etc/php/php.ini-development C:/TEST
Successfully copied 75.3kB to C:\TEST
PS C:\Users\(ユーザー名)> docker cp php82:/usr/local/etc/php/php.ini-production C:/TEST
Successfully copied 75.8kB to C:\TEST
PS C:\Users\(ユーザー名)> ls C:\TEST
ディレクトリ: C:\TEST
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2023/04/13 (木) 12:14 1286 000-default.conf
-a---- 2023/04/13 (木) 12:26 7178 apache2.conf
-a---- 2024/02/11 (日) 15:17 48 index.html
-a---- 2023/11/21 (火) 23:50 73725 php.ini-development
-a---- 2023/11/21 (火) 23:50 73871 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」ファイルに相当します。
私の場合、SSL環境でのWordPressのサイトの構築を目指しているので、更に続きを書いていきたいと思います。その前に次に行う環境構築でコンテナ名「php82」を再度使用しますので、「php82」のコンテナを停止し、削除しておきましょう。
docker stop php82
docker rm php82
docker ps -a
Apache+PHP+MySQLの環境を構築する
こちらを参考にしました。docker-compose.ymlファイルが鍵となります。※最近ではこのdocker-compose.ymlファイルは廃止される傾向にあり、変わりにcompose.ymlファイルを設定するようになっているようです。また、compose.ymlファイル内ではymlファイル自体のバージョン宣言を行わなくてもよくなりました。
phpとmysqlの使用するバージョンについては、こちらのサイトを参考にさせていただきました。
phpのバージョンは8.2.12、mysqlのバージョンは5.7を使用します。
ディレクトリ構成(Apache+PHP+MySQL環境)
ディレクトリ
|_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(*)
ディレクトリ構成は、このようにします。さきほど作成した「C:\TEST」フォルダの下にファイルを置いていきます。今作成していないファイルは順を追って作成していきますのでご安心ください。ディレクトリ(フォルダ)は作成しておいてください。(*)が付いているものがファイルで、それ以外はディレクトリ(フォルダ)となります。
compose.ymlファイルの作成
ファイルは「C:\TEST」フォルダの下に作成します。
services:
php:
build: .
container_name: php82
volumes:
- ./config/php/php.ini:/usr/local/etc/php/php.ini
- ./htdocs/:/var/www/html
privileged: true
ports:
- 8080: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
Dockerfileの作成
ファイルは「C:\TEST」フォルダの下に作成します。
FROM php:8.2.12-apache
RUN apt-get update && apt-get install -y \
libonig-dev \
&& docker-php-ext-install pdo_mysql mysqli opcache
「opcache」をおまじないのようにいれているのは、これを入れておくと、ローカル環境でも、多少の高速化が図れるからです。
configファイルの作成(my.conf)
my.confファイルの作成
ファイルは「C:\TEST\config\mysql\my.cnf」フォルダの下に作成します。
[mysqld]
default_autentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-charctrer-set=utf8mb4
php.iniファイルの作成
ファイルは「C:\TEST\config\php」フォルダの下に作成します。
[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 = "80G"
upload_max_filesize = "100G"
phpファイルの作成
index.phpの作成
ファイルは「C:\TEST\htdocs」フォルダの下に作成します。
内容はなんでもいいのですが、とりあえずphpに設定されている情報を確認するための、phpinfoを表示させるページを作っておきます。※締めの「?>」がないのはわざとです。最近は閉じ忘れ防止のため、敢えて締めないという方法が主流です。
<?php
phpinfo();
connect.phpの作成
ファイルは「C:\TEST\htdocs」フォルダの下に作成します。
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;
}
作成したcompose.ymlを実行
作業フォルダは「C:\TEST」とします。「cd C:\TEST」コマンドで移動しておいてください。作成したcompose.ymlを実行します。
docker-compose up -d
PS C:\TEST> docker-compose up -d
[+] Running 3/3
Container php82 Started 2.8s
Container mysql57 Started 1.3s
Container phpmyadmin Started 1.1s
composeに失敗した場合
Error response from daemon: Conflict. The container name “コンテナ名” is already in use by container “コンテナID”. You have to remove (or rename) that container to be able to reuse that name.
このメッセージが出るのは、コンテナ名が重複しているから同じものは
作れないよということを指しています。
既にあるコンテナ名を削除するか、新たに作るコンテナ名を変更しましょう。
docker stop php82
docker rm php82
実行に成功したかを確認
docker ps
PS C:\TEST> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
842c7caaa701 test-php "docker-php-entrypoi…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp php82
fefe1d160d35 phpmyadmin/phpmyadmin "/docker-entrypoint.…" 59 minutes ago Up 3 minutes 0.0.0.0:4040->80/tcp phpmyadmin
4f31e510d09a mysql:5.7 "docker-entrypoint.s…" 59 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql57
「docker ps」コマンドで、コンテナが立ち上がっていることを確認できました。
環境が整ったかの確認作業
phpinfoの確認
「http://localhost:8080」へ接続します。
phpinfoが表示されたことが確認できました。
DBの接続確認
「http://localhost:8080/connect.php」を実行
バージョン情報など、dumpが表示されます。
array(1) { [0]=> array(1) { ["version()"]=> string(6) "5.7.44" } }
エラーが出る場合
エラー内容
could not find driver
このエラーの原因は、compose.ymlファイルで、
php:
build: .
とするところを、
php:
build: php:8.2.12-apache
としていたときに出ました。(修正済みです)
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=(サーバーのホスト名);dbname=moyasea_kanbi;charset=utf8', $user, $pass);
$userと$passをymlファイルで設定した、phpMyAdminのユーザーとパスである「root」を指定する必要がありました。
また「mysql:host=localhost」と通常書くところを「mysql:host=mysql」とする必要がありました。
参考になれば幸いです。
これで、PHPの動作と、DBの動作を確認することができました。
次は、いよいよSSL接続について触れていきたいと思います。
docker環境で、SSL接続を行おう!
Chocolateyをインストールする
ターミナルを管理者権限で開き、次の文言を書いて実行します。「;(セミコロン)」で文章は終わりではないので注意してください。
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’))
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のインストールが完了します。
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'))
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/2.2.2.
Downloading https://community.chocolatey.org/api/v2/package/chocolatey/2.2.2 to C:\Users\ryu\AppData\Local\Temp\chocolatey\chocoInstall\chocolatey.zip
Not using proxy.
Extracting C:\Users\ryu\AppData\Local\Temp\chocolatey\chocoInstall\chocolatey.zip to C:\Users\ryu\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.
chocolatey.nupkg file not installed in lib.
Attempting to locate it from bootstrapper.
PATH environment variable does not have C:\ProgramData\chocolatey\bin in it. Adding...
警告: Not setting tab completion: Profile file does not exist at
'C:\Users\ryu\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
警告がでましたが、インストールできたと思います。確認するには、「choco list」を入力します。
choco list
PS C:\WINDOWS\system32> choco list
Chocolatey v2.2.2
3 validations performed. 2 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 2.2.2
mkcert 1.4.4
2 packages installed.
このchocolatyは、SSL認証のkeyの発行をするためだけに使用するものです。
mkcertをインストールする
「choco install mkcert」コマンドと「mkcert –install」コマンドで、インストールを行います。
choco install mkcert
PS C:\WINDOWS\system32> choco install mkcert
Chocolatey v2.2.2
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).
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.
インストール中、恐らく警告が出ると思いますが、気にせず「OK」を押してください。これで、mkcertがインストールできました。
SSL環境を作る
mkcertを使用して証明書を発行する
作業フォルダは「C:\TEST\certs」となります。「cd C:\TEST\certs」と打って移動しておいてください。
mkcert localhost
PS C:\TEST\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 May 2026
SSL設定を作成する
作業フォルダは「C:\TEST\config」フォルダです。「cd ../config」で移動してください。
「000-default.conf」ファイルと「default-ssl.conf」を作成します。
ファイル名:000-default.conf
<VirtualHost *:80>
ServerName localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
</VirtualHost>
ファイル名:default-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerName localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/localhost.pem
SSLCertificateKeyFile /etc/ssl/private/localhost-key.pem
<FilesMatch "\.(?:cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
ディレクトリ構成(SSL環境)
ディレクトリ
|_compose.yml(*)
|_Dockerfile(*)
|_certs
| |_localhost-key.pem(*)
| |_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認証ファイルを作るために「private」「certs」フォルダを作成しました。「C:\TEST」フォルダの下にファイルを置いていきます。今作成していないファイルは順を追って作成していきますのでご安心ください。ディレクトリ(フォルダ)は作成しておいてください。(*)が付いているものがファイルで、それ以外はディレクトリ(フォルダ)となります。
サーバー証明書を発行する
発行する前に、「cd C:\TEST\certs」コマンドでディレクトリを移動させておきます。
サーバー証明書を発行します
「mkcert localhost」と打って、サーバー証明書を発行します。
mkcert localhost
PS C:\TEST\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 May 2026
ファイルが作成されたかを確認します。
PS C:\TEST\certs> ls
ディレクトリ: C:\TEST\certs
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/02/12 (月) 22:09 1704 localhost-key.pem
-a---- 2024/02/12 (月) 22:09 1566 localhost.pem
「localhost-key.pem」ファイルと「localhost.pem」ファイルが作成されました。
Dockerfileの修正
FROM php:8.2.12-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が使えるようにする
RUN /bin/sh -c a2enmod include
# mod_sslを有効化
RUN /bin/sh -c a2ensite ssl
# apache2.confをコンテナにコピー
#COPY /apache2.conf /etc/apache2/apache2.conf
# SSL証明書、秘密鍵をコピー
COPY ./certs/localhost.pem /etc/ssl/certs/
COPY ./certs/localhost-key.pem /etc/ssl/private/
# 000-default.conf、default-ssl.confをコンテナにコピー
COPY ./config/000-default.conf /etc/apache2/sites-available/000-default.conf
COPY ./config/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf
# SSLの有効化
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
ここで、コンテナを停止させておきます。
docker-compose down
PS C:\TEST\certs> docker-compose down
[+] Running 4/4
✔ Container php82 Removed 2.9s
✔ Container phpmyadmin Removed 3.0s
✔ Container mysql57 Removed 2.5s
✔ Network test_default Removed 0.3s
compose.ymlファイルの修正
services:
php:
build: .
image: php82_ssl
container_name: php82_ssl
volumes:
- ./config/php/php.ini:/usr/local/etc/php/php.ini
- ./config:/etc/apache2/sites-enabled
- ./htdocs:/var/www/html
- ./certs:/etc/ssl/local/certs
privileged: true
ports:
- 8080: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
dockerのバージョンをチェックしておく
次の「コンテナを再度立ち上げる」の作業でエラーが出ていたのですが、バージョンアップをしたら解決しました。アップデートで直ることもありますので、対処法のひとつとして心に留めておいてください。
コンテナを再度立ち上げる
作業フォルダに移動する。
cd C:\TEST
コンテナを立ち上げます。
docker-compose up -d –build
PS C:\TEST> docker-compose up -d --build
[+] Building 3.4s (12/12) FINISHED docker:default
=> [php internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 738B 0.0s
=> [php internal] load metadata for docker.io/library/php:8.2.12-apache 0.0s
=> [php internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [php 1/7] FROM docker.io/library/php:8.2.12-apache 0.0s
=> [php internal] load build context 0.1s
=> => transferring context: 3.83kB 0.0s
=> CACHED [php 2/7] RUN apt-get update && apt-get install -y libonig-dev && docker-php-ext-install pdo_mys 0.0s
=> [php 3/7] COPY ./config/php/php.ini /usr/local/etc/php/ 0.2s
=> [php 4/7] COPY ./certs/localhost.pem /etc/ssl/certs/ 0.2s
=> [php 5/7] COPY ./private/localhost-key.pem /etc/ssl/private/ 0.2s
=> [php 6/7] RUN sed -i 's!/etc/ssl/certs/ssl-cert-snakeoil.pem!/etc/ssl/certs/localhost.pem!g' /etc/apache2/sit 0.7s
=> [php 7/7] RUN a2enmod ssl && a2ensite default-ssl.conf 1.1s
=> [php] exporting to image 0.6s
=> => exporting layers 0.6s
=> => writing image sha256:89ec12dbc1e15a18bba1c86ddb714c5ace0579f67020398cfdd4a930d93153bb 0.0s
=> => naming to docker.io/library/test-php 0.0s
[+] Running 3/4
- Network test_default Created 3.3s
✔ Container mysql57 Started 2.2s
✔ Container phpmyadmin Started 2.8s
✔ Container php82_ssl Started 2.9s
https://localhostにアクセスしてみます。
はい!うまく動いた!
大変苦労しましたが、無事SSL認証に成功です。
次は、いよいよ、WordPressをSSL環境下で動かすといったことに挑んでいきたいと思います。
WordPressをSSL環境下で動かす
ディレクトリ構成
ディレクトリ
|_compose.yml(*)
|_Dockerfile(*)
|_phpmyadmin
| |_session
| |_phpmyadmin-misc.ini(*)
|_certs
| |_localhost-key.pem(*)
| |_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 = 1800
memory_limit = 16G
post_max_size = 50G
upload_max_filesize = 50G
compose.ymlファイルの修正
services:
php:
build: .
image: php82_ssl
container_name: php82_ssl
volumes:
- ./config/php/php.ini:/usr/local/etc/php/php.ini
- ./config:/etc/apache2/sites-enabled
- ./htdocs:/var/www/html
- ./certs:/etc/ssl/local/certs
privileged: true
ports:
- 8080: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/phpmyadmin-misc.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini
- ./phpmyadmin/sessions:/sessions
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=root
links:
- mysql
ports:
- 4040:80
準備ができたら、コンテナを停止し、再起動します。
docker-compose down
PS C:\TEST> docker-compose down
[+] Running 4/4
✔ Container phpmyadmin Removed 2.0s
✔ Container php82_ssl Removed 2.2s
✔ Container mysql57 Removed 2.5s
✔ Network test_default Removed 0.3s
docker-compose up -d –build
PS C:\TEST> docker-compose up -d --build
[+] Building 0.3s (16/16) FINISHED docker:default
=> [php internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.09kB 0.0s
=> [php internal] load metadata for docker.io/library/php:8.2.12-apache 0.0s
=> [php internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [php 1/11] FROM docker.io/library/php:8.2.12-apache 0.0s
=> [php internal] load build context 0.0s
=> => transferring context: 288B 0.0s
=> CACHED [php 2/11] RUN apt-get update && apt-get install -y libonig-dev && docker-php-ext-install pdo_m 0.0s
=> CACHED [php 3/11] COPY ./config/php/php.ini /usr/local/etc/php/ 0.0s
=> CACHED [php 4/11] RUN /bin/sh -c a2enmod include 0.0s
=> CACHED [php 5/11] RUN /bin/sh -c a2ensite ssl 0.0s
=> CACHED [php 6/11] COPY ./certs/localhost.pem /etc/ssl/certs/ 0.0s
=> CACHED [php 7/11] COPY ./certs/localhost-key.pem /etc/ssl/private/ 0.0s
=> CACHED [php 8/11] COPY ./config/000-default.conf /etc/apache2/sites-available/000-default.conf 0.0s
=> CACHED [php 9/11] COPY ./config/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf 0.0s
=> CACHED [php 10/11] RUN sed -i 's!/etc/ssl/certs/ssl-cert-snakeoil.pem!/etc/ssl/certs/localhost.pem!g' /etc/ap 0.0s
=> CACHED [php 11/11] RUN a2enmod ssl && a2ensite default-ssl 0.0s
=> [php] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:82321a8799e5b6e23b19dcbb2c61a19e6c5f64bc017d1cb088ce0e18e7aafe24 0.0s
=> => naming to docker.io/library/php82_ssl 0.0s
[+] Running 3/4
- Network test_default Created 1.9s
✔ Container mysql57 Started 1.0s
✔ Container phpmyadmin Started 1.6s
✔ Container php82_ssl Started 1.7s
http://localhost:4040へアクセスします。
インポートタブを見ます。インポートできる容量が、50GByteに増えたことが確認できました。※50Gはちょっと多めの実験的な設定です。通常は128M程度の容量を設定してあげれば良いでしょう。
サーバー環境でエクスポートしたWordPressのデータベースをローカル環境にインポートする
サーバー環境でSQL形式でエクスポートしたデータをローカル環境へインポートします。
インポートが成功しました。※エラーが出てるのは気にしないでください。
ローカル環境のデータベースの変更を行います
本番環境のドメイン(shirakawaroom.com)をローカル環境サイトURL(localhost/shirakawaroom.com)に変更します。
変更は、「phpMyAdmin」から行います。次のSQL文を流します。
UPDATE `wp_options` SET option_value=REPLACE (option_value,'shirakawaroom.com','localhost/shirakawaroom.com');
UPDATE `wp_posts` SET guid=REPLACE (guid,'shirakawaroom.com','localhost/shirakawaroom.com');
UPDATE `wp_posts` SET post_content=REPLACE (post_content,'shirakawaroom.com','localhost/shirakawaroom.com');
UPDATE `wp_postmeta` SET meta_value=REPLACE (meta_value,'shirakawaroom.com','localhost/shirakawaroom.com');
「実行」をクリックします。
変更が完了しました。
ローカル環境のWordPress設定ファイル「wp-config.php」の変更を確認します
// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'shirakawa_room' );
/** 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 フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<ifmodule mod_rewrite.c="">
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]
</ifmodule>
# END WordPress
この設定は一例です。恐らく、本番環境とほぼ同じ設定で動くと思います。
ローカル環境での動作確認
アドレスバーに「https://localhost/shirakawaroom.com/」と入力してアクセスをします。
「MAMP」環境下でもそうだったのですが、時間がかかります。
恐らく、ネット上では通信ができていた何かが、ローカル環境になり通信ができなくなったことで、リロードを繰り返している場所があるのではないかと推測しています。
ここが解消できれば、もしかすると「MAMP」環境下でも速く動作するようになるかもしれません。
完全な表示はできませんでしたが、ひとまず完成ということで!
ということでしたが、解決策がありました。
wp-configファイルに次の文言を追加
/* 追加 2022/05/15 */
define('WP_HOME','https://shirakawaroom.com/');
define('WP_SITEURL','https://shirakawaroom.com/');
これで、ネットとローカルをリロードルームせずに、時間短縮してローカル環境でサイトを開くことができました。
解決できてよかったです。
長々とお読みいただき、ありがとうございました。
コメント