mac有机带的apache和php,但无法满足项目开发所需的环境,而我本人也更倾向于使用nginx服务,brew管理也不是很方便,所以我本地使用了docker,下面分享下我总结的docker搭建lnmp经验。
docker安装和使用我就不细说了,很简单,不会的可以看下官方文档。我认为通常情况下php版本和mysql版本不同才造成了项目环境的不同,所以我本地的webserver使用brew安装的nginx,这里不细说(直接brew install nginx)。
在docker中各个服务之间是以容器为单位进行分割的,而容器间的通信依赖于--link指令,所以这里先安装mysql,以便php安装时可以指定连接mysql。
docker搭建lnmp环境有两种,一种是顺序安装依赖,一种是编写yml文件通过docker-compose运行yml生成集成
第一种:
查看docker提供的mysql镜像,不指定mysql版本默认安装最新版本
docker search mysql
指定mysql版本
docker pull mysql:5.7
查看docker镜像及容器服务
docker images
##查看服务进程
docker ps
运行mysql并生成mysql容器
docker run -itdp 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 mysql:5.7
##-itdp docker指令,具体含义请查看文档,--name指定容器别名为mysql5.7,mysql:5.7镜像名(或镜像id)
##如果是线上安装,可以设置远程访问权限,以便mysql可视化工具连接
docker exec -it mysql5.7 /bin/bash
mysql -uroot -p123456
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
exit
php安装
docker pull php:7.3-fpm
docker run -itdp 9000:9000 -v /usr/local/var/www:/var/www --link mysql5.7:php-fpm7.3-mysql5.7 --name php-fpm7.3 php:7.3-fpm
##-v 指定项目挂载目录,我本地brew安装的nginx web目录为/usr/local/var/www,容器内目录/var/www(自定义)
## 挂载的目的是为了使项目持久化,当关闭容器服务后再次开启服务时,项目会自动挂载到容器内部
##--link 指定连接容器,这里是连接mysql容器,mysql5.7为镜像名,php-fpm7.3-mysql5.7为连接别名
##--name 指定容器别名为php-fpm7.3,镜像源为php:7.3-fpm
docker exec -it php-fpm7.3 /bin/bash
##进入容器
##pecl安装外,docker提供了docker-php-ext-install安装命令(后面会单独总结php扩展的安装)
##更新一下系统源apt-get update,缺少的php扩展可以pecl安装,也可以去Debian搜索要下载的包
##这两种安装都是编译安装,当然你也可以自己下载包,进行编译安装
nginx我个人建议不要放在容器内部, 因为没必要安装多个nginx,除非你有apache服务。这里就不细说nginx安装,后面会补充nginx的vhost文件。
第二种:
编写yml集成文件,通过docker-compose up命令运行集成环境(docker-compseo -f path up -d)path为绝对路径,我个人推荐第二种,下面是我的yml文件,可做参考。
version: '3.6'
networks:
lnmp:
external: true
services:
mysql5.7:
image: mysql:5.7
container_name: mysql5.7
restart: always
volumes:
- /var/mysql/data:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: "your password"
TZ: "Asia/Shanghai"
networks:
- lnmp
redis5.0:
image: redis:5.0
container_name: redis5.0
restart: always
volumes:
- /var/redis/config:/usr/local/etc/redis
- /var/redis/data:/data #持久化数据
- /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
entrypoint: ["redis-server", "/usr/local/etc/redis/redis.conf"]
ports:
- 6379:6379
environment:
TZ: "Asia/Shanghai"
networks:
- lnmp
php-fpm7.3:
image: php:7.3-fpm
container_name: php-fpm7.3
restart: always
volumes:
- /var/www/html:/var/www/html
ports:
- 9000:9000
environment:
TZ: "Asia/Shanghai"
depends_on:
- mysql5.7
- redis5.0
links:
- mysql5.7
- redis5.0
networks:
- lnmp
## 注意docker的内部网络属于局域网,你要创建专有的局域网以防止集成环境过多造成端口占用等问题,不清楚的可以看下docker网络类型介绍
## 这里的专有网络是lnmp,在运行yml之前就需要创建,创建命令docker network create lnmp
## 注意挂载是为了持久化
## redis安装时,去官网下载对应版本的redis.conf(如果你需要修改配置文件),也可以使用默认配置
## 编写的容器启动顺序,php-fpm一定要在最后且使用links指令链接redis和mysql服务
下面就是nginx配置文件了
server {
listen 80;
server_name www.test.com;
root /usr/local/var/www/html;#注意1
charset utf-8;
#access_log logs/host.access.log main;
location ~ \.php$ {
root /var/www/html;#注意2
fastcgi_pass 127.0.0.1:9000;#注意3
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
}
}
注意:
1.这里的路径是为了nginx服务从本地目录中找到项目路径
2.这里的目录是为了容器内的php服务找到项目路径,二者并不冲突但必须都写,这是很容易忽视的一个点
3.如果nginx服务不在宿主机而在服务容器,此时的ip地址应该是容器局域网ip,我这里是宿主机,所以是127.0.0.1
TinkPHP项目和Laravel项目有时候需要路由重写,请参照各自的文档 进行修改
参考文献: