DNMP介绍
环境介绍:
├── mysql
├── nginx
│ └── nginx.conf
└── php
└── php.ini
本篇文章将介绍一个更加方面的相当于LNMP(linux + NGINX + MySQL + PHP)环境的部署方式,效率更加高效,而对于lnmp或者lamp的介绍,可以看我去年写的那篇文章:
Ubuntu 16.04 安装 Apache, Mysql, PHP7, phpMyAdmin过程解析和错误总结
生成mysql容器
关于mysql的创建方式,我在上一节中已经介绍得很详细了,里面具体有什么坑还有一些需要注意的事项,比如说端口开放问题、权限问题、配置文件问题:
docker学习笔记(4):制作mysql镜像与后续相关维护总结
这里生成mysql容器的步骤基本和之前的一致,为:
# 移动该目录下
cd /mysql
# 拉取镜像
docker pull mysql
#创建容器
docker run \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v "$PWD"/data:/var/lib/mysql \
-v "$PWD"/conf:/etc/mysql/conf.d \
-d mysql
说明:
–name 参数为mysql容器名称,可以自己定义。
-p 指定外部映射到容器的端口
-e 环境变量 MYSQL_ROOT_PASSWORD为指定root账号密码
-v 映射目录或者文件
* /data 为mysql数据目录
* /conf 为配置目录
-d 以守护进程的方式运行
-$pwd是变量,相当于在当前路径下的data和conf目录下
查看进程:
docker ps -a
使用上面命令,如果没有出现exit() 后面跟时间,那么基本就启动成功了,因为是以守护进程的方式,它会在后台运行。这时我们配置完mysql容器后,就能用Navicat连接了。
生成PHP容器
php容器其实和上面也是一样的,但这里需要注意的是版本号,php的迭代次数还是会要比mysql快,另外就是对低版本的支持性不高,所以目前我感觉都是mysql 5.7就够了,然而php至少要7以上。所以命令为:
# 移动到该目录下
cd /php
docker pull php:7.2-fpm
# 生成容器
docker run -d \
--name php \
-p 9000:9000 \
-v "$PWD"/etc/:/usr/local/etc/php \
-v /home/www/:/var/www/html:ro \
--link mysql \
php:7.2-fpm
说明:
重复的就不作说明,上面已经介绍过了。
-v 目录映射
* /etc/ php 的配置目录,存放php.ini的地方
* /home/www/ 映射php www目录
–link mysql 因为php和mysql都是独立的容器运行,所以这里需要通过参数连接。
但其实拉下来后这个php容器少了一个扩展,至于为什么没有这个扩展,我也不太清楚,因为我不是玩PHP了,就之前搭建博客的时候业余学了一手,所以要进入到PHP容器里安装该模块,具体解释可以看下面的博客:
# cd /usr/local/bin
# ./docker-php-ext-install pdo_mysql
可能中途会有报错,说某某路径下没有这个目录或者是文件,那么只需要去它指定的路径下创建目录就不会有这个报错了。
安装成功后,我们输入php -m可以看到我们的这个扩展:
然后我们回到宿主机,这里我们回到php目录下创建php.ini配置文件,写入配置信息:
extension=pdo_mysql
当然,可能在上面修改了php容器重启后,在宿主机的conf.d目录下会产生一个ini文件,比如说我这里目前的目录结构便有,不过配置一个保险一点。
├── etc
│ └── conf.d
│ └── docker-php-ext-pdo_mysql.ini
└── php.ini
生成nginx容器
这里和前面两个安装基本一致,首先拉取nginx镜像,默认是最近的也是最新的一个版本,而在启动之前,我们需要写好一个nginx.conf配置文件,因为要将这个挂载到容器中,我这里的版本为:
user nginx;
worker_processes auto;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /server/nginx/conf.d/*.conf;
server {
#根据映射的端口确定
listen 8080;
listen [::]:8080;
server_name localhost;
root /home/www;
index index.php index.html index.htm;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
这里基本都是常规写法,nginx改的一般都是server中的root路径,因为nginx要去解析,还有便是重定向,其它的基本不会有变动。
cd /nginx
#创建容器
docker run --name nginx \
-d -p 8080:8080 \
-v /home/www:/home/www \
-v /home/www:/usr/share/nginx/html \
-v "$PWD"/nginx.conf:/etc/nginx/nginx.conf \
-v "$PWD"/logs:/var/log/nginx \
-v "$PWD"/conf.d:/etc/nginx/conf.d \
--link php \
-d nginx
如果我们要测试nginx是否启动成功,外网的话看一下防火墙和端口号有没有开,然后没问题就ip+端口号,如果是内网的话,可以直接curl一下127.0.0.1:8080,如果有html格式的文件,那么就是nginx已经启动成功。如果没有启动成功,那么可以去nginx/logs下的error.log文件,看一下报错日志。
检验环境
这里检查环境,其实就是去nginx还有php联网下的检测路径下创建一个phpinfo.php文件,和之前的LAMP测试方法一样,文件内容写入:
<?php
phpinfo();
?>
然后访问访问ip+端口/phpinfo.php,就会看到所有的配置信息:
总结
DNMP配置感觉比我去年配LNMP简单不少,但可能是我去年犯了太多的错误,看了太多错误的帖子导致,所以在写这篇的时候,基本都是一次成功,避开了很多低级错误,也算是从失败经验中总结了很多。另外感觉拿docker当服务确实很方便,如果是个人开发的话,虚拟机的快照还是有一定风险,这个就完全不需要担心了。下一篇将介绍docker-compose的使用技巧,k8s的话搭是搭好了,但里面东西太多,暂时还没有动笔的打算,那么就写到这里,end。