一、前言
对于很多开发者来说,突然转到在 mac 系统开发,可能会非常难受,主要有以下几个原因
1、mac 上安装软件程序坑多,比如安装 PHP、Nginx,会存在很多使用 linux 或 windows 时没有遇到过的坑
2、对 mac 系统不熟悉,就导致排查错误很难快速定位,网上资料都是复制粘贴一顿抄,很难得到借鉴
3、mac 对文件的权限掌握比较烦,比如执行一个 find / -name ... 都会报出一大趟 permission ,心情瞬间跌入谷底
4、windows 上用习惯的很多软件,到了 mac 系统,找不到了,并且一时半会还找不到替代品
基于此,用博主自己的难受经历,帮助后来者不再体会这种难受,让 转到 mac 开发的开发者快速上手,不至于把时间浪费在环境不一致上。
可以采用的部署方案
1、使用 mac 自带的双系统功能,安装 windows 系统,完全放弃使用 mac 系统,改为使用熟悉的 windows 系统开发
2、在 mac 系统安装虚拟机,虚拟机上运行 windows 环境
3、使用 mac 的集成环境 mamp pro,它和 windows 上 phpstudy 类似,工具里可以选择使用 apache、nginx、mysql5.7,以及多个PHP 版本、Redis、MongoDB
4、使用 docker 在mac 系统上部署开发环境,不使用 mac 自身的软件,转而使用 docker 部署的环境,将 docker 容器的端口与 mac 系统的端口进行映射
最终采用的部署方案
前两种方案都是转为使用 windows 系统。
第三种方案是使用集成环境,就像在 windows 上使用 phpstudy 一样,只要简单的配置就可以快速集成开发,但因为其依托的还是Mac系统,因此mac系统上的文件权限以及一些其他问题,后期可能还是会出现,放弃使用。
第四种方案,使用docker部署 LNMP 环境,使整个开发环境独立于 mac 之外,好处在于容错率高,不受 mac 系统特性的约束,且其依托于 centos 运行,出现问题更易排查,并且使用 docker 可以方便后期快速以秒级实践微服务、集群等操作。
因此最终,决定使用第四种方案,采用 docker 部署 LNMP 环境,镜像包我之前已经制作过,属于拿来就可以用,预计采用这种方式部署完成 + 测试完成 时间不会超过 20 分钟,将大大的减少在环境部署上浪费的时间。
简单描述 docker 的作用
这里简单说下docker的作用,docker在团队中一般用于集成统一开发环境,并且 使用 docker 可以快速的部署集群,docker 的作用和虚拟机类似,但是它的性能却是秒级,甚至是毫秒级的,在对机器的性能利用上,远远超过虚拟机。
Docker 技术并不难掌握,使用起来却极为方便。
二、正式使用 Docker 在 mac 上部署开发环境
1、下载 docker 的 dmg 包
官网下载地址:https://www.docker.com/products/docker-app
注:如果下载速度慢,可以下载我上传到百度网盘的
链接: https://pan.baidu.com/s/1oNMCdokjCAcK93Nr3IIfpw 密码: h6ra
2、在 mac 系统上安装 docker
这个就不说了,就和安装 phpstorm 是一个套路,安装后,它是长这个样子的:
3、你可以在 mac 的最上面找到它
在这里,我们可以关闭或重启 docker 服务
4、在 mac 上,配置 docker 的国内下载镜像
注:默认会从国外的 dockerhub上拉取镜像,这样下载镜像会非常慢的
cd ~
cd .docker
vi daemon.json#将文件内容替换为下面内容{"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
5、下载别人制作好的 LNMP 集成环境镜像
注:这里,我制作了一个 集成 Linux-centos7.6、Nginx、MySQL5.7、PHP7.3、Redis 的镜像,供大家使用。该镜像内部还下载了一些 PHP 常用的扩展,比如 PDO、curl、fileinfo、openssl、memcache、memcached、redis、swoole、yaf、yar、amq,以减少大家在安装扩展时浪费的时间。拉取后,创建容器就可以直接使用,非常便捷。
在mac终端执行:
docker pull haveyb/lnmp
点击进入该 docker LNMP 镜像使用介绍
6、创建容器
这里就可以按照需求来自定义创建了。
这里在创建时,指定了将宿主机的 /Users/data 与 容器内的 /data 同步,并且做了3个端口的映射。
也就是将常用的 nginx 的80端口,redis 的 6379 端口、mysql 的3306 端口都与宿主机 mac 系统的端口做了映射。这样,我们就可以在mac 通过 navicat、redis desktop manager 来连接容器内的mysql和redis,实现无缝连接。
docker run -itd --name lnmp --privileged -p 6379:6379 -p 80:80 -p 3307:3306 -v /Users/SH-Server:/data haveyb/lnmp /usr/sbin/init
容器创建成功,会返回容器ID。
参数解释:
-itd:指定容器以交互的方式运行
--name:指定创建的容器叫什么名字
-p:指定宿主机 mac 和容器内的端口映射,比如,-p 3307:3306,则表示,连接mac 的3307 端口,实际上就会请求到容器内的3306端口,-p 参数可以指定多个
-v:指定目录共享,比如 -v /Users/SH-Server:/data,则表示,将宿主机 mac 的 /Users/SH-Server 目录与容器内的 /data 目录共享同步,-v 参数也可以指定多个
--privileged:赋予特殊权限,如果不指定,有些命令在容器内将不能执行
haveyb/lnmp:命令中的 haveyb/lnmp 表示指定使用哪个镜像为基础创建容器(可以将镜像理解成一个包装好的模具,而容器就是模具生产出来的实际可以使用的产品)
/usr/sbin/init:指定启动容器使用的命令,指定这个启动命令,将可以使用 systemctl 等命令
点击快速查看 docker 常用命令
7、创建容器后,进入容器
docker exec -it lnmp bash
发现没,是我们最熟悉的linux界面,如果你细心的话,会发现,用户名变成了root,并且后面跟着的字符串就是我们运行的容器的容器ID标识
注:在 mac 系统中执行命令
docker exec -it 容器名 bash 进入指定的容器
docker images 将显示现在mac 系统所有的docker 镜像
docker ps -a 将显示所有容器,并且如果指定了端口映射,端口映射也会打印出来
docker start/stop 容器ID,开启或关闭容器
docker rm 容器ID,移除指定的容器(前提是要先关闭这个容器)
docker rmi 镜像ID,移除指定的镜像(前提是已经没有通过这个镜像创建的容器存在了)
注:在容器中执行命令:
exit 退出容器,返回 mac 系统
8、由于镜像已经集成 LNMP 环境了,因此我们这里可以直接开始搭建测试站点了
(1)修改mac环境的hosts 文件,把指定域名的请求,转为请求本地。在mac 上执行:
sudo vi /etc/hosts
将要测试的域名添加到这里,比如这样:
(2)到容器中编写 nginx 站点配置文件
因为前面我们已经做了 宿主机的 80 端口 映射到 容器内的 80 端口,因此,在mac上浏览器域名访问时,请求的mac系统的 80 端口,将直接将请求打到容器内的80端口
# 先从mac进入容器内部
docker exec -it lnmp bash
然后到 /usr/local/nginx/cond.d 目录下创建一个名为 ttt.haveyb.com.conf 的文件,内容如下:
server {listen 80;server_name ttt.haveyb.com;client_max_body_size 128M;charset utf-8;error_log /usr/local/nginx/logs/error/ttt.haveyb.com.log error;access_log /usr/local/nginx/logs/access/ttt.haveyb.com.log main;root /data/ttt;index index.html index.htm index.php;location / {try_files $uri $uri/ /index.php?$query_string;}location ~ ^/assets/.*\.php$ {deny all;}location /favicon.ico {log_not_found off;access_log off;}error_page 404 403 500 502 503 504 /404.html;location = /404.html {root /data/errorPage;}location ~ \.php$ {fastcgi_pass unix:/dev/shm/php-cgi.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}location ~ /\.ht {deny all;}}
(3)编写测试文件,到定义的网站目录下编写一个测试的PHP文件,这里就是上面指定的 /data/ttt 目录
cd /data
mkdir ttt
vi index.php<?php
phpinfo();
9、在mac上通过浏览器访问我们配置的域名 ttt.haveyb.com
将直接将请求打到容器内的nginx,由容器内的 nginx 处理请求,如果不出意外,将会返回 PHPINFO 的信息:
10、结语
到这里,就已经很简单的配置好了 MAC 上的 PHP开发环境,并能够正常访问了,并且除了 hosts 文件外,并没有其他任何文件涉及到 mac 本身的,都是 linux 的,完美实现前期的期望。
整个部署过程 + 测试过程,应该不会超过 20 分钟。
对比直接在 mac 系统上搭建环境,节省了很多时间。并且避免了mac 系统使用上的许多坑。
三、程序管理(在docker 容器中操作)
1、Nginx 的管理:
systemctl status/start/stop/restart/reload nginx# 站点的配置文件放在 /usr/local/nginx/conf.d 目录下
2、PHP 的管理
systemctl status/start/stop/restart/reload php-fpm# php.ini 文件位于/usr/local/php/etc/php.ini# phpize全局可用
3、MySQL 的管理
systemctl status/start/stop/restart/reload mysql# MySQL 数据文件、慢查询日志、错误日志位于 /usr/local/mysql/data 目录下# 配置文件位于 /etc/my.cnf# 初始密码:123456
(1)可以通过设置mysql错误日志级别 log_error_verbosity 来减少mysql错误日志的记录,默认是都记录,建议添加 log_error_verbosity = 1,即只记录error
(2)如果restart报错,则执行 chown -R mysql:mysql /usr/local/mysql/ (这个过程大约会用1分钟左右的时间),然后再restart
(3)如果你的云服务器配置没有到 2核cpu-4G内存,那很有可能会出现 mysql 重启失败 ,这是内存容量导致的。因此建议运行docker的云服务器配置不说太高,但是2核4G是最少的了。
(4)云服务器可以和我一样,选购腾讯云的,主要是cpu性能不阉割,价格还便宜 。点击进入 购买直通车腾讯云限时秒杀
4、Redis 的管理
systemctl status/start/stop/restart/reload redis# conf 配置文件位于 /etc/redis.conf,哨兵sentinel配置文件位于 /etc/redis-sentinel.conf# 初始密码:haveyb
5、memcached 的管理
systemctl status/start/stop/restart/reload memcached
四、Docker 使用过程中可能遇到的问题及解决方案
1、Docker创建容器后并映射端口号后,navicat 远程连接mysql
2、Docker中使用git clone 报错 Could not resolve host: github.com; Unknown error
3、进入容器后,没有clear指令
yum install ncurses
五、使用 mac 开发过程中,建议使用的软件
博主在 windows 上开发时,使用的是 phpstudy + xshell + filezilla,换到 mac 上,发现一个没有mac版本的,经过实验各个类似软件,我这里只推荐我认为替代最完美的软件,供你参考。
1、开发idea 还是使用 PHPStorm
2、连接本地使用 Termius
相当于 windows 上的 cmd 和 cmder,苹果自带的工具叫做“终端”,但这里推荐我认为更好用的 Termius
3、连接远程服务器使用 Termius
相当于win10 上的 xshell,对,还是这个软件,用过几乎市面上的所有ssh终端,发现只有它能够完美替代 xshell,最主要的是颜值高,看着就舒服
它是收费的,但我相信一个程序员的素养,是绝对可以找到破解版的,对吗
4、本地与远程服务器之间传输文件:Termius
在 windows 上,实现这个功能,使用的工具是 filezilla,在mac上,推荐使用的还是Termius
而且它不仅可以本地与远程服务器之间传输,还可以两个不同的远程服务器之间传输
5、虚拟机:vmware fusion
虚拟机性能并不高,因此这里建议只将一些mac上无法替代的办公软件放到这里,我在虚拟机里只放了一个 mindmaster思维导图工具,当然,mac 上也有 xmind 和 mindNode,但毕竟用习惯了,也不准改了
6、连接数据库:navicat Premium
在连接数据库上,不论是 windows 还是 mac,使用的都是这个,没得说
7、接口测试
postman,没错,mac 上也是有 postman 的
维护搜索生态,从我做起,拒绝任何人转载。
之所以这样说,是因为之前在mac上部署开发环境时,遇到问题,搜索出来的结果居然都一样,都是复制粘贴的,这样,浪费了很多时间。为了避免这种情况发生,维护搜索生态,打击一切符合粘贴式的文章发表是十分有必要的。也倡导所有人都能够写自己确实的文章,而不是转载复制粘贴。
@老迟笔记 https://www.haveyb.com