1、首先拉取php和nginx镜像
docker pull php:5.6-fpm
docker pull nginx
docker images
2、创建PHP、Nginx、Mysql容器
# 在本次实现中,需要创建一个php.ini文件,它在容器的/usr/local/etc/php目录下,由于需要# 挂载文件到容器中,因此,宿主机目录中需要创建一个/etc/php.ini文件
# 第一个挂载目录是稍后宿主机代码放的位置
# 第二个挂载就是php的配置文件,可以先创建一个空的文件
docker run -d -p 9000:9000 -v /webroot:/webroot -v /etc/php.ini:/usr/local/etc/php/php.ini --name php php:5.6-fpm
#启动PHP容器
docker start php
#将容器中的配置文件拷贝到本地
docker php:/usr/local/etc/php/php.ini-development /etc/php.ini
#########################################################################
接下来,该创建Nginx容器了,该容器需要依赖PHP,所以要用到 --link 参数
docker run --name nginx -p 8888:80 -d -v /webroot:/webroot -v /etc/nginx/conf.d:/etc/nginx/conf.d --link php:php nginx
docker start nginx
#关于Nginx的配置挂载稍后再进行细化。、
#########################################################################
docker pull mysql:8.0.28
docker run -d -p 3306:3306 -v /var/log/mysql:/var/log -v /var/lib/mysql:/var/lib/mysql -v /etc/my.cnf:/etc/my.cnf --name mysql -e MYSQL_ROOT_PASSWORD=root mysql:8.0.28
docker start mysql
docker exec -it mysql /bin/bash
#创建远程链接用户密码
create user 'tester'@'%' identified by 'root'
grant all privileges on *.* to 'tester'@'%';
#修改链接用户的密码
alter user 'tester'@'%' identified by 'root123' password expire never;
#允许Navicat低版本链接,因为加密方式不同,不设定无法连接。
ALTER USER 'tester'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
3、当容器都启动后,发现运行并不顺畅,访问会出现502 Bad Way,根据错误信息应该是转到cgi出问题了,经过一番摸索,发现nginx监听的是127.0.0.1:9000,并没有成功转发到PHP容器。
那么我们不如查看下容器各自的IP,看看有没有什么猫腻呢?
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
经过上面指令,发现各个容器之间形成了一个小型局域网,所以我想应该是把nginx配置文件中,cgi监听部分的127.0.0.1:9000更换成 PHP容器局域网IP:9000。
换上后,重启Nginx容器,访问正常。
4、因为项目中需要安装一些其他的PHP扩展,所以演示一遍
docker exec -it php /bin/bash
wget xxxxx //扩展链接
phpize
./configure
make
make install
然后将生成的 xxx.so文件拷贝到php.ini中配置的extension_dir目录下,重启容器。