安装dockerMac上安装docker网上有很多文章。我不会在这里描述它。对了,推荐使用阿里云或者道云提供的加速器。本文推荐参考这篇文章:https://blog.csdn.net/jiang_x...这篇文章相当于官方文档的中文翻译。使用docker-compose配置开发环境。通常,一个基本的PHP开发环境包括PHP、PHP-FPM、WEB服务器、MySQL数据库,以及相关的NoSQL服务,如Redis或memcache。我主要通过docker-compose配置服务。什么是docker-composedocker-compose是一个定义项目的YAML文件,项目包含单个或多个容器服务。一般的配置文件名是:docker-compose.yml。目录结构您可以根据自己的喜好组织项目。以下是我使用的方法。app目录包含应用程序代码,下面的services是创建服务所需要的东西。有些服务需要我们自己创建图像。在Dockerfile文件中说明您希望图像看起来像什么。在创建自定义镜像时,您可能还需要使用一些额外的文件,例如一些配置文件。一般在创建镜像的时候会把这些配置文件复制到镜像中。MySQLmysql是一个数据服务,先给这个服务添加一个数据卷,然后在这个服务中使用这个数据卷,把数据库产生的数据放在这里,这样即使我们删除了容器,数据服务中的数据也会保留在宿主机上,下次创建容器时,可以继续使用已有的数据。在volumes下添加一个名为mysql:volumes:mysql:driver:local的数据卷,然后添加一个名为MySQL的服务,并指定该服务使用的镜像。我们也可以使用我们创建的Dockerfile创建这个镜像看看,或者如果你不打算自定义镜像,你也可以使用现成的。这里我使用mysql:5.7镜像。注意最好设置具体使用的版本。此图像中有一些环境变量。我们可以在定义服务的时候设置它们的值。这里我设置了root用户的密码,要创建的数据库,用户名,密码。您可以根据需要设置它们。修改这些变量的值。在mysql服务上,我使用volumes为其指定了一个MySQL数据卷,挂载位置为容器的/var/lib/mysql,默认存放数据库的位置。因为我本地安装了MySQL服务,3306端口被占用,所以指定6306端口映射到容器的3306version:"3"services:mysql:image:mysql:5.7environment:MYSQL_ROOT_PASSWORD:"root"MYSQL_DATABASE:"app"MYSQL_USER:"app"MYSQL_PASSWORD:"123456"volumes:-./services/mysql/data:/var/lib/mysqlports:-"6306:3306"测试在我们的compose文件中,我们现在在命令行下有一个名为mysql的服务工具,进入项目所在目录,执行:docker-composeup然后会在终端看到安装镜像和启动容器的过程,再打开另一个命令终端,执行:docker-composeexecmysqlbash进入mysql容器,然后进入数据库查看:mysql-uroot-pshowdatabases;+-----------------+|数据库|+------------------+|信息模式||应用||数据库||性能模式||sys|+-------------------+5rowsinset(0.03sec)这时我们发现mysql容器已经使用php定义了一个服务解释php。我打算自己为这个服务创建一个镜像,所以我使用build而不是image。我告诉dockerDockerfile(./services/php/Dockerfile)的位置以用于我要创建的图像。Volumes是服务的数据量。我把compose文件所在目录下的app目录挂载到容器的/www/html/app位置。这样我就可以直接修改项目的代码,然后立马看到结果;同时由于本机9000端口被占用,指定9090端口映射到容器php的9000端口:build:context:./services/phpdockerfile:Dockerfilevolumes:-./app:/www/html/appports:-"9090:9000"Dockerfile用于构建php服务镜像的Dockerfile是./services/php/Dockerfile。FROM,设置基于哪个镜像创建这个镜像,我用的是php:7.1-fpm官方提供的镜像。RUN有几行命令,主要是安装一些软件包,比如一些额外的php扩展。在安装这些扩展之前,您需要安装该扩展所依赖的其他一些软件包。这里的libpng12-dev和libjpeg-dev是gdphp扩展所需要的软件包。然后我将配置文件复制到图像中。从php:7.1-fpm运行apt-getupdate&&apt-getinstall-ylibpng12-devlibjpeg-dev\&&rm-rf/var/lib/apt/lists/*\&&docker-php-ext-configuregd--with-png-dir=/usr--with-jpeg-dir=/usr\&&docker-php-ext-installgdmysqlipdo_mysqlzipopcacheCOPY./config/php.ini/usr/local/etc/php/conf复制代码.d/php.iniphp服务中遇到的坑。PHP镜像中的软件是Debian的源代码。由于众所周知的原因,镜像安装会失败,如图:这时候我们需要更换源。First第一次改成中国科学技术大学的源,然后发现不行。第二次改成阿里云源,镜像安装完美完成。修改后的Dockerfile如下:FROMphp:7.1-fpmRUNsed-i's/deb.debian。org/mirrors.aliyun.com/g'/etc/apt/sources.list\&&apt-getupdate&&apt-getinstall-ylibpng12-devlibjpeg-dev\&&rm-rf/var/lib/apt/lists/*\&&docker-php-ext-configuregd--with-png-dir=/usr--with-jpeg-dir=/usr\&&docker-php-ext-installgdmysqlipdo_mysqlzipopcacheCOPY./config/复制代码php.ini/usr/local/etc/php/conf.d/php.ini使用sed命令搜索软件源文件,将Debian域名修改为阿里云域名php.ini的自定义php配置。把你想要的php配置放到这个文件中,重建镜像,然后在再次启动php服务的时候用新的镜像重新创建容器,这样配置就会生效。memory_limit=256Mpost_max_size=100Mupload_max_filesize=100MNginx使用image指定要使用的图片,ports设置发布的端口号,这样宿主机上的8000对应容器中的80。depends_on可以设置服务的依赖关系。我让nginx服务依赖之前定义的php,这样会先启动php,再启动nginx。另外,我自己使用volumes设置了一个数据卷,让宿主机上的nginx配置文件目录对应到容器中nginx服务的配置文件目录,这样就可以直接修改nginx配置文件了在机器上,然后重启nginx服务,配置就会生效。这种方式适用于开发环境,因为修改配置后不需要重新构建镜像。在生产环境中,需要自己构建nginx镜像,将需要的配置直接复制到镜像中。有时候在开发阶段我们需要查看nginx日志,然后我配置了日志目录映射到容器,最后地址是代码目录nginx:image:nginx:1.12.2ports:-"8000:80"depends_on:-phpvolumes:-./services/nginx/config:/etc/nginx/conf.d-./services/nginx/logs:/etc/nginx/logs/-./app:/www/html/appapp.conf./services/nginx/config/app.conf,这是最基本的nginx配置文件,应用的根目录设置为/www/html/app,这里我们已经挂载了宿主机上的app目录到/容器www/html/app这个地方。注意这条命令:fastcgi_passphp:9000;这里的php是我们定义的php服务的名字。compose文件中定义的服务可以使用服务名相互通信,因为docker内置了DNS功能。服务器{听80;服务器名称本地主机;根/www/html/应用程序;#access_log/etc/nginx/logs/app.access.logmain;location/{indexindex.htmlindex.htmindex.php;autoindexon;#include/usr/local/etc/nginx/conf.d/php-fpm;#include/usr/local/etc/nginx/conf.d/pathinfo.conf;if(!-e$request_filename){###一重写一级目录最后的^/(.*)$/index.php/$1;###域名下的二级目录#rewrite^/html/(.*)$/uuabc_home/index.php/$1last;}}location=/info{允许127.0.0.1;全部拒绝;}location~\.php(.*)${#commenttry_files$uri=404;启用路径信息#try_files$uri=404;fastcgi_passphp:9000;fastcgi_indexindex.php;fastcgi_split_path_info^((?U).+\.php)(/?.+)$;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;fastcgi_paramPATH_INFO$fastcgi_path_info;fastcgi_paramPATH_TRANSLATED$document_root$fastcgi_path_info;包括/etc/nginx/fastcgi_params;}#error_page404/404.html;#error_page403/403.html;}启动经过上面几个步骤,我们已经完成了PHP开发的基础,现在我们来看看结果在app目录下创建一个index.php,内容为:
