一、前言
對于很多開發者來說,突然轉到在 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
?