在Mac系统上使用Dokcer搭建LNMP环境

每次换电脑或者重装系统之后,开发环境的搭建很费事,整不好还遇到一些乱起八糟的大坑,所以最好是直接使用dokcer,换环境的时候,镜像拉起就OK了

Posted by 石福鹏 on 2020-12-01

最开始准备自己头搭建一套,即直接在Mac上分别安装NginxMysqlPHP,对于新手来说,刚毕业的同学来说,一定自己一步一步搭,刚开始会趟好多的坑,这些坑你一定要趟,这样也就知道了一些服务运行的原理,在服务架构上处于什么位置,发挥什么作用,都是通过一次一次的实践去理解的。

但是我这里就不这样玩了,因为我就是为了省时间,并且也不再Docker上一个一个的搭建,有现成的轮子,拿过来,修改一下,快速上手

DockerHub上搜索lnmp 找一个下载量最高的

image-20201201144908941

按照提供的实用教程操作即可:

拉镜像:
1
docker pull 2233466866/lnmp
启动(Start)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 端口映射自行指定,容器名称自行指定为lnmp
docker run -dit --privileged=true --name=lnmp 2233466866/lnmp

# 高级用法(Advanced usage)
docker run -dit \
-p 80:80 \
-p 443:443 \
-p 3306:3306 \
-p 9000:9000 \
-v /xxx/www:/www \
-v /xxx/mysql:/data/mysql \
--privileged=true \
--name=lnmp \
2233466866/lnmp

这是他的说明,将挂载的目录该称适合自己的

1
2
3
4
5
6
7
8
9
10
 ✔  docker run -dit \                                                                                                                                                                ✔  376  14:20:13
-p 80:80 \
-p 443:443 \
-p 3306:3306 \
-p 9000:9000 \
-v /Users/steven/SvnGitRepository:/www \
--privileged=true \
--name=lnmp \
2233466866/lnmp
e1bc93894c4c773cba0d3e9d2722a382c4a169f4e9244b0e04e6791b767bf6b0
连接容器(进入容器)
1
2
# 容器名称与上一步保持一致
docker exec -it lnmp /bin/bash
查看各个服务的状态
1
2
3
4
5
6
7
ps aux|grep nginx
ps aux|grep mysql
ps aux|grep php-fpm
# 或者(Or)
systemctl status nginx
systemctl status mysqld
systemctl status php7
配置
1
2
3
4
5
6
7
8
9
#配置文件路径(Config file path)
# Nginx
/usr/local/nginx/conf/nginx.conf
# MySQL
/etc/my.cnf
# PHP
/usr/local/php7/lib/php.ini
/usr/local/php7/etc/php-fpm.conf
/usr/local/php7/etc/php-fpm.d/www.conf
扩展
1
2
3
4
5
# 默认已安装部分扩展在目录:/usr/local/php7/lib/php/extensions/no-debug-non-zts-20170718/
# 如果要启用指定扩展,则需要修改php.ini,加上
extension=xxx.so
# xxx为PHP扩展的文件名,然后重启php
systemctl restart php7

以下开始个人配置:

数据库相关配置

获取初始密码

1
2
3
cat /var/log/mysqld.log|grep 'A temporary password'
#
password=`cat /var/log/mysqld.log|grep 'A temporary password'`;password=${password:91};echo $password

修改密码(初始化):

1
mysql_secure_installation

然后按照提示,直至完成。在Mac上使用Navicat链接数据库试试,HOST是localhost吗?当然不是。肯定是docker的IP地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 获取docker主机 IP

✔  ifconfig | grep inet  ✔  358  14:28:09
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet6 fe80::aede:48ff:fe00:1122%en5 prefixlen 64 scopeid 0x4
inet6 fe80::188d:c9de:126c:595a%en0 prefixlen 64 secured scopeid 0x6
inet 10.11.12.35 netmask 0xffffff00 broadcast 10.11.12.255
inet6 fe80::3cfa:38ff:fe96:3fe7%awdl0 prefixlen 64 scopeid 0x8
inet6 fe80::3cfa:38ff:fe96:3fe7%llw0 prefixlen 64 scopeid 0x9
inet6 fe80::980:9b54:5dec:e8f3%utun0 prefixlen 64 scopeid 0xf
inet6 fe80::39fa:af2c:bb2e:db48%utun1 prefixlen 64 scopeid 0x10
inet6 fe80::8d30:6889:2ad0:5c8b%utun2 prefixlen 64 scopeid 0x11
inet6 fe80::73ae:334a:cb19:ff8%utun3 prefixlen 64 scopeid 0x12
inet6 fe80::9e58:8b67:c963:baae%utun4 prefixlen 64 scopeid 0x14
inet6 fe80::c7ab:25a1:4897:d9ab%utun5 prefixlen 64 scopeid 0x15

inet后面的IP即Docker主机的IP,,尝试连接后,提示:1130 - Host 'gateway' is not allowed to connect to this MySQL server

晓得了,用户HOST的权限问题

1、进入Docker docker exec -it lnmp /bin/bash

2、连接数据库: mysql -u root -p

3、看当前所有数据库:show databases;

4、进入mysql数据库:use mysql;

5、查看mysql数据库中所有的表:show tables;

6、update user set Host=’%’ where User=‘root’;

7、flush privileges;

再次尝试连接,成功了

PHP相关配置
  1. php -v 查看当前php版本

    1
    2
    3
    4
    [root@e1bc93894c4c lib]# php -v
    PHP 7.3.24 (cli) (built: Nov 13 2020 08:05:44) ( NTS )
    Copyright (c) 1997-2018 The PHP Group
    Zend Engine v3.3.24, Copyright (c) 1998-2018 Zend Technologies

    因为项目的原因,所以只能使用php5.6的版本,而作者默认配置的是7.3,所以果断降级

  2. 查看php的路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [root@e1bc93894c4c lib]# find /  -name php
    /usr/local/php7/lib/php
    /usr/local/php7/bin/php
    /usr/local/php7/php
    /usr/local/php7/php/php
    /usr/local/php7/include/php
    /usr/local/php5/lib/php
    /usr/local/php5/bin/php
    /usr/local/php5/php
    /usr/local/php5/php/php
    /usr/local/php5/include/php

    好像是有php5的,那方便了,直接切换一下版本就好了

  3. 切换到PHP5

    1
    /usr/local/php5/bin/php

    这个地址就是我们需要的,执行以下命令:

    1
    2
    3
    ln -s /usr/local/php5/bin/php /usr/sbin/php

    export PATH="$PATH:/usr/local/php5/bin/php"
    1
    2
    3
    4
    5
    6
    7
    [root@e1bc93894c4c lib]# export PATH="$PATH:/usr/local/php5/bin/php"
    [root@e1bc93894c4c lib]# service nginx restart
    Redirecting to /bin/systemctl restart nginx.service
    [root@e1bc93894c4c lib]# php -v
    PHP 5.6.40 (cli) (built: Nov 13 2020 08:21:17)
    Copyright (c) 1997-2016 The PHP Group
    Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

    service nginx restart,然后查看php的版本,发现已经切换过来了

查看phpinfo

发现没有xdebug,那就安装一下扩展

1
2
3
4
5
6
7
8
$ curl -O https://xdebug.org/files/xdebug-2.5.0.tgz
$ tar -zxf xdebug-2.5.0.tgz
$ cd xdebug-2.5.0
$ phpize
$ ./configure --with-php-config=--with-php-config=/usr/local/php5/bin/php-config # 这里为自己环境中的php-config
$ make
$ make install
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20131226/

然后在php.ini中配置

1
zend_extension=xdebug.so

重启nginx,检查是否安装成功

1
service nginx restart
1
2
[root@e1bc93894c4c no-debug-non-zts-20131226]# php -m | grep xdebug
xdebug
1
2
3
4
5
6
7
8
9
[Xdebug]
zend_extension ="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so"
xdebug.profiler_enable=on
;xdebug.trace_output_dir="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20131226/"
;xdebug.profiler_output_dir="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20131226/"
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_port=9010
xdebug.remote_host=10.11.12.35 # 宿主机的Ip

记得PHPstom的debug端口也要设置成9010

image-20201201180134563

至此,基本上该配置的都配置完了,因为我docker上的www目录挂在宿主机的/Users/steven/SvnGitRepository下,所以直接在该文件夹下创建一个index.html,随便写点东西,直接访问docker的主机IP,就可以看到展示刚才写的内容了