• Docker快速搭建LNMP环境


    一、使用Dockerfile制作镜像

      前面的博客中已经介绍了如何基于容器制作镜像,此方法的原理是使用一个正在运行的容器,根据生产所需进行配置更改等操作后,使其满足生产环境,再将这个容器打包制作为镜像,这样类似于快照制作镜像的方式尽管操作还算比较简单,但是当生产环境规模增大,配置变得越来越复杂后,就会显得很臃肿很笨拙。所以下面使用Docker搭建LNMP介绍另一种最为普遍最为常用的容器镜像制作方式——Dockerfile。

    1.制作nginx镜像

      编辑Dockerfile文件,Dockerfile文件的文件名可以是自定义,但首字母一定要大写:

    FROM centos:latest
    LABEL AUTHER="AM"
    ENV NGX_VERSION="nginx-1.14.2" 
        WEB_ROOT="/data/nginx/html" 
        WEB_PORT="80" 
        PHP_ROOT="/var/www/html" 
        PHP_IP="172.19.0.4"
    ADD $NGX_VERSION.tar.gz /tmp/nginx/
    RUN yum makecache 
        && yum install -y gcc gcc-c++ make openssl-devel pcre-devel 
        && mkdir -p /data/nginx/ 
        && cd /tmp/nginx/$NGX_VERSION/ 
        && ./configure --prefix=/data/nginx/ 
        && make 
        && make install 
        && yum remove -y gcc gcc-c++ make 
        && rm -rf /data/nginx/conf/nginx.conf 
        && yum clean all 
        && rm -rf /tmp/nginx/
    COPY nginx.conf /data/nginx/conf/
    WORKDIR /data/nginx
    EXPOSE 80
    CMD ["./sbin/nginx","-g","daemon off;"]

      Nginx镜像目录树:

    /root/image/
    ├── Dockerfile
    ├── index.html
    ├── nginx-1.14.2.tar.gz
    ├── nginx.conf

      生成镜像:

    docker build -t selfnginx:v0.1 ./

      创建搭建LNMP的专用网络连接,使容器之间能在同一网络名称空间通信,(要注意的是,要使容器间通信不仅可以创建新的网络连接,还可以使用 --link 选项):

    docker network create lnmp

      启动Nginx容器:

    docker container run --name nginx-lnmp -it 
    --network lnmp -p 80:80 --rm -v
    /data/nginx/html:/data/nginx/html nginx-lnmp:latest

    2.制作并启动PHP镜像

      PHP7.2Dockerfile托管在Github上,制作方法和Nginx相同。启动容器:

    docker container run --name php -it --network lnmp -
    -rm -v /data/nginx/html:/var/www/html
    php-fpm7.2:latest

      在Nginx与PHP建立连接时有一个坑,在Nginx+PHP中通用配置如下:

            location ~ .php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
    }

      在通常的非Docker场景中这样配置是没有问题的,但是在Docker场景下使用 $document_root 会出现报错: FastCGI sent in stderr: "Primary script unknown" ,打开php页面时会提示 file not found 。这是由于PHP容器化后PHP的工作目录并不是默认的 $document_root ,所以必须使用容器镜像事先所指定的路劲,我这里的路径是 /var/www/html ,所以要将 $document_root 替换为 /var/www/html 。

    3.制作并运行MariaDB镜像

      MariaDB的Dockerfile地址也托管在github上。我这里没有制作镜像,直接使用的是官方的公共Docker镜像→链接

      在启动MariaDB时,要指定初始化的环境变量:MYSQL_ROOT_PASSWORD MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORD等,其中必须的是 MYSQL_ROOT_PASSWORD :

    docker container run --name mariadb -it 
    -p 3306:3306 --network lnmp
    -v /data/mysql:/var/lib/mysql --rm
    -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=mysql
    -e MYSQL_PASSWORD=123456
    -e MYSQL_DATABASE=wptest mariadb:10.2.16

    4.注意事项

      除了上述Nginx配置问题外,还要注意Nginx和PHP的数据路径必须挂载在同一位置。检测PHP是否可与MariaDB正常通信,可使用:

    <?php
    $mysqli = new mysqli("localhost", "root", "password");
    if(!$mysqli) {
    echo"database error";
    }else{
    echo"php env successful";
    }
    $mysqli->close();
    ?>
  • 相关阅读:
    8天学通MongoDB——第五天 主从复制
    5天不再惧怕多线程——第五天 线程池
    8天玩转并行开发——第四天 同步机制(上)
    8天学通MongoDB——第八天 驱动实践
    8天玩转并行开发——第三天 plinq的使用
    8天玩转并行开发——第一天 Parallel的使用
    8天玩转并行开发——第五天 同步机制(下)
    5天不再惧怕多线程——第一天 尝试Thread
    虚函数、纯虚函数详解
    libevent 笔记
  • 原文地址:https://www.cnblogs.com/readygood/p/10313862.html
Copyright © 2020-2023  润新知