项目设计

存储资源

  • 将程序的源代码放在/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容器需要进行磁盘映射,将容器的配置文件以及网站的根目录映射到本地的文件夹中
image.png

创建对应的文件夹

  1. mkdir -p /app/config/nginx
  2. mkdir -p /app/data/html

在映射覆盖容器文件夹之前,要确认容器的原文件夹中是否有配置文件,不然可能会导致无法启动容器

  1. docker run --rm nginx ls /etc/nginx/conf.d
  2. ----------------------
  3. default.conf
  4. #运行了一个运行完即自动删除的容器,用来查看容器需要映射的文件夹中是否有配置文件,发现有一个默认的配置文件

因此需要将容器文件夹里的原本配置文件复制到本地的文件夹中,这样原本的默认配置文件就不会被覆盖掉

  1. #将原本的配置文件复制到映射的文件夹中,data是一个临时文件夹,先把配置文件复制到容器的data文件夹,然后再把data文件夹的内容映射到本地文件夹,而这个容器也是临时的,复制完后会马上停止运行
  2. docker run --rm -v /app/config/nginx:/data nginx cp /etc/nginx/conf.d/default.conf /data
  3. #此时再次查看/app/config/nginx可以看到文件夹下有一个default.conf默认配置文件

启动Nginx容器

  1. docker run -d -p 8080:80 \
  2. -v /app/data/html:/web \
  3. -v /app/config/nginx:/etc/nginx/conf.d \
  4. --name="webserver1" \
  5. --restart=always nginx

此时输入网址就可以看到Nginx的页面

image.png

PHP容器

选择php:7.3-fpm镜像,并且运行

  1. docker run -d --name="php" \
  2. -v /app/data/html:/var/www/html \
  3. --restart=always php:7.3-fpm

PHP探针

要让Nginx能够连接到PHP容器,就需要更改Nginx容器的启动命令

  1. #删除Nginx容器
  2. docker rm -f webserver
  3. #启动新的Nginx容器
  4. docker run -d -p 80:80 \
  5. -v /app/data/html:/web \
  6. -v /app/config/nginx:/etc/nginx/conf.d \
  7. --name="webserver" \
  8. --link php:php \
  9. --restart=always nginx
  10. #可以进入nginx容器内部查看
  11. docker exec -it webserver cat /etc/hosts
  • 连接PHP容器前的hosts文件

image.png

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

image.png

  • 创建php探针,映射过后相当于此index.php在/var/www/html/php
  1. vim /app/data/html/php/index.php
  2. -------------------------
  3. <?php
  4. phpinfo();
  5. ?>
  • 创建Nginx配置文件,在其中连接上php容器
  • 需要注意的是**root /var/www/html/php**因为映射过后index.php文件在php容器的/var/www/html/php
    • 另外还有一种配置写法,就是只需要在$fastcgi_script_name前面加上/var/www/html/php/就可以
  1. vim /app/config/nginx/php.conf
  2. ----------------------
  3. server {
  4. listen 80;
  5. server_name php.iproute.cn;
  6. root /web/php;
  7. location / {
  8. index index.php index.html;
  9. }
  10. location ~ \.php$ {
  11. root /var/www/html/php;
  12. fastcgi_pass php:9000;
  13. fastcgi_index index.php;
  14. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  15. fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  16. include fastcgi_params;
  17. }
  18. }
  19. # 检查配置,重启nginx容器
  20. docker exec webserver nginx -t
  21. docker restart webserver

打开浏览器进行访问

image.png

Mysql容器

  1. #首先创建用于存放mysql数据的文件夹
  2. mkdir /app/data/mysql
  3. #运行mysql容器
  4. docker run --name mysql \
  5. -v /app/data/mysql:/var/lib/mysql \
  6. -e MYSQL_ROOT_PASSWORD=123456 -d \
  7. --name="db" --restart="always" mysql:5.6

将php容器与mysql容器进行连接,因此需要重新创建php容器

  1. docker stop php
  2. docker rm php
  3. docker run -d --name="php" \
  4. -v /app/data/html:/var/www/html \
  5. --link db:db \
  6. --restart=always php:7.3-fpm

测试Mysql数据库

  1. vim /app/data/html/php/mysql.php
  2. --------------------------------------
  3. <?php
  4. $servername = "db";
  5. $username = "root";
  6. $password = "123456";
  7. // 创建连接
  8. $conn = mysqli_connect($servername, $username, $password);
  9. // 检测连接
  10. if (!$conn) {
  11. die("Connection failed: " . mysqli_connect_error());
  12. }
  13. echo "连接MySQL...成功!";
  14. ?>

进入网页后会发现连接不上,因为php容器默认下不支持mysql的连接功能

image.png

此时就可以使用Dockerfile,对php的初始镜像进行定制

  1. vim Dockerfile
  2. -------------------------
  3. FROM php:7.3-fpm
  4. RUN docker-php-ext-install mysqli
  5. RUN docker-php-ext-enable mysqli
  6. RUN docker-php-ext-install pdo pdo_mysql
  7. EXPOSE 9000

定制完成后保存并退出,开始构建镜像

  1. docker build -t myphp:7.3-fpm .

重新创建php容器,将本来的镜像换成修改后的myphp:7.3-fpm

  1. docker run -d --name="php" \
  2. -v /app/data/html:/var/www/html \
  3. --link db:db \
  4. --restart=always myphp:7.3-fpm

重新在浏览器中测试,可以发现成功

image.png

用Docker搭建phpMyAdmin

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

image.png

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

image.png

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

image.png

用Docker搭建网盘

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

image.png