需通过官方镜像或自定义dockerfile搭建php环境:一、用php:8.2-cli快速运行脚本;二、用php:8.2-apache部署web服务;三、自定义安装扩展如pdo_mysql、gd、opcache;四、用docker-compose集成mysql等多服务。

如果您希望在Docker中快速构建一个可运行PHP代码的隔离环境,则需要通过编写Dockerfile或使用官方镜像启动容器,并配置必要的扩展与服务依赖。以下是搭建PHP Docker容器的具体操作步骤:
一、使用官方PHP镜像启动容器
PHP官方Docker镜像已预装基础扩展和CLI支持,适合快速验证脚本或搭建简单Web服务。该方式无需手动编译,启动速度快,适用于开发测试场景。
1、在终端执行命令拉取PHP 8.2 CLI版本镜像:docker pull php:8.2-cli
2、创建本地目录用于挂载PHP文件,例如:mkdir -p ~/php-app && cd ~/php-app
立即学习“PHP免费学习笔记(深入)”;
3、在该目录下新建测试文件 index.php,内容为:
4、运行容器并挂载当前目录到容器内 /var/www/html 路径:docker run --rm -v $(pwd):/var/www/html -w /var/www/html php:8.2-cli php index.php
二、构建带Apache的PHP Web环境
Apache作为Web服务器可直接响应HTTP请求,配合PHP模块实现动态页面解析。此方案适合部署传统PHP项目,如WordPress或Laravel基础站点。
1、新建Dockerfile文件,内容如下:FROM php:8.2-apache COPY index.php /var/www/html/ EXPOSE 80
2、在同一目录创建 index.php,内容为:
3、构建镜像:docker build -t my-php-apache .
4、运行容器并映射主机8080端口:docker run -d -p 8080:80 --name php-web my-php-apache
5、访问 http://localhost:8080 查看phpinfo输出
三、自定义Dockerfile安装扩展与依赖
部分PHP项目需启用额外扩展(如pdo_mysql、gd、xdebug),官方镜像默认未启用,需在构建阶段显式安装。该方法确保环境一致性,适用于生产前验证。
1、新建Dockerfile,以php:8.2-cli为基础镜像:FROM php:8.2-cli
2、安装常见扩展及系统依赖:RUN apt-get update && apt-get install -y \ libpng-dev libjpeg-dev libfreetype6-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install gd pdo_mysql mysqli opcache
3、启用OPcache配置:RUN echo "opcache.enable=1" > /usr/local/etc/php/conf.d/opcache.ini
4、复制应用代码至容器:COPY . /app && WORKDIR /app
5、构建并运行:docker build -t custom-php . && docker run --rm custom-php php -m | grep -E "(pdo|gd|opcache)"
四、使用docker-compose管理多服务PHP环境
当PHP应用依赖MySQL、Redis等外部服务时,单独运行多个容器易导致网络与配置混乱。docker-compose可统一声明服务关系、网络与卷挂载,提升协作效率。
1、新建 docker-compose.yml 文件,内容包含php、mysql、nginx三个服务:
version: '3.8' services: php: image: php:8.2-cli volumes: - ./src:/app working_dir: /app mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpass ports: - "3306:3306"
2、在项目根目录创建 src 子目录存放PHP脚本
3、启动全部服务:docker-compose up -d
4、进入PHP容器执行数据库连接测试:docker-compose exec php php -r "new mysqli('mysql', 'root', 'rootpass'); echo 'Connected';"











