mac m1 docker 搭建lnmp

前提:
安裝好docker,并且修改了鏡像加速,啟動(dòng)docker

一、安裝lnmp

1. 拉取鏡像,haveyb/lnmp 集成 Linux-centos7.6、Nginx、MySQL5.7、PHP7.3、Redis 的鏡像
docker pull haveyb/lnmp

2. 創(chuàng)建容器

小插曲:
因?yàn)樽约阂婚_始安裝途中會(huì)報(bào)錯(cuò):
Failed to get D-Bus connection: No such file or directory
原因是開啟privileged,但是設(shè)置這個(gè)參數(shù)并沒有生效,所以可以先解決這個(gè)問題:
1). 前往訪達(dá)資源庫,我的地址為/Users/xxx/Library/Group Containers/group.com.docker
2). 找到settings.json
3). 把deprecatedCgroupv1的false改成true:
 "deprecatedCgroupv1": true,
4). 重啟docker

開始創(chuàng)建容器,將宿主機(jī)的 /Users/xxx/Desktop/docker 與 容器內(nèi)的 /data 目錄同步,并且將 nginx 的80端口,redis 的 6379 端口、mysql 的3306 端口都與 mac 系統(tǒng)的端口做了映射:
docker run -itd --name lnmp7.4 --privileged -p 6379:6379 -p 80:80 -p 3307:3306 -v /Users/xxx/Desktop/docker:/data haveyb/lnmp /usr/sbin/init

參數(shù)說明:
-p:指定 mac 和容器內(nèi)的端口映射,比如,-p 3307:3306,表示連接mac 的3307 端口,實(shí)際上就會(huì)請(qǐng)求到容器內(nèi)的3306端口
-v:指定目錄共享
--privileged:賦予特殊權(quán)限
/usr/sbin/init:可以使用 systemctl 等命令

3. 進(jìn)入容器
docker exec -it lnmp7.4 bash

4. 查看php版本
php -v
PHP 7.3.16 

二、php7.3升級(jí)為php7.4

lnmp已經(jīng)搭建好了,不過我項(xiàng)目要用的是php7.4,所以接下來是升級(jí),不需要升級(jí)的可以跳過這塊

編譯安裝libzip包(centos7自帶的是0.10版本,編譯環(huán)境需要0.10版本以上但不包含1.3和1.7版本的包)

yum remove libzip  libzip-devel -y
wget https://libzip.org/download/libzip-1.2.0.tar.gz
tar -zxvf libzip-1.2.0.tar.gz
cd libzip-1.2.0
./configure
make -j4 && make install
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"

先安裝需要的依賴包

yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses curl gdbm-devel db4-devel libXpm-devel libX11-devel gd-devel gmp-devel expat-devel xmlrpc-c xmlrpc-c-devel libicu-devel libmcrypt-devel libmemcached-devel libsqlite3x-devel oniguruma-devel
先備份
mv /usr/local/php /usr/local/php-7.3.16

下載新的版本https://www.php.net/distributions/php-7.4.33.tar.bz2,我放在共享目錄下
cp /data/php-7.4.33.tar.bz2 /usr/local/src/php-7.4.33.tar.bz2
cd /usr/local/src

解壓
tar -xjvf php-7.4.33.tar.bz2
cd php-7.4.33

停止php-fpm
systemctl stop php-fpm

編譯并且安裝,這個(gè)是簡(jiǎn)易版的,少了很多擴(kuò)展,先別急著安裝,請(qǐng)接著往下看
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm

編譯并且安裝,開啟相應(yīng)擴(kuò)展,需要的擴(kuò)展都裝上,后續(xù)不用追加,省心省力(強(qiáng)烈推薦這種)
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --enable-opcache --enable-inline-optimization --disable-debug --enable-shared -enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-mysqlnd-compression-support --with-zlib --enable-xml  --enable-bcmath --enable-sysvsem --enable-inline-optimization --with-curl  --enable-mbstring --enable-intl --enable-ftp --enable-gd --enable-gd-jis-conv --with-jpeg --with-freetype --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --with-zip --enable-soap --with-gettext --enable-fileinfo --with-pear  

PASS:
1)make編譯過程出現(xiàn)(在make之前還是先進(jìn)行這步操作吧,不然等make很長(zhǎng)一段時(shí)間再報(bào)錯(cuò),會(huì)很奔潰)
undefined reference to `libiconv' 錯(cuò)誤的解決方法
在執(zhí)行完 ./configure … 之后,修改下 Makefile,找到其中的EXTRA_LIBS,在最后面添加 -liconv,修改后如下:
EXTRA_LIBS = ......這是本來就有的一大段,需要保留.....  -liconv

2) 如果編譯出現(xiàn)
configure: error: Cannot find ldap.h
yum install openldap openldap-devel  -y

編譯好長(zhǎng)一段時(shí)間
make && make install

復(fù)制默認(rèn)配置文件,從備份的php-7.3.16里面復(fù)制就行
cp /usr/local/php-7.3.16/etc/php.ini  /usr/local/php/etc/php.ini
cp /usr/local/php-7.3.16/etc/php-fpm.conf  /usr/local/php/etc/php-fpm.conf
cp /usr/local/php-7.3.16/etc/php-fpm.d/www.conf.default  /usr/local/php/etc/php-fpm.d/www.conf

啟動(dòng)php-fpm
systemctl start php-fpm

查看版本
php -v
PHP 7.4.33

顯示加載yar.so、amqp.so擴(kuò)展失敗
vi /usr/local/php/etc/php.ini ,兩個(gè)擴(kuò)展用不上,extension前面加上分號(hào)注釋掉
;extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/yar.so
;extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/amqp.so

三、安裝php擴(kuò)展(安裝自己需要的擴(kuò)展即可)

我的擴(kuò)展都是本地下載好,放到共享目錄/Users/xxx/Desktop/docker里面,拷貝到/usr/local/src目錄進(jìn)行源碼編譯安裝的,源碼安裝一般步驟都是phpize、./configure、make、make install,編譯安裝php7.4的時(shí)候,最好帶上自己需要的擴(kuò)展,就沒后續(xù)這么多麻煩事了,如果后續(xù)發(fā)現(xiàn)少了什么擴(kuò)展的話,也可以補(bǔ)充上去

3.1安裝swoole擴(kuò)展

cp -r /data/swoole-4.8.12 /usr/local/src
cd /usr/local/src/swoole-4.8.12
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

vi /usr/local/php/etc/php.ini 
加上擴(kuò)展
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/swoole.so

查看安裝成功的擴(kuò)展
php -m | grep swoole
返回
swoole

3.2 安裝swoole-loader擴(kuò)展

cp /data/slyp_shop/install/swoole-loader/swoole_loader74.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/swoole_loader74.so

vi /usr/local/php/etc/php.ini 
加上擴(kuò)展
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/swoole_loader74.so

查看安裝成功的擴(kuò)展
php -m | grep swoole
返回
swoole
swoole_loader

3.3 安裝redis擴(kuò)展

cp /data/redis-5.3.7.tgz /usr/local/src/redis-5.3.7.tgz
cd /usr/local/src
tar zxvf redis-5.3.7.tgz
cd redis-5.3.7
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
vi /usr/local/php/etc/php.ini 
加上:
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/redis.so
php -m | grep redis
返回:redis

最后,重啟一下php

systemctl restart php-fpm

四、配置虛擬域名

編輯mac的hosts文件
sudo vim /etc/hosts
127.0.0.1 dev_docker.test.com

回到容器內(nèi),切換到nginx配置目錄(conf.d 目錄下有配置例子,可以復(fù)制修改)
cd /usr/local/nginx/conf.d 

vi dev_docker.test.com.conf

server {
    listen       80;
    server_name  dev_docker.test.com;

    client_max_body_size 128M;

    charset utf-8;
    error_log    /usr/local/nginx/logs/error/dev_docker.test.com.log error;
    access_log  /usr/local/nginx/logs/access/dev_docker.test.com.log main;

    root   /data/test;
    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;
    }

}

cd /data
mkdir test
vi index.php
加入:
<?php
phpinfo();

重啟nginx
systemctl restart nginx

瀏覽器訪問:
http://dev_docker.test.com/index.php
![image.png](https://upload-images.jianshu.io/upload_images/1638771-6117d29148c1bd5f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

五、跑crmeb項(xiàng)目(本人項(xiàng)目需要,可以跳過)

到這里已經(jīng)基本完成了,因?yàn)槲业捻?xiàng)目是crmeb二開,需要往下繼續(xù)操作,我配置的項(xiàng)目域名是dev_docker.slyp_shop.com,在mac系統(tǒng)hosts配置域名,同上面第四點(diǎn),這里不贅述

crmeb需要配置反向代理,這里貼一下代碼

cd /usr/local/nginx/conf.d 
vi dev_docker.slyp_shop.com.conf

server {
  listen       80;
  server_name  dev_docker.slyp_shop.com;
  client_max_body_size 128M;
  charset utf-8;
  error_log    /usr/local/nginx/logs/error/dev_docker.slyp_shop.com.log error;
  access_log  /usr/local/nginx/logs/access/dev_docker.slyp_shop.com.log main;
  root   /data/slyp_shop;
  index  index.html index.htm index.php;

  location ^~ / {
      proxy_pass http://127.0.0.1:8326;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header Upgrade $http_upgrade;
      # proxy_set_header Connection $connection_upgrade;
      proxy_http_version 1.1;
      # proxy_hide_header Upgrade;

      add_header X-Cache $upstream_cache_status;
      #Set Nginx Cache

      set $static_filebUUocfuv 0;
      if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
      {
          set $static_filebUUocfuv 1;
          expires 1m;
      }
      if ( $static_filebUUocfuv = 0 )
      {
          add_header Cache-Control no-cache;
      }
  }
}

重啟nginx
systemctl restart nginx

啟動(dòng)項(xiàng)目

systemctl start redis
cd /data/slyp_shop
php think swoole start
image.png

瀏覽器訪問:
http://dev_docker.slyp_shop.com/

image.png

開啟proc_open
vi /usr/local/php/etc/php.ini 
在php.ini中,找到disable_functions選項(xiàng),看看是否有proc_open函數(shù)被禁用了,如果有的話,去掉即可
systemctl restart php-fpm

mysql設(shè)置sql_mode
vi /etc/my.cnf
[mysqld]
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
systemctl restart mysql
image.png

到這里就搭建成功了!

六、一些說明

php管理
systemctl start/stop/restart/reload php-fpm
配置文件:/usr/local/php/etc/php.ini

nginx管理
systemctl start/stop/restart/reload nginx
站點(diǎn)配置文件:/usr/local/nginx/conf.d

mysql管理
systemctl status/start/stop/restart/reload mysql

配置文件: /etc/my.cnf
初始密碼:123456

redis管理
systemctl start/stop/restart/reload redis
配置文件:/etc/redis.conf
密碼:haveyb

navicat連接mysql,上面配置的端口是3307,注意端口別搞錯(cuò)


image.png

點(diǎn)擊測(cè)試連接返回:is not allowed to connect to this mysql server

出現(xiàn)這種原因是mysql設(shè)置了不允許遠(yuǎn)程連接,進(jìn)入容器

docker exec -it lnmp7.4 bash
mysql -u root -p 密碼(默認(rèn)123456)
use mysql;
select host from user where user='root';
update user set host = '%' where user ='root';
flush privileges;
exit; 退出mysql
image.png


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容