设置我们的 PHP 开发容器

我们需要一个用于 PHP 应用程序的开发环境。我们将把开发环境结构分为两个主要部分:Docker 容器(服务器)和 PHP 应用程序。

docker 目录将包含以下内容:

  • Dockerfile

  • docker-compose.yml

  • 服务器配置

codebase 目录将用作以下内容:

  • PHP 应用程序的根目录

  • Composer 包的 Vendor 目录

现在,让我们设置 PHP 开发容器:

  1. 在您的机器中创建以下目录结构:

    image 2023 10 23 10 52 51 176
    Figure 1. Figure 3.1 – Base tree
  2. 运行以下命令:

    $ mkdir -p ~/phptdd/docker
    $ mkdir -p ~/phptdd/codebase
  3. 安装 Docker Desktop。在创建所需的 Docker 文件之前,我们需要下载并安装 Docker Desktop

    对于 macOS 用户,可以从 https://docs.docker.com/desktop/mac/install/ 下载 Docker

    对于 Windows 用户,下载链接为 https://docs.docker.com/desktop/windows/install/。

    在 macOS 计算机上安装 Docker Desktop 后,我们现在可以组织我们的开发目录。

  4. 我们需要在 phptdd/docker/ 目录中创建一个 Dockerfile。创建一个 phptdd/docker/Dockerfile 文件,如下所示:

    FROM php:8.1.3RC1-apache-buster
    RUN docker-php-ext-install mysqli pdo pdo_mysql

    我们在第一行使用 FROM 关键字声明基础 Docker 映像。每个 Dockerfile 都必须以这个关键字开头。第二行是在当前映像之上运行命令的指令。由于我们的项目还需要一个数据库,因此我们可以安装所需的 MySQL 扩展。

我们的示例项目不仅仅需要 PHP:我们还需要数据库、Web 服务器和其他工具。因此,我们需要一种方法来运行和组织多个容器。接下来让我们看看如何做到这一点。

创建多个容器

要运行多个容器,我们可以使用安装 Docker Desktop 时预安装的 Compose 工具。 创建一个 phptdd/docker/docker-compose.yml 文件,如下所示:

version: "3.7"

services:
  # Web Server
  server-web:
    build:
      dockerfile: ./Dockerfile
      context: .
    restart: always
    volumes:
      - "../codebase/:/var/www/html/"
    ports:
      - "8081:80"

  # MySQL Database
  server-mysql:
    image: mysql:8.0.19
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
    volumes:
      - mysql-data:/var/lib/mysql

  # Optional MySQL Management Tool
  app-phpmyadmin:
    image: phpmyadmin/phpmyadmin:5.0.1
    restart: always
    environment:
      PMA_HOST: server-mysql
      PMA_USER: root
      PMA_PASSWORD: mypassword
    ports:
      - "3333:80"
volumes:
  mysql-data:

在我们的 docker-compose.yml 文件中,我们声明并配置了三个主要容器,它们都可以通过不同的端口访问:

  • Web 服务器:server-web

  • MySQL DB 服务器:server-mysql

  • phpMyAdmin:app-phpmyadmin

我们能够安装 Docker Desktop 并创建所需的 Dockerfiledocker-compose.yml 文件包含构建容器的模板。让我们尝试运行所有容器并确保它们配置正确并且可以相互通信。