一、安装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
其中,
gd:php处理图形的扩展库,提供了一系列用来处理图片的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