使用docker搭建php开发环境

news/2025/2/22 23:09:17/文章来源:https://www.cnblogs.com/maoxuner/p/18719067

本文年代久远,可能已经不适用。仅供参考!

新的php镜像参考Gitee Repo

多容器 apache+php+mariadb+redis

主要配置

构建php镜像

基于官方php镜像进行定制,增加所需的php扩展,修改php配置,以及创建虚拟主机。

Dockerfile

文件php/Dockerfile

FROM php:apache# php configure
COPY php.ini /usr/local/etc/php/php.ini# php extension
COPY sources.list /etc/apt/sources.list
RUN apt-get update \&& apt-get install -y --no-install-recommends \libbz2-dev \libfreetype6-dev libjpeg62-turbo-dev libpng-dev \&& rm -r /var/lib/apt/lists/* \&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \&& docker-php-ext-install -j$(nproc) zip bz2 gd mysqli pdo_mysql sockets \&& pecl install redis \&& docker-php-ext-enable redis# php composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \&& php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \&& php composer-setup.php --install-dir=/usr/local/bin --filename=composer \&& php -r "unlink('composer-setup.php');"# apache configure
RUN a2enmod rewrite.load# apache vhosts
COPY vhosts/* /etc/apache2/sites-available/
RUN a2ensite demo.conf

说明

  • FROM php:apache未指定php版本号,默认使用最新的版本,当前7.2
  • docker-php-ext-install可以安装的组件如下,curl组件默认已经安装

    bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets sodium spl standard sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zend_test zip

  • 必要时需要安装一些依赖,并用docker-php-ext-configure配置编译参数
  • pecl可以安装pecl支持的组件,如redis

遇到的问题

直到我看到这个Installation of curl fails - easy.h should be in /include/curl/ #467,才发现curl组件默认已经安装。不过,又发现了编译curl组件的另连环坑:

Installation of curl fails - easy.h should be in /include/curl/

缺少依赖,而且依赖的路径不正确,解决方法

apt-get install -y libcurl4-openssl-dev
debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"
if [ ! -d /usr/include/curl ]; thenln -sT "/usr/include/$debMultiarch/curl" /usr/local/include/curl
fi

docker-compose

mariadbredis基本不需要定制,可以直接使用官方的镜像。我这里稍微做了一点定制。

docker-compose.yml

文件docker-compose.yml

version: '2'
services:mariadb:build: ./mariadbcontainer_name: wx-mariadbhostname: wx-mariadbrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: cm9vdA==ports:- 3306:3306volumes:- db:/var/lib/mysqlredis:build: ./rediscontainer_name: wx-redishostname: wx-redisrestart: alwaysports:- 6379:6379php:build: ./phpcontainer_name: wx-phphostname: wx-phprestart: alwaysports:- 80:80volumes:- ./html:/var/www/htmldepends_on:- mariadb- redis
volumes:db:

说明

  • ports暴露端口
    80:80前一个是宿主机端口,后一个是容器端口
  • volumes分区映射
    ./html:/var/www/html前者是宿主机的路径,后者是容器内的路径(不存在时会自动创建),可以理解为挂载。前者不能包含软连接,因为软连接只能在容器内部连接,因而找不到宿主机内的文件
    db:/var/lib/mysql前者是创建的分区文件,后者是容器内的路径,可以理解为虚拟磁盘
    分区映射是在镜像构建以后的操作。因此在镜像构建过程中,无法使用docker-compose.yml中定义的volumes

容器间的连接

localhost和127.0.0.1

  • 容器内的localhost127.0.0.1永远是指当前容器
  • 同一个docker-compose.yml创建的容器在同一个网络下
  • 同一个网络下的容器可以直接通过容器的ip或者名称?连接,Connect containers(写文章时找文档可找了好久)

    You can connect an existing container to one or more networks. A container can connect to networks which use different network drivers. Once connected, the containers can communicate using another container’s IP address or name.

  • link/links参数不再推荐使用(自动在/etc/hosts里添加各主机的ip主机名的记录)
  • 宿主机通过暴露的端口连接容器,尽量用127.0.0.1

注意

  • 在宿主机内,用mysql的web客户端(如adminer.php)连接数据库时,主机地址填service中的主键名mariadb(容器名wx-mariadb不能用来连接,可能是我的理解有问题,详细参考文档)。不能填写localhost或者127.0.0.1
    同理,连接redis要用主机名redis进行连接。
    进行连接时,发送请求的主机是wx-php
  • 利用宿主机内的mysql客户端连接服务器的话,主机地址填写127.0.0.1。使用localhost连接mysql时,会使用sock进行连接,因而出错。

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")

开发调试

IP白名单

Web框架往往只能在本机上(localhost或者127.0.0.1)进行开发调试。根据上述说明,此时的“本机”是指容器本身。因此,需要在框架的设置中,将宿主机在docker网络中的ip设置到白名单里。

参考文章

  • 工具集/docker/webserver(本文案例)
  • naga3/docker-lamp
  • Installation of curl fails - easy.h should be in /include/curl/ #467
  • Bug #74125 PHP 7.1.2 compilation and libcurl error
  • Legacy container links
  • Connect containers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884908.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真

1.课题概述基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真,包括电机,SVPWM模块,矢量控制器模块等。2.系统仿真结果3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介基于空间电压矢量控制(Space Vector PWM,SVPWM)的无速度传感器电机控制系统,特别是…

如何为 .NET 在线客服系统的 Open Api 开放接口实现 QPS 限流功能

在 .NET 中实现 QPS 限流有很多方案,对于小流量的应用,内存限流和基于中间件的限流方式可能已经足够,而对于高并发的分布式系统,可能需要 Redis 或者更复杂的算法,如令牌桶或滑动窗口。我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几…

C# 部署 tensorRT resnet分类模型 deploy TensorRT model with C#

基于生态的优势,一般都是用pytorch写模型;但是工业现场的部署,目前比较方便的还是onnx;当下为了追求效率,使用了TensorRT C#: .net8 GPU: A2000 / 4070Ti OS: windows Cuda: 11.8 预处理:Emgu.CVinstall v11.8 Cuda 默认安装,会生成以下路径 C:\Program Files\NVIDIA GP…

自然语言处理入门【第6章】:自然语言处理的应用

搜广推业务 信息检索 搜索、广告和推荐是很多互联网大厂赖以生存的命脉。比如,百度的搜索引擎、京东淘宝的推荐系统、腾讯的广告业务等。这一节我们就看看搜广推业务当中的自然语言处理方法。 1. 什么是信息检索 信息检索(Information Retrieval,IR)是指从大量的非结构化或…

提取东京食尸鬼主题曲

钢琴的声音实在是太好听了,这演奏者的指法真的逆天了! 利用IE缓存来提取视频文件是屡试不爽啊,只要视频不是经过加密的,均能提取成功。打开IE浏览器,关闭所有标签,仅留下一个空白标签,并打开Internet选项删除浏览历史记录点设置,查看文件,打开缓存文件夹,删除文件夹内…

树梅派XBMC解决方案比较

本文是Raspberry Pi XBMC Solutions Compared: Raspbmc vs OpenELEC vs XBian的译文,可能已经过时。XMBC是我们最喜欢的媒体中心解决方案之一。Raspberry Pi使得打造一台豪华的XMBC机器仅需35$。有三个为Pi定制的版本,但是,你该选择哪一个呢?这些版本略有差异,各有长短。本…

deepseek破限的一种方法

起因是https://www.south-plus.net/read.php?tid=2455666这篇帖子的作者在B22F提到他的Deepseek的破甲关键词和使用流程,咱直接复制粘贴直接被deepseek拒绝了呜呜呜 失败案例: 我大致提取了一段不会被办的话,试了一下可以和其他的混合使用破甲效果极佳(但是荤段子得靠其他…

实体机双系统

本文年代久远,可能已经不再适用。仅供参考首先说一下,双系统并不会影响两个系统各自的速度。两个系统都是独立的,分别位于硬盘的不同位置,独立运行。也就是说,当一个系统在运行时,另一个系统只是储存在硬盘上的文件,这自然不会对系统的速度有影响。 另外,安装双系统是有…

2024.1.17web HTTP协议基础

2.1 HTTP的基本概念与交互模型 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。 HTTP 协议的特点 1.无连接—限制每次连接只处理一个请求 2.无状态—协议对于事务…

173 词转换成向量形式

介绍一下\(\text{Skip-Gram}\)算法。非常简单的一个算法,训练集由\(\text{context}\)和\(\text{target}\)组成,前者是一个句子中的某一个单词,后者是这个句子中这个单词临近的某个词。举例如下我们获得单词的嵌入向量后,就放入神经网络中去跑,再利用\(\text{Softmax}\)如下…

对象

Array:数组 定义 var 变量名 = new Array(元素) var arr = new Array(1,2,3); var 变量名 = [元素] var arr = [1,2,3]; arr[索引]=值; 可以变长变类型

《操作系统真相还原》实验记录2.9——完善内存管理系统

本文章实现内容如下: ① 完成了更细粒度的内存分配机制——arena机制的建立 ② 完成了内存分配系统调用 malloc() 的实现 ③ 完成了内存释放系统调用 free() 的实现一、malloc 底层原理之前我们虽然已经实现了内存管理,但显得过于粗糙,分配的内存都是以 4KB 大小的页框为单位…