项目设计
存储资源
- 将程序的源代码放在/app/data下
- 将Nginx配置文件放在/app/config下
端口号
- Nginx的80端口对外暴露
- php-fpm的9000端口不暴露,但是能被Nginx访问
- mysql的3306端口不暴露,但是能被php-fpm访问
容器名称
容器之间需要互通才能完成LNMP的架构,而容器之间也主要是通过容器的名称进行互相访问,所以要将容器进行简明易懂的命名
- Nginx容器命名为webserver
- php-fpm容器命名为php
- mysql容器命名为db
容器创建
Nginx容器
对Nginx容器需要进行磁盘映射,将容器的配置文件以及网站的根目录映射到本地的文件夹中
创建对应的文件夹
mkdir -p /app/config/nginxmkdir -p /app/data/html
在映射覆盖容器文件夹之前,要确认容器的原文件夹中是否有配置文件,不然可能会导致无法启动容器
docker run --rm nginx ls /etc/nginx/conf.d----------------------default.conf#运行了一个运行完即自动删除的容器,用来查看容器需要映射的文件夹中是否有配置文件,发现有一个默认的配置文件
因此需要将容器文件夹里的原本配置文件复制到本地的文件夹中,这样原本的默认配置文件就不会被覆盖掉
#将原本的配置文件复制到映射的文件夹中,data是一个临时文件夹,先把配置文件复制到容器的data文件夹,然后再把data文件夹的内容映射到本地文件夹,而这个容器也是临时的,复制完后会马上停止运行docker run --rm -v /app/config/nginx:/data nginx cp /etc/nginx/conf.d/default.conf /data#此时再次查看/app/config/nginx可以看到文件夹下有一个default.conf默认配置文件
启动Nginx容器
docker run -d -p 8080:80 \-v /app/data/html:/web \-v /app/config/nginx:/etc/nginx/conf.d \--name="webserver1" \--restart=always nginx
此时输入网址就可以看到Nginx的页面

PHP容器
选择php:7.3-fpm镜像,并且运行
docker run -d --name="php" \-v /app/data/html:/var/www/html \--restart=always php:7.3-fpm
PHP探针
要让Nginx能够连接到PHP容器,就需要更改Nginx容器的启动命令
#删除Nginx容器docker rm -f webserver#启动新的Nginx容器docker run -d -p 80:80 \-v /app/data/html:/web \-v /app/config/nginx:/etc/nginx/conf.d \--name="webserver" \--link php:php \--restart=always nginx#可以进入nginx容器内部查看docker exec -it webserver cat /etc/hosts
- 连接PHP容器前的hosts文件

- 连接PHP容器后的hosts文件,可以看到往hosts文件中写入了php的ip地址和ID,因此他们可以互相连接(Nginx的ID和上图不一样是因为重新建了容器)

- 创建php探针,映射过后相当于此index.php在
/var/www/html/php下
vim /app/data/html/php/index.php-------------------------<?phpphpinfo();?>
- 创建Nginx配置文件,在其中连接上php容器
- 需要注意的是
**root /var/www/html/php**因为映射过后index.php文件在php容器的/var/www/html/php下- 另外还有一种配置写法,就是只需要在$fastcgi_script_name前面加上/var/www/html/php/就可以
vim /app/config/nginx/php.conf----------------------server {listen 80;server_name php.iproute.cn;root /web/php;location / {index index.php index.html;}location ~ \.php$ {root /var/www/html/php;fastcgi_pass php:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param SCRIPT_NAME $fastcgi_script_name;include fastcgi_params;}}# 检查配置,重启nginx容器docker exec webserver nginx -tdocker restart webserver
打开浏览器进行访问

Mysql容器
#首先创建用于存放mysql数据的文件夹mkdir /app/data/mysql#运行mysql容器docker run --name mysql \-v /app/data/mysql:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=123456 -d \--name="db" --restart="always" mysql:5.6
将php容器与mysql容器进行连接,因此需要重新创建php容器
docker stop phpdocker rm phpdocker run -d --name="php" \-v /app/data/html:/var/www/html \--link db:db \--restart=always php:7.3-fpm
测试Mysql数据库
vim /app/data/html/php/mysql.php--------------------------------------<?php$servername = "db";$username = "root";$password = "123456";// 创建连接$conn = mysqli_connect($servername, $username, $password);// 检测连接if (!$conn) {die("Connection failed: " . mysqli_connect_error());}echo "连接MySQL...成功!";?>
进入网页后会发现连接不上,因为php容器默认下不支持mysql的连接功能

此时就可以使用Dockerfile,对php的初始镜像进行定制
vim Dockerfile-------------------------FROM php:7.3-fpmRUN docker-php-ext-install mysqliRUN docker-php-ext-enable mysqliRUN docker-php-ext-install pdo pdo_mysqlEXPOSE 9000
定制完成后保存并退出,开始构建镜像
docker build -t myphp:7.3-fpm .
重新创建php容器,将本来的镜像换成修改后的myphp:7.3-fpm
docker run -d --name="php" \-v /app/data/html:/var/www/html \--link db:db \--restart=always myphp:7.3-fpm
重新在浏览器中测试,可以发现成功

用Docker搭建phpMyAdmin
- 将phpMyAdmin存放在
/app/data/html/phpmyadmin下 - 将虚拟主机配置文件mysql.conf存放在
/app/config/nginx下
#下载并解压phpmyadmin源码,并为文件夹重命名cd /app/data/htmlwget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.zipunzip phpMyAdmin-5.1.1-all-languages.zipmv phpMyAdmin-5.1.1-all-languages phpmyadmin
#配置虚拟主机的配置文件vim /app/config/nginx/mysql.conf-----------------------------------------server {listen 80;server_name mysql.iproute.cn;root /web/phpmyadmin;location / {index index.php index.html;}location ~ \.php$ {root /var/www/html/phpmyadmin;fastcgi_pass php:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param SCRIPT_NAME $fastcgi_script_name;include fastcgi_params;}}-----------------------------------------docker restart webserver
- 由于容器在之前已经创建好了,因此就可以不需要再次重新创建容器,如果没有创建,那么容器的顺序是先创建mysql然后php最后nginx。
- 最后还需要在php的配置文件里更改配置,使得phpmyadmin能连接上db,而不是连接自己,将此处改为db,这样就可以让phpmyadmin连接上db
vim /app/data/html/phpmyadmin/libraries/config.default.php

- 更改Windows的hosts文件,添加一条记录
192.168.31.88 mysql.iproute.cn - 然后访问浏览器,输入用户名和密码就可以成功进入

- 可以看到服务器这边是db via TCP/IP,之前没有使用容器搭建LNMP的时候这里显示的是localhost via UNIX socket

用Docker搭建网盘
- 将网盘存放在
/app/data/html/kod下 - 将虚拟主机配置文件kod.conf存放在
/app/config/nginx下
#下载并解压mkdir /app/data/html/kodcd /app/data/html/kodwget https://static.kodcloud.com/update/download/kodbox.1.23.zipunzip kodbox.1.23.zip
#配置虚拟主机的配置文件vim /app/config/nginx/kod.conf----------------------------------server {listen 80;server_name pan.iproute.cn;root /web/kod;index index.php index.html;location ~ \.php$ {root /var/www/html/kod;fastcgi_pass php:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param SCRIPT_NAME $fastcgi_script_name;include fastcgi_params;}}----------------------------------docker restart webserver
- 由于容器在之前已经创建好了,因此就可以不需要再次重新创建容器,如果没有创建,那么容器的顺序是先创建mysql然后php最后nginx。
- 在phpmyadmin中新建一个数据库kod,浏览器中进入
pan.iproute.cn然后对其进行之前的配置,就可以完成网盘的创建了,如下图所示:

