转载至个人博客php
做为一只iOS前端工程师,最近对PHP产生了兴趣,我认为这不属于游手好闲,做为一个程序员不该该把本身局限在一个封闭的领域当中,应该时刻保持好奇心,因此我对“世界上最好的语言”
开始了探索~html
工欲善其事,必先利其器,首先就要搭建开发环境,因为本人不喜欢由于开发环境把本身的电脑搞得乱七八糟,乱安装一些有的没的依赖开发包,因此我选择虚拟机+Docker
来搭建环境~前端
下面咱们开始:mysql
我选择了彻底兼容Redhat
系统的CentOS7
发行版Linux
系统,下载Linux
而且虚拟机安装系统这里就省略了,准备好Linux
系统就能够开始安装Docker
了。linux
若是之前安装过想从新安装新版本请先使用下面的命令卸载旧版本的Docker
,第一次安装请直接到第二步nginx
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 复制代码
Docker
提供两种安装方式,官方推荐使用软件仓库的方式安装Docker
,方便更新等操做,另外一种是以RPM的方式安装,这里不作介绍~git
直接用官方推荐的方式安装,首先设置Docker
的软件仓库程序员
先安装Docker依赖的软件包github
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 复制代码
设置稳定版本的Docker
仓库地址,Docker
还提供了测试版本的地址,这里咱们不须要,只要稳定版本就能够了。sql
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 复制代码
安装Docker
的最新版本
$ sudo yum install docker-ce 复制代码
启动Docker
服务
$ sudo systemctl start docker 复制代码
测试Docker
是否工做正常
$ sudo docker run hello-world 复制代码
若是输出了 hello world
说明Docker已经安装正常了
Dockerfile
是用来制做镜像使用的一系列Docker
命令的脚本文件,docker build
命令会根据Dockerfile中的设置生成咱们自定义的镜像。
首先准备好一个目录结构以下:
testphp #你自定义的一个目录名
├── html #用做Nginx的站点目录
│ └── phptest #子目录能够自定义
│ ├── index.php #一段简单的PHP代码,好比<?php phpinfo();?>
├── mysql #Mysql数据库相关的目录
│ ├── conf #Mysql配置文件目录
│ └── data #Mysql数据目录
├── nginx #Nginx相关目录
│ ├── conf #Nginx配置文件目录
│ └── logs #Nginx日记目录
└── php-mysqli #咱们须要根据官方镜像生成支持mysqli的镜像,此为自定义目录
└── Dockerfile #生成自定义镜像的Dockerfile
复制代码
在php-mysqli
目录下的Dockerfile
文件中,输入以下内容:
FROM php:7.2.11-fpm #基于PHP官方镜像7.2.11-fpm版本制做自定义镜像
RUN docker-php-ext-install mysqli #安装PHP扩展支持mysqli
复制代码
完成之后不用手动运行docker build
命令生成镜像,稍后使用docker-compose
自动帮咱们构建镜像。
docker-compose
是Docker
提供的用于管理多个Docekr
容器的工具,Docker
推荐的理念是,一个容器运行一个服务进程,这里咱们搭建的环境包括,一个PHP
服务进程、一个Nginx
服务进程、一个phpadmin
进程(用于方便的操做mysql
数据库的工具)、一个mysql
服务进程,总共4个,因此须要先安装docker-compose
。
下载docker-compose
命令文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
复制代码
为docker-compose
命令文件赋予可执行权限
sudo chmod +x /usr/local/bin/docker-compose
复制代码
测试安装是否正确
$ sudo docker-compose --version 复制代码
若是正常输出版本号说明安装完成
docker-compose
命令能够根据咱们编写的docker-compose.yml
文件自动的管理Docker
镜像。
在咱们本身创建的根目录下面新建一个docker-compose.yml
,输入以下内容:
version: '3' #指定docker-compose文件的版本,低版本不支持services、
services: #networks等标签
phpmyadmin:
image: phpmyadmin/phpmyadmin #使用的镜像
ports: #端口映射
- "8080:80"
depends_on: #此服务要依赖于mysql服务
- mysql
links: #链接到mysql服务
- mysql:db
networks: #指定内部网络
- app_net
nginx:
image: nginx:latest
ports:
- "80:80" #容器中的80端口映射到HOST的80端口
depends_on:
- "php"
volumes: #指定挂载的文件或目录
- "./nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "./html:/home:ro"
networks:
- app_net
container_name: "compose-nginx" #指定容器名字
php:
build: ./php-mysqli #这里指定Dockerfile的路径 会帮咱们自动构建镜像
image: php:7.2.11-fpm-mysqli
ports:
- "9000:9000"
depends_on:
- mysql
volumes: #这里的挂载目录要和nginx中的同样,不然找不到php文件
- "./html:/home"
networks:
- app_net
container_name: "compose-php"
mysql:
image: mysql:5.7.24 #数据库镜像版本
ports:
- "3306:3306"
volumes:
- "./mysql/data:/var/lib/mysql"
- "./mysql/conf/my.cnf:/etc/mysql/my.cnf"
environment: #镜像内部使用的环境变量,这里用来折纸数据库的密码
- MYSQL_ROOT_PASSWORD=zhaofucheng
networks:
app_net:
ipv4_address: 10.10.10.1 #指定内部网络中的IP地址
container_name: "compose-mysql"
networks:
app_net:
driver: bridge #网络模式用桥接
ipam:
config:
- subnet: 10.10.0.0/16 #使用CIDR方式子网划分
复制代码
这里咱们须要把配置文件放到咱们的指定的目录中,稍后更改配置不须要进入到容器内部,也能更好的管理配置咱们的服务。
有两种方式准备镜像文件,一是本身从头编写,而是从镜像当中复制一个默认的再根据本身的须要去修改,这里咱们选择从镜像当中复制。
准备Nginx配置文件
启动一个临时容器
$ sudo docker run --name tmp-nginx-container -d nginx 复制代码
从临时nginx
镜像当中复制配置文件 放到咱们本身创建的nginx/conf
目录中
$ sudo docker cp tmp-nginx-container:/etc/nginx/nginx.conf ./nginx/conf/nginx.conf 复制代码
删除创建的临时容器
$ sudo docker rm -f tmp-nginx-container 复制代码
编辑文件内容以下:
user nginx;
worker_processes 2; #根据CPU核心数量指定工做线程的数量,这里个人虚拟机为2核心
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
#日志记录的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#访问日志的目录地址
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 80; #监听端口
server_name test.ng; #虚拟主机的名称,稍后要写入到本机的host文件当中
root /home/phptest; #项目php的路径
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log error;
location / {
index index.html index.htm index.php;
}
#配置全部访问php的请求都交给PHP: FastCGI 进程管理器处理
location ~ \.php$ {
fastcgi_pass php:9000;#这里是在docker-compose.yml文件中指定的服务名和端口号
fastcgi_index index.php; #默认寻找的php入口页面
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; #网络上还有另外一种方式 include fastcgi.conf; 因为要引入一个新的配置文件 这里我就嫌麻烦就使用这种方式了 根据我的喜爱本身选择吧
}
}
}
复制代码
一样复制Mysql
的配置文件
启动一个临时的Mysql
容器
$ sudo docker run --name tmp-mysql-container -d mysql:5.7.24 复制代码
从临时的Mysql
容器中复制配置文件到咱们指定的目录
$ sudo docker cp tmp-mysql-container:/etc/mysql/my.cnf ./mysql/conf/my.conf 复制代码
删除临时的Mysql
容器
$ sudo docker rm -f tmp-mysql-container 复制代码
这里咱们使用默认的mysql配置就能够了。
在虚拟机的终端中输入:
$ ifconfig eth0 #查看默认网卡的信息 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.31.150 netmask 255.255.255.0 broadcast 192.168.31.255 inet6 fe80::caec:3251:7864:4814 prefixlen 64 scopeid 0x20<link> ether 00:1c:42:a4:5b:ef txqueuelen 1000 (Ethernet) RX packets 2341561 bytes 1335991534 (1.2 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 520557 bytes 56885302 (54.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 复制代码
其中的inet 192.168.31.150
就是咱们虚拟机的IP地址,我本人的电脑是Mac系统,因此回到在个人Mac系统电脑的终端中输入:
$ sudo vim /etc/hosts 复制代码
将咱们指定的虚拟主机名和IP地址以以下格式加入到host文件中 而后保存退出。
192.168.31.150 test.ng #Ngxin服务地址
192.168.31.150:8080 phpadmin.net #用于访问PhpAdmin服务
复制代码
稍后咱们就能够直接在浏览器中输入http://test.ng/
访问Nginx
测试了。
回到虚拟机中,咱们目前为止的文件结构以下:
testphp
├── docker-compose.yml
├── html
│ └── phptest
│ ├── index.php
│ ├── testmysql.php
├── mysql
│ ├── conf
│ │ └── my.cnf
│ └── data
├── nginx
│ ├── conf
│ │ └── nginx.conf
│ └── logs
└── php-mysqli
└── Dockerfile
复制代码
编辑咱们的index.php
文件,输入以下内容:
<?php phpinfo(); ?> 复制代码
有些人不输入<?php
而是直接写<?
,致使出现错误,还得修改什么php.ini
配置项,这里我建议就别给本身找麻烦,按照标准写法就能够了,别起什么幺蛾子~
编辑testmysql.php
文件用来测试可否链接到Mysql
数据库,输入以下内容:
<?php $db = new mysqli('10.10.10.1:3306','root','zhaofucheng','testdatabase'); if (mysqli_connect_errno()) { echo 'Error: Could not connect to database. Please try again later.'; exit; } else { echo 'The connection is successful.'; } $db->close(); ?> 复制代码
确保咱们在本身定义的根目录中输入:
testphp]$ sudo /usr/local/bin/docker-compose up -d testphp]$ sudo docker ps 复制代码
若是输入完成后能够看到四个容器都启动了,那么表明咱们成功了,若是出现了错误,请回到上面仔细对照配置项,或者Google
、Baidu
以及留言给我一块儿解决~
先在咱们本身电脑的浏览器中输入地址http://test.ng/
,成功页面以下图:
以上表明咱们的Nginx
和PHP
已经配合完美了~~
再来测试phpMyAdmin
是否也成功启动了,在浏览器中输入地址http://phpadmin.net
访问,成功页面以下图:
出现上图表明phpMyAdmin
启动成功,若是输入咱们配置的Mysql
密码能够正常登录,表明phpMyAdmin
和Mysql
配合完美了~
这里若是登录成功了,如今数据库中新建一个名叫testdatabase
数据库,用来给咱们测试PHP
是否能正常链接到Mysql
,
如今见证奇迹的时刻到了~,在浏览器中输入http://test.ng/testmysql.php
访问,若是页面显示The connection is successful.
那就表明成功了~,能够尽情的玩耍了~~。
我在使用Mysql8.0
版本的镜像来配置时,发现PHP
默认的配置不能登陆到Mysql
,致使链接报错,原来是Mysql8.0
改了密码验证方式,若是想要正常链接,须要在Mysql
数据库中把要登录的用户密码的验证方式从caching_sha2_password
改成mysql_native_password
,这里就不费那个劲了,练习环境5.7
版本的Mysql
就能够了~