在WSL2上使用Docker构建CakePHP4的开发环境
首先我作为一名新毕业的工程师已经从事了4年的Web开发工作。
这次有机会接触到CakePHP,顺便想用Docker搭建开发环境,为了输出,我想写下具体的步骤。普通的开发环境是直接在AWS EC2上安装PHP+Phalcon(!)+MySQL+nginx,有点怀旧的风格。
我对Docker和CakePHP都是初学者,但是在这篇文章中,我们将不详细解释,而是以使其运行为目标。
环境
文件结构请在主目录下创建一个名为cakephp的文件夹,并在此处进行操作。
MySQL的设置以下将记述文字编码和时区的设置。
安装CakePHP
环境
-
Windows 10 Home 22H2
- Windows 10 Home 22H2
-
- WSL2 Ubuntu 22.04.2 LTS
- Docker Desktop 4.19.0
假設這些安裝都已經完成。
文件结构请在主目录下创建一个名为cakephp的文件夹,并在此处进行操作。
最终的文件结构将如下所示。
├── docker
│ ├── mysql
│ │ └── my.cnf
│ └── web
│ └── Dockerfile
├── .env
└── docker-compose.yml
Docker Compose:使用 Docker 配置的文件组合docker-compose是一个工具,用于更方便地构建Docker镜像、启动和停止各个容器等,适用于由多个容器组成的应用程序。
通过将多个Docker容器的配置汇总到名为docker-compose.yml的配置文件中,可以实现集中管理。
本次我们将创建一个包含MySQL 8.0.X、PHP 8.2.X和CakePHP 4.X环境的设置。
version: '3'
services:
web:
# ./docker/web/Dockerfileでビルド
build:
context: ./docker/web
dockerfile: Dockerfile
# db起動後にwebを起動
depends_on:
- db
# ローカルのカレントディレクトリをコンテナの/var/wwwにマウント
volumes:
- ./:/var/www
# 80番ポートを割り当て
ports:
- ${WEB_PORT}:80
db:
# mysql:8.0イメージから構築
image: mysql:8.0
# 認証プラグインをmysql_native_passwordに設定
command: --default-authentication-plugin=mysql_native_password
# ローカルの./docker/mysql/my.cnfをコンテナの/etc/mysql/conf.d/my.cnfにマウント
volumes:
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
# .envで環境変数を管理
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_PASS}
# 80番ポートを割り当て
ports:
- ${DB_PORT}:3306
Dockerfile 的释义是什么?Dockerfile是用于描述构建过程的文件,当不想直接使用已公开的Docker镜像时,可以自己创建包含所需包、应用程序和各种配置的Docker镜像。
├── docker
│ ├── mysql
│ │ └── my.cnf
│ └── web
│ └── Dockerfile
├── .env
└── docker-compose.yml
通过将多个Docker容器的配置汇总到名为docker-compose.yml的配置文件中,可以实现集中管理。
本次我们将创建一个包含MySQL 8.0.X、PHP 8.2.X和CakePHP 4.X环境的设置。
version: '3'
services:
web:
# ./docker/web/Dockerfileでビルド
build:
context: ./docker/web
dockerfile: Dockerfile
# db起動後にwebを起動
depends_on:
- db
# ローカルのカレントディレクトリをコンテナの/var/wwwにマウント
volumes:
- ./:/var/www
# 80番ポートを割り当て
ports:
- ${WEB_PORT}:80
db:
# mysql:8.0イメージから構築
image: mysql:8.0
# 認証プラグインをmysql_native_passwordに設定
command: --default-authentication-plugin=mysql_native_password
# ローカルの./docker/mysql/my.cnfをコンテナの/etc/mysql/conf.d/my.cnfにマウント
volumes:
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
# .envで環境変数を管理
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_PASS}
# 80番ポートを割り当て
ports:
- ${DB_PORT}:3306
Dockerfile 的释义是什么?Dockerfile是用于描述构建过程的文件,当不想直接使用已公开的Docker镜像时,可以自己创建包含所需包、应用程序和各种配置的Docker镜像。
在这个Dockerfile中,我们将对之前的docker-compose.yml文件中的web容器进行编辑。
FROM php:8.2-apache
RUN apt-get update \
&& apt-get install -y vim \
# unzipコマンド(composer create-projectで必要)
&& apt-get install -y unzip \
# PHPのintl拡張(CakePHPで必要)
&& apt-get install -y libicu-dev \
&& docker-php-ext-install intl \
# PDO MySQL拡張
&& docker-php-ext-install pdo_mysql \
# mod_rewrite有効化
&& a2enmod rewrite
COPY --from=composer /usr/bin/composer /usr/bin/composer
MySQL的设置以下将记述文字编码和时区的设置。
[mysqld]
# 文字コード/照合順序の設定
character-set-server = utf8mb4
collation-server = utf8mb4_bin
# タイムゾーンの設定
default-time-zone = SYSTEM
log_timestamps = SYSTEM
# mysqlオプションの設定
[mysql]
# 文字コードの設定
default-character-set = utf8mb4
# mysqlクライアントツールの設定
[client]
# 文字コードの設定
default-character-set = utf8mb4
设置环境变量将端口和数据库的连接信息列在下方。
WEB_PORT=8080
DB_NAME=cakephptest
DB_USER=cake
DB_PASS=cakepassword
DB_PORT=8888
启动docker容器
yoyoyo@wsl:~/cakephp$ docker-compose up -d
[mysqld]
# 文字コード/照合順序の設定
character-set-server = utf8mb4
collation-server = utf8mb4_bin
# タイムゾーンの設定
default-time-zone = SYSTEM
log_timestamps = SYSTEM
# mysqlオプションの設定
[mysql]
# 文字コードの設定
default-character-set = utf8mb4
# mysqlクライアントツールの設定
[client]
# 文字コードの設定
default-character-set = utf8mb4
WEB_PORT=8080
DB_NAME=cakephptest
DB_USER=cake
DB_PASS=cakepassword
DB_PORT=8888
启动docker容器
yoyoyo@wsl:~/cakephp$ docker-compose up -d
yoyoyo@wsl:~/cakephp$ docker-compose up -d
在这里,我的环境中出现了错误。
yoyoyo@wsl:~/cakephp$ docker-compose up -d
[+] Building 1.9s (7/8)
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 529B 0.0s
=> [internal] load metadata for docker.io/library/composer:latest 0.8s
=> [internal] load metadata for docker.io/library/php:8.2-apache 0.9s
=> CACHED FROM docker.io/library/composer@sha256:d718bf3b9e308a8616a12924c5e74ef565a44f83264191bb0e37aafee5254134 0.0s
=> CACHED [stage-0 1/3] FROM docker.io/library/php:8.2-apache@sha256:e28189a95082561bd68fa1424217909cdbc15295a15f39bec1a72746a6a7112b 0.0s
=> ERROR [stage-0 2/3] RUN apt-get update && apt-get install -y vim && apt-get install -y unzip && apt-get install -y libicu-dev && docker-php-ext-install intl && docker-php-ext-install pdo_mysql && a2enmod rewrite && apt-get clean 0.9s
------
> [stage-0 2/3] RUN apt-get update && apt-get install -y vim && apt-get install -y unzip && apt-get install -y libicu-dev && docker-php-ext-install intl && docker-php-ext-install pdo_mysql && a2enmod rewrite && apt-get clean && rm -rf /var/lib/apt/lists/*:
#0 0.508 Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
#0 0.524 Err:1 http://deb.debian.org/debian bullseye InRelease
#0 0.524 Undetermined Error [IP: ****]
#0 0.542 Get:2 http://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
#0 0.572 Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
#0 0.677 Get:4 http://deb.debian.org/debian-security bullseye-security/main amd64 Packages [237 kB]
#0 0.800 Get:5 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [14.6 kB]
#0 0.810 Fetched 344 kB in 0s (1003 kB/s)
#0 0.810 Reading package lists...
#0 0.835 W: Failed to fetch http://deb.debian.org/debian/dists/bullseye/InRelease Undetermined Error [IP: ****]
#0 0.835 W: Some index files failed to download. They have been ignored, or old ones used instead.
#0 0.844 Reading package lists...
#0 0.872 Building dependency tree...
#0 0.877 Reading state information...
#0 0.884 E: Unable to locate package vim
------
failed to solve: process "/bin/sh -c apt-get update && apt-get install -y vim && apt-get install -y unzip && apt-get install -y libicu-dev && docker-php-ext-install intl && docker-php-ext-install pdo_mysql && a2enmod rewrite && apt-get clean && rm -rf /var/lib/apt/lists/*" did not complete successfully: exit code: 100
似乎在最初的apt-get update时遇到了问题。
根据这篇文章,通过在/etc/resolv.conf中添加8.8.8.8解决了问题。
可以看到DB容器和Web容器正在运行。
yoyoyo@wsl:~/cakephp$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
cakephp-db-1 mysql:8.0 "docker-entrypoint.s…" db 8 minutes ago Up 8 minutes 33060/tcp, 0.0.0.0:8888->3306/tcp
cakephp-web-1 cakephp-web "docker-php-entrypoi…" web 8 minutes ago Up 8 minutes 0.0.0.0:8080->80/tcp
安装CakePHP
接下来,我们将安装CakePHP。版本为4.X。
进入先前提到的cakephp-web-1容器,并在/var/www目录下执行CakePHP的安装。
yoyoyo@wsl:~/cakephp$ docker exec -it cakephp-web-1 bash
root@b945a715e846:/var/www# composer create-project --prefer-dist cakephp/app:4.* html
连接数据库CakePHP的数据库连接信息通过/var/www/html/config/app_local.php进行管理。
将先前在.env文件中记录的连接信息输入到这里。
'Datasources' => [
'default' => [
'host' => 'db',
'username' => 'cake',
'password' => 'cakepassword',
'database' => 'cakephptest',
结束时我第一次使用Docker,非常容易地使其运作起来。
在代码基础上构建环境非常易于维护,这太好了。
接下来,我打算按照官方网站的教程逐步熟悉CakePHP的运作。
yoyoyo@wsl:~/cakephp$ docker exec -it cakephp-web-1 bash
root@b945a715e846:/var/www# composer create-project --prefer-dist cakephp/app:4.* html

连接数据库CakePHP的数据库连接信息通过/var/www/html/config/app_local.php进行管理。
将先前在.env文件中记录的连接信息输入到这里。
'Datasources' => [
'default' => [
'host' => 'db',
'username' => 'cake',
'password' => 'cakepassword',
'database' => 'cakephptest',
结束时我第一次使用Docker,非常容易地使其运作起来。
在代码基础上构建环境非常易于维护,这太好了。
接下来,我打算按照官方网站的教程逐步熟悉CakePHP的运作。
'Datasources' => [
'default' => [
'host' => 'db',
'username' => 'cake',
'password' => 'cakepassword',
'database' => 'cakephptest',
