• 欢迎来到本博客,希望可以y一起学习与分享

docker搭建PHP开发环境(PHP+MySQL+NGINX)以及Tomcat

笔记 benz 3年前 (2019-01-04) 159次浏览 0个评论 扫描二维码
文章目录[隐藏]

前言

使用docker搭建PHP开发环境有两种方案:
第一种:创建一个CentOS容器,在CentOS里安装php环境。(虽然简单粗暴,但不推荐,PHP、MySQL、NGINX高度耦合,不好管理与维护)
第二种:PHP、MySQL、NGINX分别创建各自的容器,各个容器共同组成PHP的开发环境。(推荐,便于管理与维护)
本教程基于第二种方案来编写,基于Windows 7 操作系统。
本教程需要先搭建好docker,Windows 7 下搭建docker就不在此处简述,可以参考别的教程来安装。提示一下:Windows 7 只能通过DockerToolbox来搭建docker,docker安装软件Windows系统官方有两种,一种是Windows 10的,另外一种是非Windows 10 的,请注意版本。

目标

部署好mysql,php,nginx,运行一个php程序

安装Docker

看这个:https://yeasy.gitbooks.io/docker_practice/

了解一个概念

安装完docker以后,我们需要了解一个概念,就是现在我们有了两个系统,一个 windows 系统即我们直接操作的图形界面系统,我们称为主机,在主机上安装了VirtualBox,该软件内有 linux 虚拟机,称为docker主机,在 docker 主机中我们之后还会创建 linux 系统,称为容器。
可以通过终端显示的用户名@计算机名来区分

创建资源文件夹

既然安装好了Docker,我们创建容器后,我们需要映射一些配置文件或网站程序文件到宿主机,所以我们创建一些文件夹来存放这些东西,我是创建了以下这些文件夹,你可以按照自己平时的习惯来创建。

进入docker环境

第一步:点击桌面“Docker Quickstart Terminal”:启动docker,并进入docker命令终端;

第二步:执行命令: docker-machine ssh default进入default虚拟机,其中default是虚拟机的名字,如果你的虚拟机不是这个名字,更换你的虚拟机名字即可。

注意:以下环境的搭建,没有别的情况下,请确保是在default虚拟机里操作。因为挂载Windows的空间是针对虚拟机的,如果虚拟机挂载后,但是你docker不在对应的虚拟机里,而是在docker刚启动的那个界面,操作挂载的空间会莫名奇妙的报错,请注意一下。

挂载Windows本地空间

之前,我创建了资源文件夹,目的是用于同步宿主机与docker里的文件数据,现在我要把这个文件夹挂载到docker里,实现文件数据互通。
第一步:打开桌面的“Oracle VM VirtualBox”图标:进入虚拟机管理器:

第二步:设置需要挂载的目录:
右击“default”虚拟机,选择“设置”:

按步骤设置:

添加后记得保存一下:

右击“default”虚拟机,选择“重启”,让配置生效:

验证是否挂载成功

重启完成后,使用命令:docker-machine ssh default连接我们的 docker 主机,进入到 docker 主机中,也就是终端显示docker@default:~$的情况,输入命令:mount可以看到data在虚拟机内的路径,进入该路径,查看是否读取到我们主机的文件与文件夹

进入 data 目录:cd /data查看该目录下的文件与文件夹:ls


如果能够显示我们主机中的目录文件就表示配置共享文件夹成功。

如果重启虚拟机,使用mount命令没有显示挂载路径,可以重启一下电脑看看。

如果挂载不成功

如果使用命令mount,没有出现上面的结果。而且你的virtualBox是使用toolBox默认安装的,那么,建议下载最新的VirtualBox安装,应该可以解决问题。

部署Mysql

1. 拉取镜像

2. 运行容器

参数说明
-d 让容器在后台运行
-p 添加主机到容器的端口映射,前面是映射到本地的端口,后面是需要映射的端口
-e 设置环境变量,MYSQL_ROOT_PASSWORD这里是设置mysql的root用户的初始密码
–name 容器的名字,随便取,但是必须唯一

ps:其实我们可以仅仅使用docker run命令就行了。docker run会先去pull,然后再create。个人习惯先把镜像pull下来,在run的时候会很快。

3. 进入容器

参数说明
-t 在容器里生产一个伪终端
-i 对容器内的标准输入 (STDIN) 进行交互

容器中默认是没有vim的,所以我们首先要安装vim,需要注意的是安装前记得先执行apt-get update命令,不然安装会出现问题。

4. 开启Mysql远程连接

这步你当然也可以不开启,可以使用ssh通道来连接,但是我这里记一笔。这里是5.7,注意了。
1.进入mysql

2.选择数据库

3.开启远程连接

如果在docker run执行了设置数据库密码的参数-e MYSQL_ROOT_PASSWORD=设置你的数据库密码 ,可以跳过这个隐藏。

记得把“password”换成你的数据库密码

4.重启

使用命令:exit退出mysql容器,执行以下命令,重启mysql容器

5.测试

使用Navicat数据库工具,链接测试:

这样就可以通过公网IP连接了,如果还是不行,请看看防火墙(自身防火墙或者各大云服务商的安全组配置)。

关于docker的IP地址查看,在主机终端下,使用命令:docker-machine ip 即可查看:

部署PHP

1. 拉取镜像

我这里拉取的是PHP 7.2 的镜像,如果需要拉取其它版本的PHP自己修改。

2. 运行容器

参数说明
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射
–-name 容器的名字,随便取,但是必须唯一
–link link 是在两个contain之间建立一种父子关系,父container中的web,可以得到子container db上的信息。
通过link的方式创建容器,我们可以使用被Link容器的别名进行访问,而不是通过IP,解除了对IP的依赖。

3. 创建php文件
在/data/wwwroot文件夹中创建一个文件夹default,代表一个默认的工作目录,在default中创建一个index.php文件:

这时候你使用以下命令进php容器:

/usr/share/nginx/html文件夹中也能看到我们创建的index.php文件,因为我们设置了目录映射。这样我们就可以直接在宿主机直接更改,而不用进容器修改。

php扩展安装

1.官方扩展安装方法

Docker PHP中安装扩展有几个特殊的命令

  • docker-php-source
  • docker-php-ext-install
  • docker-php-ext-enable
  • docker-php-ext-configure

Docker官方文档:https://hub.docker.com/_/php
总结博客版本:Docker php安装扩展步骤详解

安装mongodb扩展

mongodb扩展开启opnssl

测试代码

参考:
PHP7使用MongoDB\Driver\Manager类实现增删改查
基础:PHP连接MongoDB

根据php版本使用不同的mongodb操作库

安装redis扩展

测试代码:

安装swoole扩展

配置Nginx

1. 拉取镜像

2. 运行容器

我们先运行无挂载的容器,拿到nginx的一些配置文件

成功后,我们进入容器/etc/nginx/文件夹中,我们需要的挂载nginx.confconf.d文件夹中的配置文件,因为是我们平时需要频繁更改的配置,所以,我们将他们复制到宿主机上。

退出命令行,不要使用exit,因为exit会让容器停止。这里使用ctrl + p + q来退出容器。

然后使用docker cp操作复制出文件

3. 删除之前运行的Nginx容器

4. 重新运行Nginx容器

参数说明:
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射,这里最好nginx容器的根目录最好写成和php容器中根目录一样。但是不一点非要一模一样,如果不一样在配置nginx的时候需要注意
-–name 容器的名字
–-link 与另外一个容器建立起联系

5. 编辑配置文件

修改/data/nginx/conf.d/default.conf,我的配置如下:

配置文件中的fastcgi_pass php:9000;,因为我们在启动容器的时候–link了php容器,所以这里直接填php,就能找到php的IP,当然你也可以不配置–link,那么你可以这样找到容器IP,再将IP填入。

最后,测试一下配置是否成功。

Nginx访问PHP文件的File not found错误处理,两种情况

原文地址:https://blog.csdn.net/qq_40460909/article/details/82744178

这个错误很常见,原有有下面两种几种

  1. php-fpm找不到SCRIPT_FILENAME里执行的php文件
  2. php-fpm不能访问所执行的php,也就是权限问题

第一种情况:

更改配置文件/data/nginx/nginx.conf 或者/data/nginx/conf.d/default.conf
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 
替换成下面

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

然后重新加载nginx配置文件
/etc/init.d/nginx reload

第二种情况

两种解决方法:
第一种,就是把你root文件夹设为其他用户允许
第二种,找到你的php-fpm的配置文件,找到下面这段,把apache替换成你要的用户组

MongoDB安装

输入命令,下载mongo官方镜像到服务器上。

耐心等待下载完成,输入命令查看下载完成的镜像

镜像下载完成,下面就要开始启动容器了。启动容器前,建议大家仔细阅读前面寻找镜像时Docker Hub上关于mongo镜像的详细说明
在镜像文档里,我们知道了该镜像映射的端口号是27017,配置文件的位置在/data/configdb,数据库文件的位置在/data/db。
我们输入如下命令来启动容器。

命令执行完后,输入命令docker ps -a来查看所有的容器,可以看到mongo已经成功启动。


现在我们使用Robo工具来尝试连接,在Address填上服务器的IP地址,端口号不用改,就用默认的27017。可以连接成功。

开启身份认证

Docker版本的mongo默认不需要身份认证。刚才数据库虽然启动成功了,但是任何人知道ip地址端口号都可以登录进来。显然这样是不安全的。那如何打开身份认证功能呢。
从Docker Hub上mongo镜像的官方文档里,我们可以找到答案,需要在启动容器时加上--auth命令。

现在我们关闭并删除掉刚才的容器,重新使用身份认证模式启动一个容器。

此时再通过Robo连接数据库,发现连接失败。因为我们开启了身份认证模式,但还没有创建用户设置密码。
输入命令进入容器内部的mongo命令行

在mongo命令行输入命令创建管理员账户

创建好账户之后,我们再尝试使用Robo工具来连接,在Authentication栏目填写上刚才创建的用户名密码,即可连接成功。

创建数据库并设置用户

目前为止我们一直都是在操作mongo自带的admin库。正常情况下是不建议直接使用这个库的。我们需要自己创建数据库并设置新库的用户。

还是先使用docker exec -it mongo mongo admin命令进入mongo的命令行页面。
使用上一步骤创建的管理员账户进行授权

切换到test库(如不存在会自动创建)

创建test库下的用户


创建数据库并设置用户完成,现在再尝试使用Robo工具来连接下看看。
将Database和用户名密码改为我们刚才设置的,点击Test显示成功。
保存后直接使用工具进入数据库,可以看见test库。
至此,Docker版本MongoDB简单的安装使用教程就完毕了。
来源:(https://www.jianshu.com/p/2181b2e27021)
报错原因:(https://blog.csdn.net/u013506207/article/details/95524335)

Redis安装

拉取Docker上的Redis

启动镜像

命令 含义
-d 本地运行
6379:6379 本地端口:Redis容器内部端口
-v 开启文件挂载
G:/redisData Redis持久化数据存放目录
redis docker的镜像名
redis-server redis服务器
–appendonly yes 开启持久化
–name 执行这个运行的名称
–restart=always Docker启动容器就启动

Tomcat

1. 拉取镜像

2. 运行容器

我们先运行无挂载的容器,拿到Tomcat的一些配置文件

成功后,我们进入容器/usr/local/tomcat/文件夹中,我们需要的挂载conf文件夹中的配置文件以及logs日志文件夹、webapps网页应用部署文件夹,因为是我们平时需要频繁更改的配置,所以,我们将他们复制到宿主机上。

退出命令行,不要使用exit,因为exit会让容器停止。这里使用ctrl + p + q来退出容器。

然后使用docker cp操作复制出文件

3. 删除之前运行的Tomcat容器

4. 重新运行Tomcat容器

参数说明:
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射,这里最好nginx容器的根目录最好写成和php容器中根目录一样。但是不一点非要一模一样,如果不一样在配置nginx的时候需要注意
-–name 容器的名字
–-link 与另外一个容器建立起联系

安装phpMyAdmin

安装个phpMyAdmin,顺便测试一下MYSQL

1. 下载解压

下载地址:https://www.phpmyadmin.net/

解压到/data/wwwroot/default,并将文件夹重命名为phpMyAdmin

2. 配置phpMyAdmin

phpMyAdmin根目录下,找到config.sample.inc.php,用文本编辑器打开文件。

host中填入数据库的访问IP,这里填Mysql容器的内网IP。获取Mysql容器的内网IP,可以使用进入Mysql容器后,使用命令:cat /etc/hosts 查看。


3. 访问

访问http://外网IP/phpMyAdmin/index.php (http://192.168.99.100/phpMyAdmin/)

报错:mysqli_real_connect(): (HY000/2002): Connection refused

phpMyAdmin/libraries/config.default.php 中的$cfg['Servers'][$i]['host'] = 'localhost'; 改为 $cfg['Servers'][$i]['host'] = '172.17.0.2';

phpMyAdmin/config.sample.inc.php 中的$cfg['Servers'][$i]['host'] = 'localhost'; 改为 $cfg['Servers'][$i]['host'] = '172.17.0.2';

即把localhost改为MySql容器内部IP。

docker 中安装PHP扩展(提示缺少MySQL相关驱动)

原文地址:https://www.cnblogs.com/lglblogadd/p/9173627.html

上面,打开phpMyAdmin会报错:

也或者需要安装PHP其它扩展。

docker 中安装PHP扩展,可以通过两种方式实现
第一种:进入PHP容器,执行命令:pecl pdo_msql;

第二种:进入PHP容器,执行命令:docker-php-ext-install mysqli pdo pdo_mysql;(这里安装mysqli 、pdo 、pdo_mysql 三个扩展);

如果报 /usr/local/bin/docker-php-ext-enable: cannot create /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent
解决方案:
直接在/usr/local/etc/php目录下面新建 conf.d目录和对应的docker-php-ext-pdo_msql.ini文件
其中docker-php-ext-pdo_msql.ini的内容为:
extension=pdo_mysql.so

不管使用哪种方法,最后重启一下PHP容器。

如何获取 docker 容器(container)的 ip 地址

原文地址:https://blog.csdn.net/sannerlittle/article/details/77063800

1. 进入容器内部后

会显示自己以及(– link)软连接的容器IP

2.使用命令

docker inspect --format '{{ .NetworkSettings.IPAddress }}'

docker inspect

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

3.可以考虑在 ~/.bashrc 中写一个 bash 函数:

source ~/.bashrc 然后:

参考结果:172.17.0.6

4.要获取所有容器名称及其IP地址只需一个命令。

docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)

如果使用docker-compose命令将是:

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

5.显示所有容器IP地址:

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)


文章 docker搭建PHP开发环境(PHP+MySQL+NGINX)以及Tomcat 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!