使用docker搭建php-fmp+Apache+Mysql+phpmyadmin容器

使用Docker搭建php-fmp+Apache+Mysql+phpmyadmin容器

作者:通过搭建php容器、apache容器、mysql容器、phpmyadmin容器实现的,并不是集成方式。

一、前期配置

1.添加自定义网络,网络名为lamp-net,ip范围192.168.0.0/16,网关192.168.0.1,网络方式为桥接

[root@VM-12-8-centos www]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 lamp-net
aa4022c7333f3be69e1eb3e2833d80ec36ac766ca9928682ffa0a5955044fd43	# 添加成功

# 列出所有网络模式
[root@VM-12-8-centos www]# docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
7efe6f06a588   bridge     bridge    local
bf215cd643f3   host       host      local
aa4022c7333f   lamp-net   bridge    local		# 添加成功
a3f94345ead7   none       null      local

2.创建映射文件夹

# 创建映射目录
[root@VM-12-8-centos home]# mkdir -p /home/lamp/apache/conf/
[root@VM-12-8-centos home]# mkdir -p /home/lamp/www/
[root@VM-12-8-centos home]# mkdir -p /home/lamp/mysql8/logs
[root@VM-12-8-centos home]# mkdir -p /home/lamp/mysql8/conf
[root@VM-12-8-centos home]# mkdir -p /home/lamp/mysql8/mysql-files
二、配置php-fmp容器

1.使用php:7.2.2-fpm-alpine版本的镜像,获取该镜像

[root@VM-12-8-centos www]# docker pull php:7.2.2-fpm-alpine
7.2.2-fpm-alpine: Pulling from library/php
605ce1bd3f31: Pull complete 
2f5aa494661d: Pull complete 
7963c90c835a: Pull complete 
a3f2a1640434: Pull complete 
0fda071cd29f: Pull complete 
0bf857759796: Pull complete 
75199bdd3015: Pull complete 
bbecfe647603: Pull complete 
ca2ca14e9b19: Pull complete 
396930a52810: Pull complete 
Digest: sha256:43b82e2de06f7c0ec2f053bce76e474e8fc922a56d97d02234020880a458e7d1
Status: Downloaded newer image for php:7.2.2-fpm-alpine
docker.io/library/php:7.2.2-fpm-alpine	# 下载成功

2.启动php容器,将该容器分配到自定义网络lamp-net处

# 以后台方式启动容器,容器名为fpm
# 分配容器网络为lamp-net
# 进行文件夹映射,将主机文件夹/home/lamp/www映射到容器/var/www
# 分配ip为192.168.0.2,待会用得上
[root@VM-12-8-centos www]# docker run  -d --name fpm --net lamp-net --ip 192.168.0.2 -v /home/lamp/www:/var/www php:7.2.2-fpm-alpine
48e458fe07ceb42347c4cf4bb14087b29f2fb6844b8c0d118e82bdcbe0dc3405	#启动成功

3.查看php容器分配的IP地址,待会用得上

[root@VM-12-8-centos conf]# docker network inspect lamp-net
[
    {
        "Name": "lamp-net",
        "Id": "aa4022c7333f3be69e1eb3e2833d80ec36ac766ca9928682ffa0a5955044fd43",
        "Created": "2022-03-19T23:19:56.371719111+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "37a7131e689ae1a9ef91419cddc4aeb7b8e7a8689e6fed573bdcbf69d7373a2f": {
                "Name": "fpm",
                "EndpointID": "1aab292637d1f9a0b04894db5afbae75a2886ec8822fc3fb1b3ab27440e5f8eb",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",	# php-fpm分配的IP地址
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
三、配置Apache容器

1.以httpd:2.4.33-alpine 版本为例,下载Apache镜像

[root@VM-12-8-centos www]# docker pull httpd:2.4.33-alpine  
2.4.33-alpine: Pulling from library/httpd
911c6d0c7995: Pull complete 
fb560bf76af3: Pull complete 
b077eec28e12: Pull complete 
cbb10f3684e5: Pull complete 
28b16b995d79: Pull complete 
Digest: sha256:cd4598d3397ed391b8c996d686a3f939cd8e672d31b758faa298a23aaddfa394
Status: Downloaded newer image for httpd:2.4.33-alpine
docker.io/library/httpd:2.4.33-alpine	# 下载成功

2.先临时启动apache容器,将容器内httpd.conf拷贝一份到/home/lamp/conf/

# 启动临时httpd容器
[root@VM-12-8-centos www]# docker run -d --rm --name httpd  httpd:2.4.33-alpine 
6a6ef5cffbb578b901110d791dfac5280b784d15c863f7649c444559433e0d59

# 将容器内的/usr/local/apache2/conf/httpd.conf拷贝到/home/lamp/apache/conf/httpd.conf
[root@VM-12-8-centos home]# docker cp httpd:/usr/local/apache2/conf/httpd.conf /home/lamp/apache/conf/httpd.conf

# 将httpd容器停止
[root@VM-12-8-centos home]# docker stop httpd
httpd

3.修改/home/lamp/conf/httpd.conf文件

# 将httpd.conf里的下面三处注释去除
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

# 添加虚拟主机
# 注:下面IP必须填写PHP容器真实的IP,fpm端口号默认9000,不用变化
<VirtualHost *:80>
    ServerAdmin txl@com.cn
    DocumentRoot "/usr/local/apache2/htdocs"
    ServerName localhost
    <Directory "/usr/local/apache2/htdocs">
        Options None
        Require all granted
    </Directory>
    ProxyRequests Off
    
    ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.0.2:9000/var/www/$1 
</VirtualHost>

4.启动httpd容器,将80端口进行映射,

# 以交互模式启动httpd容器,容器名字为httpd
# 进行端口映射,将主机端口号80映射到容器80
# 分配网络为lamp-net,ip为192.168.0.3
# 将主机文件夹home/lamp/www映射到容器/usr/local/apache2/htdocs/
# 将主机文件home/lamp/conf/httpd.conf映射到容器/usr/local/apache2/conf/httpd.conf
[root@VM-12-8-centos home]# docker run -it -p 80:80 --name httpd --net lamp-net --ip 192.168.0.3 -v /home/lamp/www:/usr/local/apache2/htdocs/ -v /home/lamp/apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf httpd:2.4.33-alpine

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.0.3. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.0.3. Set the 'ServerName' directive globally to suppress this message
[Sat Mar 19 16:24:43.180326 2022] [mpm_event:notice] [pid 1:tid 140549116623752] AH00489: Apache/2.4.33 (Unix) configured -- resuming normal operations
[Sat Mar 19 16:24:43.180365 2022] [core:notice] [pid 1:tid 140549116623752] AH00094: Command line: 'httpd -D FOREGROUND'

# 按ctrl+p+q 不结束容器退出

5.往/home/lamp/www文件夹内写demo.php测试脚本

<?php
	phpinfo();
?>

6.通过浏览器访问demo.php页面,效果如图所示

在这里插入图片描述

四、配置MySql容器

1.下载mysql8.0版本的容器

[root@VM-12-8-centos ~]# docker pull mysql:8.0
8.0: Pulling from library/mysql
a4b007099961: Pull complete 
e2b610d88fd9: Pull complete 
38567843b438: Pull complete 
5fc423bf9558: Pull complete 
aa8241dfe828: Pull complete 
cc662311610e: Pull complete 
9832d1192cf2: Pull complete 
f2aa1710465f: Pull complete 
4a2d5722b8f3: Pull complete 
3a246e8d7cac: Pull complete 
2f834692d7cc: Pull complete 
a37409568022: Pull complete 
Digest: sha256:b2ae0f527005d99bacdf3a220958ed171e1eb0676377174f0323e0a10912408a
Status: Downloaded newer image for mysql:8.0
docker.io/library/mysql:8.0

2.启动临时mysql容器

[root@VM-12-8-centos phpmyadmin]# docker run -p 3306:3306 --name mysql --net lamp-net -e MYSQL_ROOT_PASSWORD=gg445566 --restart=always -d mysql:8.0
a26066e8e7256d66c1770fcd3b9b0192190cec14335eac09cfffdb031cb3d337

3.拷贝配置文件到宿主机

[root@VM-12-8-centos phpmyadmin]# docker cp mysql:/etc/mysql/my.cnf  /home/lamp/mysql8/conf/

# 拷贝完后,停止并删除容器
[root@VM-12-8-centos phpmyadmin]# docker stop mysql && docker rm mysql
mysql
mysql

4.重新启动mysql

# -e MYSQL_ROOT_PASSWORD 需要配置root的密码
# 将mysql添加到lamp-net网络
[root@VM-12-8-centos phpmyadmin]# docker run \
    -p 3306:3306 \
    --name mysql \
    --net lamp-net \
    --ip 192.168.0.4 \
    -e MYSQL_ROOT_PASSWORD=gg445566 \
    -v /home/lamp/mysql8/data:/var/lib/mysql:rw \
    -v /home/lamp/mysql8/logs:/var/log/mysql:rw \
    -v /home/lamp/mysql8/conf/my.cnf:/etc/mysql/my.cnf:rw \
    -v /home/lamp/mysql8/mysql-files:/var/lib/mysql-files/ \
    --restart=always \
    -d mysql:8.0
66e7ecb5e50e41e3e921b7d0b863228f15b0ac6ecdd344bdaa80646d5524a82e

5.进入mysql容器

[root@VM-12-8-centos phpmyadmin]# docker exec -it mysql bash
root@66e7ecb5e50e:/#

6.至此mysql服务成功启动

7.使用navicat工具连接不上数据库,原因在于mysql8版本以上,密码加密方式默认使用caching_sha2_password,只需要把加密方式更改为mysql_native_password即可

# 把root用户的加密方式更改
alter user 'root'@'%' identified with mysql_native_password by 'gg445566'
# 查看是否修改成功
select host,user,authentication_string,plugin from user;
五、配置phpmyadmin

1.下载phpmyadmin最新版

[root@VM-12-8-centos ~]#  docker pull phpmyadmin/phpmyadmin
5.1.3-fpm-alpine: Pulling from library/phpmyadmin
59bf1c3509f3: Pull complete 
7c7da25b2876: Pull complete 
2bc599114627: Pull complete 
927a0b37a45a: Pull complete 
4980da2f4b2f: Pull complete 
2d8d633f9515: Pull complete 
db0297103caf: Pull complete 
2243a9bddfde: Pull complete 
051837e3f6c3: Pull complete 
e79a999588a8: Pull complete 
501af0bf2ad9: Pull complete 
b79422e732d4: Pull complete 
4b5b3fc3e13e: Pull complete 
38fb48d44981: Pull complete 
f34c545bf259: Pull complete 
6efb87a1abdc: Pull complete 
Digest: sha256:a9394f241879653add70d7375abf7d9b1d61236a807160c4acbaf033c78061e6
Status: Downloaded newer image for phpmyadmin:5.1.3-fpm-alpine
docker.io/library/phpmyadmin:5.1.3-fpm-alpine

2.启动容器

# 以后台方式启动
# 分配
# PMA_HOST:设置mysql的ip
# PMA_PORT:设置mysql端口
# 暴露phpmyadmin页面的入口端口为12580
[root@VM-12-8-centos lamp]# docker run -d --name myadmin --net lamp-net --ip 192.168.0.5 -e PMA_HOST=192.168.0.4 -e PMA_PORT=3306 -p 12580:80 phpmyadmin/phpmyadmin
97cf2492652a20f86907b0f006fc1715e3361709b5dfbcba62591f07eb2837c5

3.访问phpmyadmin页面,输入数据库的密码,并进行登录,出现下述页面,则成功访问!

在这里插入图片描述

六、部署项目sqli

1.下载sqli-labs7压缩包

# 切换目录
[root@VM-12-8-centos lamp]# cd /home/lamp/www/
# 通过wget下载,这里注意下,使用的sqli版本为适应php7的
[root@VM-12-8-centos www]# wget https://codeload.github.com/skyblueee/sqli-labs-php7/zip/refs/heads/master
--2022-03-20 10:58:00--  https://codeload.github.com/skyblueee/sqli-labs-php7/zip/refs/heads/master
Resolving codeload.github.com (codeload.github.com)... 20.205.243.165
Connecting to codeload.github.com (codeload.github.com)|20.205.243.165|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Saving to: ‘master’

    [     <=>                                                   ] 11,487,894  10.2MB/s   in 1.1s   

2022-03-20 10:58:02 (10.2 MB/s) - ‘master’ saved [11487894]


# 解压下载好的压缩包
[root@VM-12-8-centos www]# unzip master
Archive:  master
86dbd720a25504b79037891fd27f83e26f99209c
   creating: sqli_labs_sqli-version-master/
   creating: sqli_labs_sqli-version-master/Less-1/
  inflating: sqli_labs_sqli-version-master/Less-1/index.php  
  inflating: sqli_labs_sqli-version-master/Less-1/result.txt  
   creating: sqli_labs_sqli-version-master/Less-10/
  inflating: sqli_labs_sqli-version-master/Less-10/in
  ...
  ...
  
# 查看目录
[root@VM-12-8-centos www]# ls
demok.php  demo.php  html  master  sqli_labs_sqli-version-master # 解压完成

2.修改数据库配置文件

[root@VM-12-8-centos www]# cd /home/lamp/www/sqli-labs-php7-master/sql-connections
[root@VM-12-8-centos sql-connections]# vim db-creds.inc 
# 修改完成后保存退出
<?php

//give your mysql connection username n password
$dbuser ='root';			# 数据库登录用户
$dbpass ='gg445566';		# 数据库登录密码
$dbname ="security";		# 创建数据库的名称,不用修改
$host = '192.168.0.4';		# 修改数据库ip地址
$dbname1 = "challenges";	# 不用修改

?>

改完后尝试一键部署sqli数据库资源,结果页面显示如下

在这里插入图片描述

出现这个结果的原因,是我们的php-fpm默认情况没有mysqli扩展,需要进入容器内进行安装

3.进入php容器,安装mysqli扩展

# 进入php容器
[root@VM-12-8-centos sql-connections]# docker exec -it fpm /bin/sh
# 修改Alpine下载源为国内清华
/usr/local/etc/php/conf.d # sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories

# 进入容器后,安装mysqli扩展
/usr/local/etc/php/conf.d # docker-php-ext-install mysqli pdo pdo_mysql
fetch http://dl-cdn.alpinelinux.org/alpine/v3.6/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.6/community/x86_64/APKINDEX.tar.gz
(1/28) Upgrading musl (1.1.16-r14 -> 1.1.16-r15)
(2/28) Installing m4 (1.4.18-r0)
(3/28) Installing libbz2 (1.0.6-r5)
(4/28) Installing perl (5.24.4-r2)
...
...

# 安装完成后,php容器内/usr/local/etc/php/conf.d/	会多出两个.ini文件
# 默认使用官方的php镜像,是不含有*.ini配置文件的,一定要注意这点

# 按ctrl+p+q退出容器

4.重启php服务

[root@VM-12-8-centos lamp]# docker restart fpm
fpm

再次尝试一键部署sqli数据库资源,结果页面显示

在这里插入图片描述

数据库连接失败,原因是sqli-labs 7的版本,连接mysql8的时候使用的密码验证方式不一致,有三种解决办法,方法一是使用mysq5.6版本以下的数据库,方法二是执行本手册第四章第7步,方法三,是执行本手册第六章第5步

5.配置mysql数据库

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
default_authentication_plugin=mysql_native_password	# 添加这字段,修改默认密码加密方式

# 修改完后重启mysql容器
[root@VM-12-8-centos lamp]# docker restart mysql
mysql

紧接着进入mysql容器,创建新用户

# 添加用户,用户名为sqli,密码为gg445566
CREATE USER 'sqli'@'%' IDENTIFIED BY 'gg445566';
# 对新添加的用户进行授权,下列语句是mysql8使用的方式,其他版本自行百度
GRANT ALL PRIVILEGES ON *.* TO 'sqli'@'%' WITH GRANT OPTION;
# 验证是否添加成功,检查密码验证方式
select host,user,authentication_string,plugin from user;

紧接着重新修改/home/lamp/www/sqli-labs-php7-master/sql-connections/db-creds.inc

[root@VM-12-8-centos lamp]# vim /home/lamp/www/sqli-labs-php7-master/sql-connections/db-creds.inc 

<?php

//give your mysql connection username n password
$dbuser ='sqli';			# 把用户名修改为刚创建的新用户
$dbpass ='gg445566';		
$dbname ="security";		
$host = '192.168.0.4';		
$dbname1 = "challenges";	
?>

改完后重新访问

在这里插入图片描述

sqli-labs7创建成功

6.最后,修改apache的httpd.conf文件,修改默认访问页面

<IfModule dir_module>
    DirectoryIndex index.html index.php	# 添加了index.php
</IfModule>


# 重启apache服务
[root@VM-12-8-centos lamp]# docker restart httpd
httpd

至此,sqli-labs7已经顺利部署成功!

笔者心得:能不用mysql8就别用,能用php5就别用php7!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值