docker 搭建多容器LNMP平台遇到的坑
1. 采用什么样的镜像很重要。必须是php:7.3-fpm,采用默认的latest镜像是不行的,所以
$ docker pull php:7.3-fpm
$ docker pull nginx
$ docker pull mariadb
2. 搭建独立的lnmp网络环境
$ docker network create --driver bridge --subnet 172.168.1.0/24 --gateway 172.168.1.1 lnmp-net #网络名称为lnmp-net
3.建立lnmp的根目录,并创建应有的目录体系
$ mkdir /lnmp
其他的目录结构:
/lnmp/data/mariadb #用于存储mariadb数据库的数据
/lnmp/php #用于存放php的配置文档
/lnmp/nginx/html #用于存放网页源码,phpMyAdmin,wordpress 等
/lnmp/conf.d #用于存放nginx的配置文档,也就是 default.conf
4.构建各个容器
构建mariadb数据库容器:
$ docker run -itd --name mysql -h mysql -p 3306:3306 --network=lnmp-net --ip 172.168.1.201 -v /lnmp/data/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456789 mariadb
构建php-fpm容器:
$ docker run -itd --name myphp -h myphp -p 9000:9000 --network=lnmp-net --ip 172.168.1.202 -v /lnmp/nginx/html:/usr/share/nginx/html --privileged=true php:7.3-fpm
构建nginx:
$ docker run -itd --name mynginx -h mynginx -p 80:80 --network=lnmp-net --ip 172.168.1.203 -v /lnmp/nginx/html:/usr/share/nginx/html -v /lnmp/conf.d:/etc/nginx/conf.d --link myphp nginx
5. 对nginx配置文件进行编辑,主要是将default.conf 中的下列段落进行替换:
location / {
root /usr/share/nginx/html;
index index.html index.php index.htm; #较默认内容增加了 index.php
}
location ~ \.php$ {
# root html;
fastcgi_pass 172.168.1.202:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; #这一行也比较关键
include fastcgi_params;
}
6.在/lnmp/nginx/html中新建info.php,并增加内容
$ vi info.php
内容: <?php phpinfo();?>
7.重启相关容器
$ docker restart myphp mynginx
8.用浏览器查看nginx欢迎页和php信息:
http://host-ip/index.html
http://host-ip/info.php
9. 下载并解压phpMyAdmin到 /lnmp/nginx/html中,通过浏览器进入
http://host-ip/phpMyAdmin/
出现错误:
很明显,要在myphp容器中添加mysqli扩展
10.为php容器添加扩展组件
$ docker exec -it myphp /bin/bash #进入myphp容器
$ cd /usr/local/bin #进入安装命令和组件所在目录
$ ./docker-php-ext-install pdo_mysql #安装扩展pdo_mysql
$ ./docker-php-ext-install mysql #安装扩展 mysqli
$ exit #退出myphp容器
$ docker myphp restart #重启容器,使扩展组件生效
11.再次尝试 http://host-ip/phpMyAdmin/
然后发现还是无法进入,出现 “ mysqli_real_connect(): (HY000/2002): No such file or directory ”的 错误提示,还是需要修改
具体方法为:
将phpmyadmin\libraries\config.default.php,修改条目为: $cfg['Servers'][$i]['host']='172.168.1.201';
将phpmyadmin\config.sample.inc.php重命名为config.inc.php,修改条目为: $cfg['Servers'][$i]['host'] = '172.168.1.201';
然后重新登录。
这里我们在构建mariadb数据库时,指定了root账户的密码为 123456789
登录成功后界面右侧会显示下图信息
好了,至此我们用3个独立的docker 容器组成了LNMP开发环境。
其他
A。从容器内复制文件和把外部编辑好的文件复制进容器
1. 从容器复制到host
$ docker cp myphp:/usr/local/etc/php/php.ini-production /home/lnmp/php/php.ini
2.从host复制到容器
$ docker cp /home/lnmp/php/php.ini myphp:/usr/local/etc/php/php.ini
从php7开始,php.ini 没有直接给出,而是给了 php.ini-production php.ini-development 这两个预置文件,将其cp一份命名为php.ini 即可。
B。对配置内容进行部分更新,也就是upload
新建并编辑 uploads.ini文件,内容为
file_uploads = On
memory_limit = 128M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600
用上面的复制命令,将其添加到myphp 容器的 /usr/local/etc/php/conf.d/ 目录下
$ docker cp /home/lnmp/php/uploads.ini myphp:/usr/local/etc/php/conf.d/
重启 myphp容器
$ docker restart myphp