本文尝试使用三种方式搭建docker lnmp环境,再使用laravel进行测试
第一步: 尝试多容器搭建lnmp环境
第二步: 通过docker-compose编排搭建lnmp环境
第三步: 编写dockerfile 结合docker-compose
第四步: 运行laravel框架测试lnmp环境
第一步:多容器搭建lnmp环境
1. 安装 nginx 镜像
1.1 创建lnmp的网络
docker network create --driver=bridge --subnet=192.168.0.0/16 mynginx
1.2 准备nginx.conf 和 default.conf文件
在测试 /home/nginx/ 目录下准备nginx.conf文件,内容如下:
#创建进程的用户和用户组,多个时用空格隔开
#user nobody;
#服务进程数量,一般等于 CPU 数量
worker_processes 1;
#全局错误日志定义,建议开启error级别日志.[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log notice;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#记录进程 ID 的文件
pid /var/run/nginx.pid;
events {
#一个 worker_processe 允许的最大并发连接数量
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
#http连接的持续时间
keepalive_timeout 65;
#gzip压缩设置,开启或关闭
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
===============================================================================
在测试 /home/nginx/conf.d 目录下准备default.conf文件,内容如下:
server{
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
location ~ \.php$ {
root /var/www;
fastcgi_pass 192.168.0.3:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
1.3 启动 nginx 容器 并 指定mynginx网络 :
nginx官方镜像
/usr/share/nginx/html 为默认的存放网页文件目录
/etc/nginx/conf.d/ 为默认的vhost配置文件目录
docker run --name nginx -d --rm \
-v /home/nginx/www:/usr/share/nginx/html \
-v /home/nginx/default.conf:/etc/nginx/conf.d/default.conf \
--network mynginx -p 8010:80 nginx
启动成功:
1.4 宿主机 /home/nginx/www 目录下编写测试index.html 文件
浏览器访问:宿主机IP地址:8010
2. 安装 php-fpm 镜像
2.1 启动 php-fpm 容器并指定mynginx网络与指定容器IP:
php-fpm官方镜像
/var/www 为默认的php文件存放目录;此处通过 -v 参数将其挂载到与nginx镜像同一个目录
docker run --name fpm -d --rm \
-v /home/nginx/www:/var/www \
--network mynginx --ip 192.168.0.3 \
php:7.3-fpm
3. 安装 mysql 镜像
1.1 启动 mysql容器 并 指定mynginx网络 :
mysql官方镜像
/var/lib/mysql 为默认的数据库数据文件存放目录;此处通过 -v 参数将其挂载到宿主机目录/home/nginx/db/data
docker run --name mysql -d --rm \
-e MYSQL_ROOT_PASSWORD=root \
-v /home/nginx/db/data:/var/lib/mysql \
--ip 192.168.0.4 \
--network mynginx -p 33061:3306 mysql:5.7
navicat测试连接:宿主机IP地址;33061端口; 账户root;密码root
navicat新建数据库后可看到挂载文件夹同样生成了数据库文件
4. 测试
4.1 宿主机 /home/nginx/www 目录下编写测试phpinfo.php 文件
<?php
phpinfo();
4.2 访问phpinfo
宿主机IP地址:8010/phpinfo.php
4.3 php连接mysql测试
编写mysqltest.php:
<?php
$link = mysqli_connect('192.168.0.4', 'root', 'root');
if (!$link) {
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully';
mysqli_close($link);
?>
因为官方php:7.3-fpm镜像未安装mysqli插件 所以这一步测试需要自己安装
# 容器内安装插件
docker exec -it fpm docker-php-ext-install mysqli
docker exec -it fpm docker-php-ext-enable mysqli
# 查看mysqli插件是否安装成功
docker exec -it fpm php -m
# 重启docker 让mysqli插件生效
docker restart nginx
docker restart fpm
访问测试:宿主机IP地址:8010/mysqltest.php
第二步:使用 docker-compose 编排
编排前先清理docker环境
- 删除第一步成功运行的容器*
- 删除第一步创建的容器和网络
docker rm -f fpm nginx mysql
docker network rm mynginx
# 删除上一步挂载的数据库文件夹
cd /home/nginx/db
rm -rf data
1. 创建新文件 docker-compose.yml,编排使用上述镜像
nginx挂载的配置文件:nginx.conf,default.conf需要事先准备
version: "2"
services:
fpm:
image: php:7.3-fpm
container_name: fpm
volumes:
- /home/nginx/www:/var/www
networks:
mynginx:
# 网络段使用192.168 主机段指定0.3
ipv4_address: 192.168.0.3
nginx:
image: nginx
container_name: nginx
# 挂载宿主机端口8020
ports:
- "8020:80"
volumes:
# 挂载nginx目录
- /home/nginx/www:/usr/share/nginx/html/
# 挂载nginx日志
- /home/nginx/log:/var/log/nginx/
# 挂载nginx配置文件
- /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
# 挂载虚拟主机配置文件
- /home/nginx/conf/conf.d/:/etc/nginx/conf.d/
networks:
mynginx:
# 网络段使用192.168 主机段指定0.2
ipv4_address: 192.168.0.2
mysql:
image: mysql:5.7
container_name: mysql
# 暴露端口33061
ports:
- "33061:3306"
# 数据库数据挂载
volumes:
- /home/nginx/db/data:/var/lib/mysql
environment:
# 创建默认homestead数据库
- "MYSQL_DATABASE=homestead"
# 创建用户homestead
- "MYSQL_USER=homestead"
# 设置homestead用户密码
- "MYSQL_PASSWORD=secret"
# 设置root用户密码
- "MYSQL_ROOT_PASSWORD=root"
networks:
mynginx:
# 网络段使用192.168 主机段指定0.4
ipv4_address: 192.168.0.4
# 同样创建mynginx网络
networks:
mynginx:
driver: bridge
ipam:
driver: default
# 子网掩码为 192.168.0.0/16
# 网关为 192.168.0.1
config:
- subnet: 192.168.0.0/16
gateway: 192.168.0.1
2. 启动服务
docker-compose up
3. 访问测试
宿主机IP地址:8020/phpinfo.php
第三步: 编写dockerfile 结合docker-compose
编译dockerfile,生成自己的php-fpm镜像
1.1 php-fpm.dockerfile
FROM php:7.3-fpm
#设置容器时区
ENV TZ Asia/Shanghai
#添加阿里云的镜像源
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone \
&& mv /etc/apt/sources.list /etc/apt/sources.list.bak \
&& echo "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib" >/etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian-security stretch/updates main" >>/etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib" >>/etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" >>/etc/apt/sources.list
# Install PHP needed extensions
# Here you can install any other extension that you need during the test and deployment process
RUN docker-php-ext-install \
pdo_mysql \
mysqli \
pcntl \
opcache \
bcmath
# Some extensions are not provided with the PHP source,but are instead available through PECL.
# To install a PECL extension, use pecl install to download and compile it, then use docker-php-ext-enable
RUN pecl install redis-5.1.1 \
&& docker-php-ext-enable redis
#删除包缓存中的所有包
RUN apt-get clean \
&& apt-get autoclean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
CMD php-fpm
编译dockerfile,生成自己的php-fpm镜像
docker build -t kevin-fpm -f php-fpm.dockerfile .
编译成功后查看镜像
1.2 将生成的kevin-fpm推送远程docker hub仓库
tag 镜像 —— kevin-fpm为源镜像名称 ;
zhuqianqq/kevin-fpm:v0.1 为远程hub仓库名/镜像名:版本信息
docker tag kevin-fpm zhuqianqq/kevin-fpm:v0.1
推送远程仓库
备:若宿主机未登录远程仓库请先操作docker login命名
docker push zhuqianqq/kevin-fpm:v0.1
1.3 编写dockerfile 结合docker-compose
version: "2"
services:
fpm:
#拉取远程仓库中的镜像
image: zhuqianqq/kevin-fpm:v0.1
container_name: kevin-fpm
volumes:
- /home/nginx/www:/var/www
nginx:
image: nginx
container_name: kevin-nginx
# 挂载宿主机端口8030
ports:
- "8030:80"
volumes:
# 挂载nginx目录
- /home/nginx/www:/usr/share/nginx/html/
# 挂载nginx日志
- /home/nginx/log:/var/log/nginx/
# 挂载nginx配置文件
- /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
# 挂载虚拟主机配置文件
- /home/nginx/conf/conf.d/:/etc/nginx/conf.d/
mysql:
image: mysql:5.7
container_name: kevin-mysql
# 暴露端口33062
ports:
- "33062:3306"
# 数据库数据挂载
volumes:
- /home/nginx/db/data2:/var/lib/mysql
environment:
# 创建默认homestead数据库
- "MYSQL_DATABASE=homestead"
# 创建用户homestead
- "MYSQL_USER=homestead"
# 设置homestead用户密码
- "MYSQL_PASSWORD=secret"
# 设置root用户密码
- "MYSQL_ROOT_PASSWORD=root"
redis:
# 指定镜像
image: redis:5
container_name: kevin-redis
ports:
# 端口映射
- 63791:6379
volumes:
# 目录映射
- /home/redis5/conf:/usr/local/etc/redis
- /home/redis5/data:/data
environment:
- TZ=Asia/Shanghai # 设置时区
# 运行docker-compose服务 -f 指定yml文件 -p 指定服务名称
docker-compose -f docker-compose.yml -p kevin-lnmp up
上述docker-compose编排的服务可以不定义网络信息,直接使用容器名当ip来访问。修改default02.conf如下图所示:
1.4 访问测试
宿主机IP地址:8030/phpinfo.php;其中直接的扩展redis已成功安装
第四步:运行laravel框架测试lnmp环境
测试前请确保宿主机已安装了php的composer环境
1.1 下载laravel代码
composer create-project --prefer-dist laravel/laravel 项目名 "5.5.*"
1.2 访问测试
宿主机IP地址:8030/laraveltest/public/index.php;
若访问出现权限问题:将kevin-fpm容器挂载/var/www目录所属组与所有者修改为www-data:www-data(www-data为php-fpm的所属组与所有者)
docker exec -it kevin-fpm chown -R www-data:www-data /var/www
1.3 访问测试(重写default02.conf)
访问:宿主机IP地址:8030/laraveltest/public/index.php 的url地址太长,重写nginx 虚拟主机配置;
server{
listen 80;
# 修改网站根目录
root /var/www/laraveltest/public;
# laravel重写规则
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass kevin-fpm:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
测试:
1.4 访问测试(mysql数据库连接测试)
cd /home/nginx/www/laraveltest
# 修改.env文件
vi .env
# 创建测试控制器
php artisan make:controller TestController
cd /home/nginx/www/laraveltest/routes
# 增加测试数据库路由与redis路由
vi web.php
# 编写TestController连接数据库与redis方法
cd /home/nginx/www/laraveltest/app/Http/Controllers
vi TestController.php
测试:宿主机IP:8030/dbtest
1.5 访问测试(redis连接测试)
# laraveltest框架安装redis扩展包
cd /home/nginx/www/laraveltest
composer require predis/predis ^1.1
测试:宿主机IP:8030/redistest
完成整体试验!!