在WSL2上使用Docker构建CakePHP4的开发环境

首先我作为一名新毕业的工程师已经从事了4年的Web开发工作。

这次有机会接触到CakePHP,顺便想用Docker搭建开发环境,为了输出,我想写下具体的步骤。普通的开发环境是直接在AWS EC2上安装PHP+Phalcon(!)+MySQL+nginx,有点怀旧的风格。

我对Docker和CakePHP都是初学者,但是在这篇文章中,我们将不详细解释,而是以使其运行为目标。

环境

    • 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镜像。

在这个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

在这里,我的环境中出现了错误。

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 the rapid development PHP framework.png

连接数据库CakePHP的数据库连接信息通过/var/www/html/config/app_local.php进行管理。
将先前在.env文件中记录的连接信息输入到这里。

'Datasources' => [
    'default' => [
        'host' => 'db',
        'username' => 'cake',
        'password' => 'cakepassword',
        'database' => 'cakephptest',
CakePHP the rapid development PHP framework.png

结束时我第一次使用Docker,非常容易地使其运作起来。
在代码基础上构建环境非常易于维护,这太好了。
接下来,我打算按照官方网站的教程逐步熟悉CakePHP的运作。

bannerAds