zoukankan      html  css  js  c++  java
  • Docker部署LNMP完整教程

    在Docker中部署LNMP环境可以分为以下几个步骤:

    1. 安装Docker
    2. 创建镜像
      1. 创建Dockerfile
      2. build Docerfile
      3. 复制/修改配置文件
    3. 运行镜像,并映射端口

    为了方便分布式部署,Nginx、PHP、MySQL和Web目录会分别放在4个不同的容器中,最后我们会打包成4个镜像。

    1 安装docker和docker-compose

    安装docker和docker-compose自行Google吧,太多教程了,这里就不做一一介绍了。

    Docker安装要求Linux 3.10以上版本

    装了yum的可以执行下面的命令安装docker-compose

    yum install docker-io docker-compose     
    

    安装之后,用这个命令查看版本:

    docker -v
    

    1.1 镜像仓库

    Nginx、PHP、MySQL在Docker官方都提供现成的镜像仓库,这些我们是可以直接使用的,各个仓库地址如下。

    1.2 Dockerfile文件

    Dockerfile 文件类似 Makefile,只是前者根据规则部署容器,后者根据规则编译项目。

    Dockerfile规则请参考:https://docs.docker.com/engine/reference/builder/

    接下来每个程序的部署都会用到Dockerfile,所以一定要提前了解每个命令的功能。

    2 部署MySQL

    因为安装MySQL相对简单,所以我们从MySQL开始。

    从Docker的公共仓库 Dockerhub 下载 MySQL 镜像:

    $ docker pull mysql
    

    然后启动数据库:

    $ docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
    

    就完成了MySQL的安装,接下来我们再在PHP-FPM容器中使用。

    3 部署Nginx

    安装Nginx

    首先,从Docker的公共仓库 Dockerhub 下载nginx镜像:

    $ docker pull nginx
    

    这个命令会下载容器需要的所有部件,并且Docker会对它们进行缓存,所以在运行容器的时候,不需要每次都下载容器镜像。

    然后,启动Nginx容器:

    $ docker run --name nginx -p 80:80 -d nginx
    

    运行成功后,终端会返回容器的ID号,上面的命令中,

    • run:创建一个新的容器
    • --name:指定容器的名称(如果留空,docker会自动分配一个名称)
    • -p:导出容器端口到本地服务器,格式:-p <local-port>:<container-port>。在本例中,我们映射容器的80端口到本地服务器的80端口。
    • nginx:是 Dockerhub 上下载nginx镜像名称(如果本地没有可用的镜像,Docker会自动下载一个)
    • -d:后台启动。

    通过浏览器浏览:http://localhost 就会看到Nginx欢迎界面。接下来可能会用到这几个命令:

    $ docker ps -a                       # 查看正在运行的容器
    $ docker stop nginx                  # 停止正在运行的容器
    $ docker start nginx                 # 启动一个已经停止的容器
    $ docker rm nginx                    # 删除容器
    

    映射HTML路径

    默认情况下,Docker nginx服务器的HTML路径(网站根目录)在容器 /usr/share/nginx/html 目录下,现在需要把这个目录映射到本地服务器的 ~/www/html 目录。在上面命令的基础上加上-v参数,具体如下:

    /Users/xiaohao/Desktop/www 左边是本机项目地址 : 右边是nginx容器的项目地址 /usr/share/nginx/html

    $ docker stop nginx                  # 停止正在运行的容器
    $ docker rm nginx                    # 删除容器
    $ docker run --name nginx -p 80:80 -d -v /Users/xiaohao/Desktop/www/:/usr/share/nginx/html -v nginx
    

    -v的参数格式为:<local-volumes>:<container-volumes>

    在/Users/xiaohao/Desktop/www 下新建 index.html

    (如果访问不到个别需要)注意:在终端上ifconfig 把ip复制到host

    在host文件中设置

    192.168.2.1 locohost 或者 192.168.2.1 127.0.0.1

    在浏览器上访问 http://localhost/或者本机ip地址/或者127.0.0.1,刷新一下就可以看到新的内容了。

    配置 Nginx

    Nginx 的强大很大部分体现在配置文件上,对于一些高级的应用来说,自定义 Nginx 非常重要。所以,我们需要把 Nginx 的配置文件复制到本地服务器目录:

    $ cd /Users/xiaohao/Desktop/www/config
    $ docker cp nginx:/etc/nginx/conf.d/default.conf default.conf
    

    再加一个-v参数,把本地的配置文件映射到容器上,在重启容器:

    $ docker stop nginx
    $ docker rm nginx
    $ docker run --name nginx -p 80:80 -v /Users/xiaohao/Desktop/www:/usr/share/nginx/html  -v /Users/xiaohao/Desktop/www/config/default.conf:/etc/nginx/conf.d/default.conf -d nginx
    

    如果配置文件有修改,需要重启容器生效:

    $ docker restart nginx
    

    这样就可以直接在本地修改配置文件了。

    4 部署PHP-FPM

    下载 PHP-FPM 镜像:

    $ docker pull php:fpm
    $ docker run --name php-fpm -p 9000:9000 -d php:fpm
    $ cd ~/www
    #复制www.conf到本地的www/config中
    $ docker cp php-fpm:/usr/local/etc/php-fpm.d/www.conf www.conf  
    #查看容器的  containerID
    $docker ps -a   
    #进入到正在运行的php-fpm容器中
    $docker exec -it containerID /bin/bash
    #进入到src中会看到2个压缩包
    root@e8f61e487bb6:/usr/src#cd /usr/src/
    root@e8f61e487bb6:/usr/src#ls -ll
    -rw-r--r-- 1 root root 11928820 Dec  4 18:40 php.tar.xz
    -rw-r--r-- 1 root root      850 Dec  4 18:40 php.tar.xz.asc
    #解压tar.xz文件:先 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后,再用 tar xvf xxx.tar来解包。
    root@e8f61e487bb6:/usr/src# xz -d php.tar.xz
    root@e8f61e487bb6:/usr/src#ls -ll
    -rw-r--r-- 1 root root 139786240 Dec  4 18:40 php.tar
    -rw-r--r-- 1 root root       850 Dec  4 18:40 php.tar.xz.asc
    root@e8f61e487bb6:/usr/src#tar xvf php.tar
    root@e8f61e487bb6:/usr/src#ls -ll
    drwxr-xr-x 14 1000 1000      4096 Dec  4 16:12 php-7.3.0
    -rw-r--r--  1 root root 139786240 Dec  4 18:40 php.tar
    -rw-r--r--  1 root root       850 Dec  4 18:40 php.tar.xz.asc
    exit;
    #回到宿主机的config文件夹中,把容器里面的php.ini复制下来
    $ docker cp php-fpm:/usr/src/php-7.3.0/php.ini-production php.ini
    

    在本地服务器修改 php.ini 的内容,设置cgi.fix_pathinfo=0(要先删除前面的;注释符):

    cgi.fix_pathinfo=0
    

    然后重新启动容器:

    $ docker stop php-fpm
    $ docker rm php-fpm
    $ docker run --name php-fpm --link mysql:mysql -v /Users/xiaohao/Desktop/www/:/usr/share/nginx/html  -v /Users/xiaohao/Desktop/www/config/www.conf:/usr/local/etc/php-fpm.d/www.conf -v /Users/xiaohao/Desktop/www/config/php.ini:/usr/local/etc/php-7.3.0/php.ini -d php:fpm
    

    这样PHP-FPM的容器就部署完成了。注意,要保证配置文件 php.ini 和 www.conf 没有错误,否则会无法启动容器。

    5 让Nginx容器支持FPM

    打开 nginx 的配置文件,修改内容如下:

    server {
        listen       80;
        server_name  _;
        root /usr/share/nginx/html;
        index index.php index.html index.htm;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/log/host.access.log  main;
    
        location / {
            #root   /usr/share/nginx/html;
            #index  index.php index.html index.htm;
    	try_files $uri $uri/ =404;
        }
    
        error_page  404  /404.html;
        location = /40x.html {
            root    /user/share/nginx/html;     
        }
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ .php$ {
            fastcgi_pass   php-fpm:9000;
            fastcgi_index  index.php;
    #        fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /.ht {
            deny  all;
        }
    }
    

    然后启动 nginx:

    $docker stop nginx
    $docker rm nginx
    $ docker run --name nginx -p 80:80 --link php-fpm -v /Users/xiaohao/Desktop/www:/usr/share/nginx/html -v /Users/xiaohao/Desktop/www/config/default.conf:/etc/nginx/conf.d/default.conf -d nginx
    

    在宿主机下的 /Users/xiaohao/Desktop/www下创建 index.php 文件,内容:

    <?php
        phpinfo();
    ?>
    

    在浏览器上访问 http://localhost/或者本机ip地址/或者127.0.0.1,刷新一下就可以看到新的内容了。

    参考资料:

    1. https://www.awaimai.com/728.html 参考这篇blog的,但是原作者写的有bug,我帮他改写了
    2. docker-lnmp: Dockerfiles for deploying applications of apporz.com anywhere](https://github.com/micooz/docker-lnmp)
    3. How To Run Nginx in a Docker Container on Ubuntu 14.04
    4. Legacy container links
    5. How To Install Docker on CentOS 6

    本文由博客群发一文多发等运营工具平台 OpenWrite 发布

  • 相关阅读:
    桥接模式(从多个角度对实现进行分类)
    单例模式
    组合模式(解决 树形 ,局部与整体关系)
    备忘录模式
    适配器模式
    状态模式
    StartUML建模及生成java实体代码
    JPA删除接口报错 : org.hibernate.LazyInitializationException: failed to lazily initialize a collection, could not initialize proxy
    idea创建的gradle项目没有src目录怎么办?
    idea spring源码 gradle编译失败问题
  • 原文地址:https://www.cnblogs.com/Jhaiha0/p/13328514.html
Copyright © 2011-2022 走看看