“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
在windows操作系统上做PHP开发时,通常我们会用phpcustom或phpstudy这样的集成工具快速搭建PHP开发环境,随着Docker的出现,我们有了更多选择,本文将在win 10操作系统上演示用docker搭建PHP开发环境。
基础搭建:
首先需要安装docker,请参看官方文档:
https://docs.docker.com/desktop/windows/install/
然后建立我们的php项目目录,这里为:H:\docker,如果你选择了不同的目录后文请自行更改,在该目录下建立一个WEB首页文件“index.php”,内容如下:
<?php
echo "Docker演示,By:云客【云游天下,做客四方】".date("Y-m-d H:i:s");
phpinfo();
该文件稍后将为你展示被安装的PHP基本信息。
安装前文安装步骤,确保Docker已经开始正常运行,右下角出现了小鲸鱼图标,如果没有请检查安装是否正确,或者点击启动Docker。
然后打开“PowerShell”客户端,右击左下角的开始菜单图标,选择“Windows PowerShell”,(也可用其他shell工具),进入到PHP项目目录:
cd H:\docker
然后执行以下命令:
docker run -d -p 8080:80 `
-w /var/www/html -v "$(pwd):/var/www/html" `
--name myphp-7.4 `
php:7.4-apache
如果你使用的是其他Shell工具,可用如下命令:
docker run -d -p 8080:80 \
-w /var/www/html -v "$(pwd):/var/www/html" \
--name myphp-7.4 \
php:7.4-apache
主要区别是转义字符不一样,你也可以将以上命令写作一行,此时无需转义换行。
现在你就可以开始运行你的php程序了,打开浏览器,地址栏输入以下地址试试看:
http://localhost:8080/
你将看到前面我们建立的php文件可以正常运行了,恭喜,你的第一个Docker容器运行了!
此时双击右下角的小鲸鱼图标,打开Docker控制窗口,在“Containers / APP”里面你将看到我们刚刚建立的容器,在此你可以对它执行启动、重启、停止、删除等等动作。
现在我们回过头来看一看前文的"docker run ..."命令是什么含义,它会从Docker官方库(https://hub.docker.com/_/php)中拉取一个叫做“php:7.4-apache”的镜像到本地,并用它建立一个容器(容器和镜像的关系如同php类实例和类定义),该镜像就是我们需要的PHP运行环境,命令的选项说明如下:
-d :将容器当做服务在后台运行
-p 8080:80 :指定容器端口到宿主主机的端口映射,这里宿主机端口为8080
-w /var/www/html :指定容器的工作目录
-v "$(pwd):/var/www/html" :将我们的PHP项目目录(当前目录)挂载到容器的WEB根目录
--name myphp-7.4 :给容器取一个名字,便于日后管理
php:7.4-apache :指定生成容器的镜像,你可以指定所需的PHP版本,格式:php:<version>-apache,详见:https://hub.docker.com/_/php?tab=description
修改配置:
如果你跟随前文,那么一个能运行php的站点已经搭建好了,那么如何修改php配置呢?首先你需要进入容器中:
docker exec -it myphp-7.4 /bin/bash
该命令通过容器名(该名字是在docker run 命令中通过name选项指定的)进入到了容器内部,我们通过以下命令查看php的配置目录:
echo $PHP_INI_DIR
它输出类似“/usr/local/etc/php/”,现在我们进入该目录:
cd /usr/local/etc/php/
执行"ls"命令查看该目录会发现该镜像已经很贴心的为我们准备好了开发用和生产用的配置文件,我们选择其中一个作为配置:
cp php.ini-development php.ini
复制好后,现在就可以用vim编辑php.ini了,默认容器中并没有安装vim编辑器,需要自行安装:
apt-get install vim
你可能会因为“墙”的原因安装失败,请翻墙或使用国内镜像源,这里不再赘述请百度。
用vim修改php.ini后保存退出(:wq),最后使用“exit”退出容器,点击小鲸鱼图标打开Docker窗口,重新启动容器,你会发现配置更改已经生效了
安装PHP扩展:
在官网镜像中,默认情况下有许多扩展没有被安装,比如被phpmyadmin需要的mysqli就没有被安装,本节以mysqli为例来安装,其他类似。
进入容器打开上节中的php.ini配置文件,然后在扩展设置一节去掉 mysqli 扩展前面的“;”保存退出
在容器中进入扩展安装程序目录“cd /usr/local/bin”,执行以下命令:
./docker-php-ext-install mysqli
安装成功后,退出(exit)容器,并重新启动即可
连接数据库:
通常php应用程序会连接数据库,这怎么做呢?容器是一个沙箱环境,要让内部的程序和其他容器交互,我们需要先创建一个网络:
docker network create yunke-net
这里创建的网络名为“yunke-net”,记住它,下文多次用到。
在宿主机中我们需要一个目录来存放数据库数据,因此这里创建目录“H:\docker\DBdata”
然后创建一个数据库容器:
docker run -d `
--network yunke-net --network-alias mysql `
--name yunke-mysql `
-v "$(pwd)/DBdata:/var/lib/mysql" `
-e MYSQL_ROOT_PASSWORD=yunke123 `
-e MYSQL_DATABASE=yunkedb `
mysql:8.0.28
解释如下:
--network yunke-net :将该容器连接到前文我们创建的网络中
--network-alias mysql :指定本容器在网络中的别名,这可用来做主机名使用
--name yunke-mysql :取一个容器名
-v "$(pwd)/DBdata:/var/lib/mysql" :挂载数据库数据目录,注意在shell中你当前应该还在H:\docker目录
-e MYSQL_ROOT_PASSWORD=yunke123 :指定root账户的密码
-e MYSQL_DATABASE=yunkedb :指定一个数据库名,容器建立后会自动创建该数据库
mysql:8.0.28 :指定数据库使用的版本,可参见:https://hub.docker.com/_/mysql?tab=description
然后把之前建立的php容器也加入到该网络中,它们才能通讯:
docker network connect --alias php74 yunke-net myphp-7.4
该命令为之前我们建立的容器(容器名:myphp-7.4)创建了一个网络别名“php74”,网络内的其他容器可以通过这个别名访问它
现在我们创建的两个容器都已经放到网络“yunke-net”中了,进入php容器执行以下命令观察通讯是否正常了:
ping mysql
如果ping不能使用,则用如下命令安装它:
apt-get install inetutils-ping
安装好后再次执行:“ping mysql”,将看到数据响应结果,这表明两个容器之间可以相互通讯了。
注意到了吗:这里将数据库容器的网络别名当做主机名使用了(在前文我们将其指定为:“mysql”,你也可以用其他自定义字符串)。
现在你可以用以下php程序去连接并测试数据库了,注意配置数据库连接时,主机名采用容器的网络别名:
<?php
$mysqli = new mysqli("mysql", "root", "yunke123", "yunkedb");
if ($mysqli->connect_errno) {
printf("连接失败: %s\n", $mysqli->connect_error);
exit();
}else{
echo "连接成功<br>";
}
/*
//建表
$sql ="CREATE TABLE `yunkedb`.`yunke` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(200) NOT NULL , `msg` TEXT NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB DEFAULT CHARSET=utf8; ";
if ($mysqli->query($sql ) === TRUE) {
echo "建表成功\n";
}
*/
/*
//插入数据
$insert="INSERT INTO `yunke` (`id`, `name`, `msg`) VALUES (NULL, 'yunke', '云客(云游天下,做客四方):专注drupal开发');";
if ($mysqli->query($insert) === TRUE) {
echo "插入数据成功\n";
}
*/
/*
//查询数据
if ($results = $mysqli->query("SELECT * FROM yunke")) {
foreach ($results as $value){
echo "id:".$value['id']." name:".$value['name']." msg:".$value['msg'].'<br>';
}
printf("共:%d 行\n", $results->num_rows);
$results->close();
}
*/
echo date('Y-m-d H:i:s P');
$mysqli->close();
你也可以用phpmyadmin去连接试试看,如果提示权限问题,可以进入php容器执行:
chmod -R 755 phpMyAdmin-Dir-path
以修改phpmyadmin目录权限
现在你已成功的用docker在winows系统上搭建了PHP开发的环境,你还可以将容器导出成为新的镜像分享给别人
使用Docker Compose:
在以上演示中,我们每次启动环境都需要启动两个容器,有没有更简单的方式呢?这就要用到Docker Compose了
Docker Compose是一个工具,在windows版本的Docker中已经默认被安装了,可以使用以下命令查看其版本:
docker-compose version
该工具将多个容器组合成一个应用以方便管理,这也是大多数情况下我们需要的,这里以Docker Compose方式做演示:
新建一个项目目录:“H:\php”,在其中建立程序目录和数据库数据目录:
程序目录为:“H:\php\app”,用以放置php代码,同样在“H:\php\app”中放置一个php首页文件index.php,内容如下:
<?php
echo "Docker Compose演示 ".date("Y-m-d H:i:s");
phpinfo();
数据库数据目录为:“H:\php\DBdata”,用以放置数据库数据,
在项目根目录中建立Docker Compose定义文件,文件名为“docker-compose.yml”,即“H:\php\docker-compose.yml”,其内容如下:
version: "2.0"
services:
app:
image: php:7.4-apache
ports:
- 8080:80
working_dir: /var/www/html
volumes:
- ./app:/var/www/html
mydb:
image: mysql:8.0.28
volumes:
- ./DBdata:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: yunke123
MYSQL_DATABASE: yunkedb
现在打开“Windows PowerShell”,进入目录“H:\php”,然后执行如下命令:
docker-compose up -d
你会发现两个容器都启动了,并且在Docker窗口中它们被组合在了一起。
我们只用了一条命令就启动了应用,其他常用命令如下:
docker-compose down
//注销容器:即停止并删除容器
docker-compose stop
//停止应用,但不删除容器
docker-compose start
//开始应用
docker-compose restart
//重启应用
关于“docker-compose.yml”文件的内容,基本上和“Docker run ...”命令对应,在启动时,系统自动创建网络,比如上面的列子,其创建的网络名称叫做“php_default”,在services下列出了容器定义,其键名即网络别名。
补充:
更多关于docker的知识请访问官网:https://www.docker.com/
官方镜像仓库:https://hub.docker.com/
交流互动