docker 搭建LNMP环境

一、安装docker并拉取相关镜像

docker pull mysql:latest nginx:latest php:7.3-fpm-alpine

二、在宿主机建立docker-compose目录树

[root@Centos8 lnmp]# tree
.
├── docker-compose.yml
└── nginx
    ├── conf
    │   └── php.conf
    ├── logs
    └── www
        ├── index.php
[root@Centos8 lnmp]# cat docker-compose.yml 
version: "2.1"
services:
    nginx:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ~/lnmp/nginx/www:/usr/share/nginx/html
            - ~/lnmp/nginx/conf:/etc/nginx/conf.d
            - ~/lnmp/nginx/logs:/var/log/nginx
        networks:
            - lnmp-network
    php:
        image: php:7.3-fpm-alpine
        volumes:
            - ~/lnmp/nginx/www:/www
        networks:
            - lnmp-network
    mysql:
        image: mysql:latest
        ports:
            - "3306:3306"
        environment:
            - MYSQL_ROOT_PASSWORD=123456
        networks:
            - lnmp-network
networks: 
    lnmp-network:
[root@Centos8 lnmp]# cat nginx/conf/php.conf 
server {
	listen	80;
	server_name	localhost;

	location / {
		root	/usr/share/nginx/html;
		index	index.html index.htm index.php;
	}

	error_page	500 502 503 504	/50x.html;
	location = /50x.html {
		root	/usr/share/nginx/html;
	}

	location ~ \.php$ {
		fastcgi_pass	php:9000;
		fastcgi_index	index.php;
		fastcgi_param	SCRIPT_FILENAME	/www/$fastcgi_script_name;
		include		fastcgi_params;
	}
}
[root@Centos8 lnmp]# cat nginx/www/index.php 
<?php
 phpinfo();
?>

三、用docker-compose创建容器

[root@Centos8 lnmp]# docker-compose up -d
Creating lnmp_nginx_1 ... done
Creating lnmp_mysql_1 ... done
Creating lnmp_php_1   ... done
[root@Centos8 lnmp]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                               NAMES
e27e41534f81        mysql:latest         "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   lnmp_mysql_1
162e88ac3538        php:7.3-fpm-alpine   "docker-php-entrypoi…"   2 minutes ago       Up 2 minutes        9000/tcp                            lnmp_php_1
cbad0ffd255b        nginx:latest         "/docker-entrypoint.…"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp                  lnmp_nginx_1

此时输入宿主机ip即可得到phpinfo
四、php开启mysqli扩展

[root@Centos8 lnmp]# docker exec -it lnmp_php_1 /bin/sh
/var/www/html # cd /usr/local/etc/php/
/usr/local/etc/php # ls
conf.d               php.ini-development  php.ini-production
/usr/local/etc/php # cp php.ini-development php.ini
/usr/local/etc/php # vi php.ini

去掉;extension=mysqli前的分号

/usr/local/bin/docker-php-ext-install -j5 gd mbstring mysqli pdo pdo_mysql shmop
//可以只需 #docker-php-ext-install mysqli

其中,
gdphp处理图形的扩展库,提供了一系列用来处理图片的API。
mbstring多字节字符串。以前处理字符都是通过 substr strlen,但是现在要求精确多国语言并存就意味着多字节,PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是1~3倍的差异了。 采用PHP字符串mbstring可以较好地解决这个问题。
mysqli和PDO由于MySQLi只支持MySQL数据库,如果有跨数据库平台的需要,那么就需要使用PDO了。PDO提供了一个抽象层来操作数据库,支持目前大部分的数据库,总体上说,它比MySQLi移植性更好,更强劲,更面向对象。PDO是官方大力推荐的,相信越来越多的人会使用它。
shmop在项目开发中,想要实现PHP多个进程之间共享数据的功能,让客户端连接能够共享一个状态,需要开启共享内存函数shmop。

退出容器并重启

/usr/local/bin # exit
[root@Centos8 lnmp]# docker restart lnmp_php_1

五、建立conn.php测试连接mysql

[root@Centos8 lnmp]# cat nginx/www/conn.php
<?php
$servername = "172.22.0.4";
$username = "root";
$password = "123456";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
if (!$conn){
	die("连接失败".mysqli_connect_error());
}
echo "连接成功";
mysqli_close($conn);
?>

其中,servername由下方命令获得

[root@Centos8 lnmp]#  docker inspect lnmp_mysql_1 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.22.0.4",

六、解决连接数据库错误
问题1:Warning: mysqli_connect(): (HY000/2054): The server requested authentication method unknown to the client in /www/conn.php on line 6
连接失败The server requested authentication method unknown to the client
解决方法:

[root@Centos8 lnmp]# docker exec -it lnmp_mysql_1 bash
root@e27e41534f81:/# cat >> /etc/mysql/my.cnf << EOF
> default_authentication_plugin = mysql_native_password
> EOF
root@e27e41534f81:/# mysql -uroot -p
Enter password:              //密码为123456
mysql> ALTER USER 'root'@'%'
    ->   IDENTIFIED WITH mysql_native_password
    ->   BY '123456';
Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
mysql> quit
Bye

退出并重启容器

root@e27e41534f81:/# exit
exit
[root@Centos8 lnmp]# docker restart lnmp_mysql_1
lnmp_mysql_1

问题2:Server sent charset (255) unknown to the client. Please, report to the developers.
解决办法
进入容器 ,修改/etc/mysql/my.cnf
追加各模块内容如下:

[client]
default-character-set=utf8
 
[mysql]
default-character-set=utf8
 
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值