环境
docker01 | 192.168.1.128 |
---|
部署LNMP
网络规划:
网段:172.16.10.0/24
Nginx:172.16.10.10
Mysql:172.16.10.20
Php:172.16.10.30
网站的访问主目录(host):/wwwroot
Nginx的配置文件(host):/docker
MySQL持久化的目录(host):/var/lib/mysql
前提准备
拷贝所需文件到本地目录,mysql创建test数据库,用做验证
[root@docker01 ~]# mkdir /wwwroot
[root@docker01 ~]# mkdir /docker
[root@docker01 ~]# docker run -itd --name test nginx #获取nginx配置文件
[root@docker01 ~]# docker cp test:/etc/nginx /docker
[root@docker01 ~]# ls /docker/
nginx
[root@docker01 ~]# docker cp test:/usr/share/nginx/html /wwwroot/
[root@docker01 ~]# ls /wwwroot/
html
[root@docker01 ~]# docker rm -f test
test
[root@docker01 ~]# docker pull mysql:5.7 #获取mysql配置文件
[root@docker01 ~]# docker run -itd --name test -e MYSQL_ROOT_PASSWORD=pwd123 mysql:5.7
[root@docker01 ~]# docker exec -it test bash
root@01ef351e6f11:/# mysql -uroot -ppwd123 -h127.0.0.1
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> exit
root@01ef351e6f11:/# exit
[root@docker01 ~]# docker cp test:/var/lib/mysql /
[root@docker01 ~]# ls /mysql/
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test
[root@docker01 ~]# docker rm -f test
test
1、创建一个自定义网络
[root@docker01 ~]# docker network create -d bridge --subnet 172.16.10.0/24 --gateway 172.16.10.1 lnmp
2、运行nginx容器
[root@docker01 ~]# docker run -itd --name nginx -p 80:80 -v /wwwroot/html:/usr/share/nginx/html -v /docker/nginx:/etc/nginx --network lnmp --ip 172.16.10.10 nginx
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96f36bcee11b nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp nginx
[root@docker01 ~]# echo 123456 > /wwwroot/html/index.html
[root@docker01 ~]# curl 127.0.0.1
123456
3、运行mysql容器
[root@docker01 ~]# docker run -itd --name mysql -p 3306:3306 -v /mysql:/var/lib/mysql --network lnmp --ip 172.16.10.20 mysql:5.7
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48bf66ed33e4 mysql:5.7 "docker-entrypoint.s…" 51 seconds ago Up 51 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
96f36bcee11b nginx "/docker-entrypoint.…" 13 minutes ago Up 13 minutes 0.0.0.0:80->80/tcp nginx
[root@docker01 ~]# ss -lnt
LISTEN 0 128 :::3306 :::*
[root@docker01 ~]# yum -y install mariadb
[root@docker01 ~]# mysql -uroot -ppwd123 -h127.0.0.1
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
MySQL [(none)]> Bye
4、运行php容器
[root@docker01 ~]# docker run -itd --name phpfpm -p 9000:9000 -v /wwwroot/html:/usr/share/nginx/html --network lnmp --ip 172.16.10.30 php:7.2-fpm
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f15c778bd42 php:7.2-fpm "docker-php-entrypoi…" 16 seconds ago Up 15 seconds 0.0.0.0:9000->9000/tcp phpfpm
48bf66ed33e4 mysql:5.7 "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
96f36bcee11b nginx "/docker-entrypoint.…" 23 minutes ago Up 23 minutes 0.0.0.0:80->80/tcp nginx
5、nginx和php连接
[root@docker01 ~]# vim /docker/nginx/conf.d/default.conf
9 location / {
10 root /usr/share/nginx/html;
11 index index.html index.htm index.php; #添加PHP解析
12 }
……
修改:
31 location ~ \.php$ { #开启fastcgi配置
32 root /usr/share/nginx/html;
33 fastcgi_pass 172.16.10.30:9000;
34 fastcgi_index index.php;
35 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
36 include fastcgi_params;
37 }
修改nginx静态的测试界面
[root@docker01 ~]# vim /wwwroot/html/index.html
<h1>Hello LNMP</h1>
添加php测试界面
[root@docker01 ~]# vim /wwwroot/html/index.php
<?php
phpinfo();
?>
[root@docker01 ~]# docker restart nginx #重启nginx容器,使其重新识别nginx配置文件
nginx
浏览器验证,nginx服务和php服务的界面
PS:在用浏览器访问测试的时候,不要忽略了dockerhost的防火墙和 selinux
验证nginx服务80:
验证nginx和php的连接9000:
6、php和mysql的连接验证
能够访问到以上两个界面,说明nginx和php的连接,没有问题,接下来是 php 和 mysql 的连接。在这里使用一个phpMyAdmin的数据库管理工具
[root@docker01 html]# pwd
/wwwroot/html
[root@docker01 html]# rz #复制phpMyAdmin-4.9.1-all-languages.zip到/wwwroot/html
[root@docker01 html]# ls
50x.html index.html index.php phpMyAdmin-4.9.1-all-languages.zip
[root@docker01 html]# unzip phpMyAdmin-4.9.1-all-languages.zip
[root@docker01 html]# mv phpMyAdmin-4.9.1-all-languages phpmyadmin
修改phpmyadmin的配置文件,指定连接的数据库的IP
[root@docker01 ~]# cd /wwwroot/html/phpmyadmin/
[root@docker01 phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@docker01 phpmyadmin]# vim config.inc.php
31 $cfg['Servers'][$i]['host'] = '172.16.10.20'; #修改为mysql的IP地址
更改nginx的配置文件,添加phpmyadmin的索引文件
[root@docker01 ~]# cd /docker/nginx/conf.d/
[root@docker01 conf.d]# vim default.conf
9 location / {
10 root /usr/share/nginx/html;
11 index index.html index.htm index.php;
12 }
新添加phpmyadmin模块:
13 location /phpmyadmin {
14 root /usr/share/nginx/html;
15 index index.html index.htm index.php;
16 }
……
35 location ~ \.php$ {
36 root /usr/share/nginx/html;
37 fastcgi_pass 172.16.10.30:9000;
38 fastcgi_index index.php;
39 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
40 include fastcgi_params;
41 }
42
添加:
43 location ~ /phpmyadmin/(?<after_ali>(.*)\.(php|php5)?$) {
44 root /usr/share/nginx/html;
45 fastcgi_pass 172.16.10.30:9000;
46 fastcgi_index index.php;
47 fastcgi_param SCRIPT_FILENAME
48 $document_root$fastcgi_script_name;
49 include fastcgi_params;
50 }
重启nginx容器,重新识别nginx配置文件
[root@docker01 conf.d]# docker restart nginx
nginx
浏览器访问phpmyadmin
PS:能够访问到此目录,说明php——mysql服务的连接时没问题的
需要对php镜像做出更改,添加php和mysql连接的模块写一个dockerfile
[root@docker01 ~]# vim Dockerfile
FROM php:7.2-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetypedir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install mysqli pdo pdo_mysql
[root@docker01 ~]# docker build -t php_mysql .
删除之前的php容器,并用新制作的php镜像重新运行
[root@docker01 ~]# docker rm -f phpfpm
[root@docker01 ~]# docker run -itd --name phpfpm -p 9000:9000 -v /wwwroot/html:/usr/share/nginx/html --network lnmp --ip 172.16.10.30 php_mysql:latest
—————————————————————————————————或者下边的方法(时间都差不多长)—————————————————————————————————————
[root@docker01 ~]# docker exec -it phpfpm bash
root@7f15c778bd42:/var/www/html# apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetypedir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install mysqli pdo pdo_mysql
—————————————————————————————————本人使用已完成的镜像—————————————————————————————————————
[root@docker01 conf.d]# docker rm -f phpfpm
[root@docker01 ~]# rz #复制phpmysql.tar到/root/
[root@docker01 ~]# ls
phpmysql.tar
[root@docker01 ~]# docker load < phpmysql.tar
[root@docker01 ~]# docker run -itd --name phpfpm -p 9000:9000 -v /wwwroot/html:/usr/share/nginx/html --network lnmp --ip 172.16.10.30 php_mysql:latest
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84532a52e7a3 php_mysql:latest "docker-php-entrypoi…" 5 seconds ago Up 4 seconds 0.0.0.0:9000->9000/tcp phpfpm
3175cca7ddbb mysql:5.7 "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
1929056be434 nginx "/docker-entrypoint.…" 14 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp nginx
验证:
登录成功之后,会看到之前创建的数据库