20分鐘完成Mac上的 LNMP 環境部署,優雅·高效開發(Docker方式)

一、前言

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

 

 
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282063.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282063.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282063.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

可編程交換時代就在這里

在第一批網絡處理器推出20年后&#xff0c;我們正在向完全可編程數據平面邁進&#xff0c;網絡運營商在虛擬化方面的努力推動了這一趨勢的發展。 大多數物理網絡系統正在被運行在網絡核心和邊緣的服務器上的虛擬網絡功能&#xff08;VNF&#xff09;取代。這些服務器一般采用通…

【智力大沖浪】

【智力大沖浪】riddle內存限制&#xff1a; 128M【題目描述】例 1 智力大沖浪&#xff08;riddle.pas&#xff09;。【題目描述】小偉報名參加中央電視臺的智力大沖浪節目。本次挑戰賽吸引了眾多參賽者&#xff0c;主持人為了表彰大家的勇氣&#xff0c;先獎勵每個參賽者 m 元。…

調試 不彈出 小米_時隔六年,小米NFC碰碰貼復活,碰一下自動亮燈、聯網、投屏...

有朋友問我&#xff0c;NFC除了刷門禁、刷公交、離線支付外&#xff0c;還能干什么&#xff1f;實際上NFC的應用場景遠不止于此&#xff0c;今天就帶大家開開眼界。今年是小米十周年&#xff0c;各種酷玩新品不斷&#xff0c;其中“小米碰碰貼2”就是一款便宜又好玩的產品。小米…

微信小程序把玩(三)tabBar底部導航

為什么80%的碼農都做不了架構師&#xff1f;>>> tabBar相對而言用的還是比較多的&#xff0c;但是用起來并沒有難&#xff0c;在app.json中配置下tabBar即可&#xff0c;注意tabBar至少需要兩個最多五個Item選項 主要屬性&#xff1a; 對于tabBar整體屬性設置&…

WPF 之列表分頁控件

WPF 之列表分頁控件控件名&#xff1a;WindowAcrylicBlur作者&#xff1a; WPFDevelopersOrg - 黃佳 | 驚鏵原文鏈接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。項目使用 MIT 開源許可協議。新建Paginat…

高并發下防止庫存超賣解決方案

一、概述 目前網上關于防止庫存超賣&#xff0c;我沒找到可以支持一次購買多件的&#xff0c;都是基于一次只能購買一件做的秒殺方案&#xff0c;但是實際場景中&#xff0c;一般秒殺活動都是支持&#xff11;&#xff5e;&#xff15;件的&#xff0c;因此為了補缺&#xff0…

【幾何/分治】【最短路】【數學期望】Day 10.24

1、斜率 可以證明如果兩點之間還有一點的話那么原來的兩個點連線一定不會是最大斜率 然后我就寫了個沙茶分治………… 其實根據上面的推論只用枚舉相鄰的兩個點&#xff0c;掃一遍就可以了 1 #include <cstdio>2 #include <algorithm>3 #include <iostream>4…

K8s 介紹

過去一段時間&#xff0c;公司事情比較多&#xff0c;現在稍微能好點&#xff0c;今天進一步驗證自己K8S 集群環境&#xff0c;遇到不少問題&#xff0c; 發現從自己的master 上無法訪問node 的pod&#xff0c; 然后一堆search 。 config 。。 [rootk8s-master ~]# systemctl s…

easypoi needmerge失效_EasyPOI簡單用例,簡單有效

用poi導出Excel表格&#xff0c;需要配置很多東西&#xff0c;也比較麻煩&#xff0c;這里使用poi的封裝easypoi&#xff0c;可以快速配置&#xff0c;實現Excel或者word文件的導出。這里我們結合SpringMVC開發easypoi。1&#xff0c;導入以下3個.jar包:這里是springMVC和easyp…

禁止sethc.exe運行 防止3389的sethc后門

廢話&#xff1a;在土司看到的一篇文章,發私信給那個哥們兒說讓不讓轉載,結果還沒回復我就在百度看到相同的文章。他自己也是轉載的。這哥們兒ID遲早被ban 文章轉載自:http://www.jb51.net/hack/64484.html 點“開始”&#xff0c;在“運行”中敲入gpedit.msc依次展開“用戶配置…

Mac 與虛擬機中的linux集群共享文件目錄設置

一、環境介紹 本機&#xff1a;Macos Big Sur系統 虛擬機軟件&#xff1a;vmware-fusion 虛擬機上虛擬的linux - centos7 系統 二、實現的效果 在mac上創建一個/Users/SH-Server/vm-vagrant目錄&#xff0c;作為之后和虛擬機linux系統 /data 文件夾的共享目錄。 我們最終想…

jsp編程技術徐天鳳課后答案_jsp編程技術教材課后習題.doc

jsp編程技術教材課后習題JSP編程技術習題集1.6 本 章 習 題思考題(1)為什么要為JDK設置環境變量&#xff1f;(2)Tomcat和JDK是什么關系&#xff1f;(3)什么是Web服務根目錄、子目錄、相對目錄&#xff1f;如何配置虛擬目錄&#xff1f;(4)什么是B/S模式&#xff1f;(5)JSP、Jav…

JVM知識(一)

java三大流&#xff1a;數據流、控制流、指令流 線程是執行程序的最小單元&#xff0c;一個線程中也有這些東西。 java 運行時數據區&#xff1a; 1.程序計數器 指向當前線程正在執行的字節碼指令地址。如果此時從一個線程轉為執行另一個線程&#xff0c;此時就會中斷&#xff…

AWD-LSTM為什么這么棒?

摘要&#xff1a; AWD-LSTM為什么這么棒&#xff0c;看完你就明白啦&#xff01;AWD-LSTM是目前最優秀的語言模型之一。在眾多的頂會論文中&#xff0c;對字級模型的研究都采用了AWD-LSTMs&#xff0c;并且它在字符級模型中的表現也同樣出色。 本文回顧了論文——Regularizing …

Spread / Rest 操作符

Spread / Rest 操作符指的是 ...&#xff0c;具體是 Spread 還是 Rest 需要看上下文語境。 當被用于迭代器中時&#xff0c;它是一個 Spread 操作符&#xff1a;&#xff08;參數為數組&#xff09; function foo(x,y,z) {console.log(x,y,z); }let arr [1,2,3]; foo(...arr);…

python postman腳本自動化_如何用Postman做接口自動化測試

什么是自動化測試把人對軟件的測試行為轉化為由機器執行測試行為的一種實踐。例如GUI自動化測試&#xff0c;模擬人去操作軟件界面&#xff0c;把人從簡單重復的勞動中解放出來本質是用代碼去測試另一段代碼&#xff0c;屬于一種軟件開發工作&#xff0c;已經開發完成的用例還必…

Mac上,為虛擬機集群上的每臺虛擬機設置固定IP

一、環境介紹 本機&#xff1a;macOS系統 虛擬機軟件&#xff1a;VMware Fusion 虛擬機上&#xff1a;centos7內核的Linux系統集群 二、為什么要為每臺虛擬機設置固定ip 由于每次啟動虛擬機&#xff0c;得到的ip可能不一樣&#xff0c;這樣對遠程連接非常不友好&#xff0c…

朱曄的互聯網架構實踐心得S1E7:三十種架構設計模式(上)

設計模式是前人通過大量的實踐總結出來的一些經驗總結和最佳實踐。在經過多年的軟件開發實踐之后&#xff0c;回過頭來去看23種設計模式你會發現很多平時寫代碼的套路和OO的套路和設計模式里總結的類似&#xff0c;這也說明了你悟到的東西和別人悟到的一樣&#xff0c;經過大量…

記一次某制造業ERP系統 CPU打爆事故分析

一&#xff1a;背景 1.講故事前些天有位朋友微信找到我&#xff0c;說他的程序出現了CPU階段性爆高&#xff0c;過了一會就下去了&#xff0c;咨詢下這個爆高階段程序內部到底發生了什么&#xff1f;畫個圖大概是下面這樣&#xff0c;你懂的。按經驗來說&#xff0c;這種情況一…

PC端和移動APP端CSS樣式初始化

CSS樣式初始化分為PC端和移動APP端 1.PC端&#xff1a;使用Normalize.css Normalize.css是一種CSS reset的替代方案。 我們創造normalize.css有下面這幾個目的&#xff1a; 保護有用的瀏覽器默認樣式而不是完全去掉它們一般化的樣式&#xff1a;為大部分HTML元素提供修復瀏覽器…