• 原lnmp环境服务器升级为mysql+nginx+php单个docker容器构建的lnmp环境


    时间:2018年2月

    一.项目背景

    我单位现web服务架构为lnmp环境,服务器软件、硬件升级部署难;同时开源软件日新月异,考虑到技术升级,领导决定服务器架构整体升级为容器架构,维护性、移植性强。

    二.项目说明

    原服务器架构为lnmp环境,服务器运行稳定,升级为容器架构,应平稳过度;采用单个镜像逐个构造容器,将容器互联,部署为lnmp环境;原服务器项目代码、配置文件,数据库数据等采用数据挂载方式与容器互联,访问端口采用端口映射方式,实现客户访问。

    三.实施步骤

    1.镜像构造

    1)mysql镜像构造

    我们采用dockerfile 构造vim  Dockerfile

    FROM mysql:5.7                                               

    MAINTAINER yst <691699086@qq.com>

    ENV TZ "Asia/Shanghai"

    基础镜像为mysql5.7

    docker build -t  mysql  .

    build 为构造镜像, mysql 为镜像的仓库及标签,.为当前路径

    出现success就代表成功了。

    2)php镜像构造

    vim   Dockerfile

    FROM centos:centos7                                         #以centos7为基础

    MAINTAINER yst <mushouhxh@tom.com>       #制作者    

    ENV TZ "Asia/Shanghai"                                     #时区

    #安装依赖包

    RUN yum -y install libxml2-devel libmcrypt-devel libmcrypt mcrypt mhash  libjpeg libjpeg-devel libpng libpng-devel net-tools  gcc gcc-c++ make

    ADD php-5.6.36.tar.gz  /                                     #拷贝安装包

    #运行源码包安装程序

    RUN cd /php-5.6.36 && ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-mbstring  --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-fpm --with-gd && make && make install

    #复制文件
    RUN cp   /php-5.6.36/php.ini-production  /usr/local/php/etc/php.ini
    RUN cp  /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

    #配置php

    RUN useradd -M -s /sbin/nologin php

    #修改配置文件
    RUN sed -i -e  's;pid = run/php-fpm.pidpid = run/php-fpm.pidg'  -e  's obodyphpg'  -e  'slisten = 127.0.0.1:9000listen = 0.0.0.0:9000g'  /usr/local/php/etc/php-fpm.conf

    RUN sed -i 's;daemonize = yesdaemonize = nog' /usr/local/php/etc/php-fpm.conf

    EXPOSE 9000                                                                        #暴露端口
    CMD ["/usr/local/php/sbin/php-fpm"]                                      #启动php-fpm

    docker build -t  php   .

    3)nginx 镜像构造

    先写好配置文件nginx.conf 

    vim  nginx.conf

    user  nginx; worker_processes  1;

    error_log  logs/error.log; #error_log  logs/error.log  notice; #error_log  logs/error.log  info;

    pid        logs/nginx.pid;

    events {     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  logs/access.log  main;

          sendfile        on;     #tcp_nopush     on;

             keepalive_timeout  65;  

            gzip  on;

           server {        

        listen       80;        

        server_name  localhost;

         charset utf-8;

              location / {    

        #存放网页代码目录            

        root   html;                                     

         index  index.php index.html index.htm;        

         }

         # redirect server error pages to the static page /50x.html        

        #重定向到错误页面        

        error_page   500 502 503 504  /50x.html;        

        location = /50x.html {            

          root   html;        

        }

         # proxy the PHP scripts to Apache listening on 127.0.0.1:80        

        #location ~ .php$ {        

           #    proxy_pass   http://127.0.0.1;        

        #}        

        #如果结尾为.php 文件,转向容器名为php的容器,由该容器负责.php,并且端口为9000,        

        location ~ .php$ {            

          root          html;            

          fastcgi_pass   php:9000;            

           fastcgi_index  index.php;            

          fastcgi_param  SCRIPT_FILENAME  /$document_root$fastcgi_script_name;            

           include        fastcgi_params;        

         }    

      }

     }

    from centos:centos7
    MAINTAINER yst mushouhxh@tom.com

    RUN yum -y install gcc gcc-c++ pcre-devel zlib-devel make
    RUN useradd nginx -s /sbin/nologin
    ADD nginx-1.10.3.tar.gz /
    RUN cd /nginx-1.10.3 && ./configure  --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_gzip_static_module  --with-pcre  && make && make install
    #创建日志目录
    RUN mkdir /var/log/nginx
    #拷贝配置文件
    ADD nginx.conf /usr/local/nginx/conf/nginx.conf                                #将写好的配置文件添加到镜像中
    EXPOSE 80 443
    ENTRYPOINT ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]      #以守护进程方式运行nginx

    docker build  -t   nginx  .

    2.生成并运行容器

    因为要升级为 docker 环境的lnmp,要以数据库为后台,所以要先生成数据库容器,再生成PHP容器,最后生成Nginx容器。

    1)运行并启动mysql容器

    docker run  -d  -it --name mysql -p 3306:3306 -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456     mysql  

    -d :以守护进程运行容器

    -i :让容器的输入保持打开

    -t : 分配一个伪终端

    --name:为该容器的名字

    -p:为宿主机的端口映射到容器的端口

    -e:设置数据库登录root密码

    -v 挂载宿主机/root/bo/data/mysql到容器的/var/lib/mysql,也就是宿主机与容器实现数据同步

    最后的mysql  为镜像的仓库名及标签

    2)运行并启动PHP容器

    docker run  -d  -it --name php -p 9000:9000 -v /root/php/data/:/usr/local/nginx/html --link mysql:mysql php

     -v : 此处为宿主机的目录挂载到nginx容器中nginx 安装目录的网页代码存放目录,把.php为结尾的代码文件挂载映射到该目录

    可把原旧lnmp服务器中的代码迁移至该宿主机,实现数据与容器的互联

    --link :为连接mysql 容器,名字为mysql

    3)运行并启动nginx容器

    docker run -d -it --name nginx -p 80:80 -v /root/nginx/data:/usr/local/nginx/html --link php:php  nginx

    --link :为连接PHP容器,名字为php

    -v : 映射宿主机存放网页代码路径到容器的Nginx安装目录的放网页代码目录,可把原旧lnmp服务器中的代码迁移至该宿主机,实现数据与容器的互联

    3.测试

    1)准备 index.html,index.php,test.php

    分别为普通网页文件,PHP网页文件,测试PHP与mysql连通的测试文件

    vim index.html

    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    vim  index.php

    <?php
    phpinfo();
    ?>

    此处mysql版本为5.7,所以测试代码为mysqli_connect('为宿主机中的容器名字:对应的宿主机端口','登录服务器的用户名','密码')

    如果是其他版本,语句会不同

    mysqli_close($link);为关闭连接

    vim test.php

    <?php

    $link=mysqli_connect('mysql:3306','root','123456');

    if($link) echo "连接成功";

    mysqli_close($link);

    ?>

    2)访问测试

    打开浏览器,输入http://宿主机的ip回车

    显示我们准备的index.html

     

    输入http://宿主机的ip/index.php回车

    输入http://宿主机的ip/test.php回车

    3)数据库操作测试

    打开navicat for mysql

     

    建立新的连接

    主机名为宿主机的ip,此处为什么为宿主机的ip呢,因为,数据库容器建立在该主机上,而宿主机与容器在运行容器时已用参数-p 3306:3306进行了端口映射,所以,访问宿主机的3306就相当于访问容器的3306端口,也就是访问mysql容器的mysql服务。

    用户名为root

    密码为我们在运行容器时,-e   MYSQL_ROOT_PASSWORD=123456设置的root的密码123456

    建立好连接,我们就可以在Windows桌面对容器进行操作了,操作的结果都会反馈到容器内,从而实现数据互联。

    4.总结

    项目难点

    1)如何生成合适的镜像

    mysql 镜像是我们在docker镜像库中下载mysql纯净镜像,docker  tag  命令将原镜像标签标记为我们自己的命名

    PHP镜像是以centos7纯净镜像为基础,通过源码安装,配置好配置文件,并开启端口而构建的

    nginx 镜像是以centos7纯净镜像为基础,通过源码安装,修改配置文件,开启端口而构建的

    2)如何正确启动镜像并运行容器

    先开启mysql容器;开启php容器及nginx容器时,发生

    容器运行命令执行后,容器就关闭了,这不是我们要的结果,我们希望容器要一直运行服务,我们才能访问容器内的服务。

    我们从查询镜像生成文件dockerfile 文件开始,一步步查找原因,经过反复试验,不断生成镜像,运行容器,我发现在生成镜像的最后,我们一定要开启在该镜像中的服务,比如PHP镜像,我们在运行容器时,需要在容器中开启php-fpm服务,这就需要我们在创建竟像时,开启这个服务进程,就是

    CMD ["/usr/local/php/sbin/php-fpm"];而nginx 容器运行时出现同样问题,反复查询,调试,应在生成镜像时要执行入口命令

    ENTRYPOINT ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"],或在执行运行容器的命令加入--restart=always参数否则在容器启动运行完入口名,容器也会停止。

    3)如何连接各个容器

    单个容器,每个容器提供有每个的服务功能,这是docker容器的一个容器一个功能,也是 docker 容器的优点所在,每个容器提供的服务封装起来,用的时候运行它,不用的时候可以迁移,拷贝到哪里都可以提供服务。我们如何实现它,就是用--ling参数,将有关联的几个容器互联起来,一起完成一个更加强大的服务功能。

    比如:构建容器环境的lnmp,需要mysql,php,nginx等几个容器提供的服务,需要将几个容器连接起来一同完成 lnmp服务

    docker run -d -it --name nginx -p 80:80 -v /root/nginx/data:/ usr/local/nginx/html   --link php:php  --link mysql: mysql   nginx

     

     

     

     

     

     

     

     

  • 相关阅读:
    环境变量的配置
    java语言概述
    快捷键,功能键及常用的DOS命令
    html介绍
    Java web学习框架
    线程的使用
    Task类(任务)
    Parallel类(简化Task 操作)
    文件及数据流技术
    泛型的使用
  • 原文地址:https://www.cnblogs.com/mushou/p/9489479.html
Copyright © 2020-2023  润新知