docker学习笔记(5):docker搭建DNMP环境

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都是独立的容器运行,所以这里需要通过参数连接。

扫描二维码关注公众号,回复: 11276574 查看本文章

但其实拉下来后这个php容器少了一个扩展,至于为什么没有这个扩展,我也不太清楚,因为我不是玩PHP了,就之前搭建博客的时候业余学了一手,所以要进入到PHP容器里安装该模块,具体解释可以看下面的博客:

docker官方alpine/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。

猜你喜欢

转载自blog.csdn.net/submarineas/article/details/100172156