请选择您所在国家或地区的语言!

 热线电话:13588888888

基于Docker一键LNMP(Nginx+MySQL+PHP7/5+Redis)安装法式

本文摘要:一键部署LNMP情况的目的,该情况特点:完全开源支持多版本PHP切换(PHP5.4、PHP5.6、PHP7.2...)支持绑定任意多个域名支持HTTPS和HTTP/2PHP源代码位于host中MySQL data位于host中所有设置文件可在host中直接修改所有日志文件可在host中直接检察内置完整PHP扩展安装下令本站实际使用,确保100%可用实现一次设置,Windows、Linux、MacOs皆可用1 快速使用1、安装git、docker和docker-compose

od体育官网

一键部署LNMP情况的目的,该情况特点:完全开源支持多版本PHP切换(PHP5.4、PHP5.6、PHP7.2...)支持绑定任意多个域名支持HTTPS和HTTP/2PHP源代码位于host中MySQL data位于host中所有设置文件可在host中直接修改所有日志文件可在host中直接检察内置完整PHP扩展安装下令本站实际使用,确保100%可用实现一次设置,Windows、Linux、MacOs皆可用1 快速使用1、安装git、docker和docker-compose。2、使用git下载完整代码:$gitclonehttps://github.com/yeszao/dnmp.git3、用docker-compose下令启动容器,首次使用需要下载镜像,会稍慢:$docker-composeup4、然后在浏览器中会见localhost,就可以看到如下页面:5、源代码在:./www/site1/ 目录下。2 安装docker和docker-compose详细安装步骤:docker:https://docs.docker.com/engine/installation/docker-compose:https://docs.docker.com/compose/install/注意:Docker安装要求Linux 3.10以上版本,用uname -a下令可检察到。安装之后,可检察版本:$docker-v$docker-compose-v然后把当前用户加到docker用户组内里:$sudogpasswd-a${USER}docker就不用每次启动Docker都得加sudo了。

注意,执行gpasswd下令之后要重新登陆才有效。3 使用海内镜像堆栈在没有梯子的情况下,Docker默认从Docker Hub堆栈下载镜像,完整的LNMP镜像预计需要一两天时间。所以只能换个途径,好比使用阿里云的加速堆栈。

首先注册一个阿里云账号,然后会见阿里云的Docker镜像堆栈,能找到加速器地址。对于Docker 1.10+,打开设置文件 /etc/docker/daemon.json(没有时新建该文件):{"registry-mirrors":["https://6evg8u3r.mirror.aliyuncs.com"]}以上是我的加速地址。然后重启Docker Daemon:sudosystemctldaemon-reloadsudosystemctlrestartdocker就可以了。

Docker 1.10以下请看:https://yq.aliyun.com/articles/29941。4 目录说明大致框架如下:(图片使用UMLet绘制,下载原文件)4.1 目录结构目录结构如下:.├──docker-compose.yml容器启动设置文件├──DockerfilePHP-FPM构建设置文件├──conf设置目录│├──mysqlMySQL设置文件目录││└──my.cnfMySQL设置文件│├──nginxNginx设置文件目录││├──conf.d站点设置文件目录│││├──certsSSL认证文件、密钥和加密文件目录││││└──site2站点2的认证文件目录│││├──site1.conf站点1Nginx设置文件│││└──site2.conf站点2Nginx设置文件││└──nginx.confNginx通用设置文件│└──phpPHP设置目录│├──php-fpm.dPHP-FPM设置目录││└──www.confPHP-FPM设置文件│└──php.iniPHP设置文件├──log日志目录│├──mysqlMySQL日志目录│├──nginxNginx日志目录│└──php-fpmPHP-FPM日志目录├──mysqlMySQL数据文件目录└──www站点根目录├──site1站点1根目录└──site2站点2根目录4.2 站点部署本文有默认加了两个站点:www.site1.com(同localhost)和www.site2.com。要在当地会见这两个域名,需要修改你的hosts文件,添加以下两行:127.0.0.1www.site1.com127.0.0.1www.site2.com其中,www.site2.com为支持SSL/https和HTTP/2的示例站点。

因为站点2的SSL接纳自签名方式,所以浏览器有宁静提示,继续会见就可以了,自己的站点用第三方SSL认证证书替换即可。如果只用到站点1,把站点2相关的目录和设置文件删除:./conf/nginx/conf.d/certs/site2/./conf/nginx/conf.d/site2.conf./www/site2/重启容器内的Nginx生效:dockerexec-itdlnmp_nginx_1nginx-sreload4.3 HTTPS使用在容器中我们也是可以用HTTPS的,详细的设置请参考如下文件:./conf/nginx/conf.d/site2.conf如果是自签名,可以用廖雪峰提供的一个自动生成认证文件、私钥剧本:gencert.sh,这个剧本已经放在项目中,在这个目录下:./conf/nginx/conf.d/certs/site2/在Bash中输入:$./gencert.sh输入一次域名,和频频密码(内容随意)后,就会生成几个认证文件。其中自签名情况不需要.csr和.origin.key后缀的文件。

然后修改Nginx设置文件,设置SSL支持就可以了。5 docker-compose.yml文件如下是docker容器的运行设置docker-compose.yml的内容:nginx:image:nginx:alpineports:-"80:80"-"443:443"volumes:-./www/:/var/www/html/:rw-./conf/nginx/conf.d:/etc/nginx/conf.d/:ro-./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro-./log/nginx/:/var/log/nginx/:rwlinks:-php-fpm:fpmphp-fpm:build:.expose:-"9000"volumes:-./www/:/var/www/html/:rw-./conf/php/php.ini:/usr/local/etc/php/php.ini:ro-./conf/php/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw-./log/php-fpm/:/var/log/php-fpm/:rwlinks:-mysql:mysql-redis:redismysql:image:mysql:latestports:-"3306:3306"volumes:-./conf/mysql/my.cnf:/etc/mysql/my.cnf:ro-./mysql/:/var/lib/mysql/:rw-./log/mysql/:/var/log/mysql/:rwenvironment:MYSQL_ROOT_PASSWORD:"123456"redis:image:redis:latestports:-"6379:6379"这里我们用了nginx的alpine镜像,以及php-fpm和MySQL的最新镜像。这里默认加了redis容器,不需要的话可以把文件的最后4行以及php-fpm块下的- redis:redis删除。

5.1 为什么用nginx:alpine?因为相比nginx:latest,nginx:alpine有几点优势:用的是最新版nginx镜像,功效与nginx:latest一模一样alpine镜像用的是Alpine Linux内核,比ubuntu内核要小许多。nginx:alpine默认支持http2。Alpine的更多请看《Alpine Linux,一个只有5M的Docker镜像》。如要进入alpine容器,下令是(后面的路径不是/bin/bash):$dockerexec-itdnmp_nginx_1/bin/sh5.2 站点根目录挂载为什么站点根目录在Nginx和PHP-FPM都这样挂载?./www/:/var/www/html/我们知道,Nginx设置都有这样一项:fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;其中,$document_root就是server块下root所指的路径:server{#...root/var/www/html;#...}这里$document_root就是/var/www/html。

如果Nginx和PHP-FPM在同一主机,Nginx会通过9000端口把这个目录值和剧本URI传给PHP-FPM。PHP-FPM再通过9000端口吸收Nginx发过来的目录值和剧本URI,发给PHP剖析。PHP收到后,就到指定的目录下查找PHP文件并剖析,完成后再通过9000端口返回给Nginx。

如果Nginx和PHP-FPM在同一个主机内里,PHP就总能找到Nginx指定的目录。可是,如果他们在差别的容器呢?未做任那边理的情况,Nginx容器中的站点根目录,PHP-FPM容器肯定不存在。所以,这里需要保证Nginx和PHP-FPM都挂载了Host的./www/,而且都挂载在容器的:/var/www/html。(固然,你也可以指定此外目录,确保统一即可)5.3 修改docker-compose.yml文件之后?如果容器已经生成,转头再编辑docker-compose.yml,用docker-composeup下令会直接启动原来的容器,修改的内容不会体现在启动的容器里。

所以,要使修改的docker-compose.yml生效,需要以下4步:$dockerstopdnmp_nginx_1#第一步:停止容器$dockerrmdnmp_nginx_1#第二步:删除容器#!!第三步:重启Docker服务!!$docker-composeup-d--no-deps--buildmysql#第四步:重新启动容器其中最后一条下令参数作用:-d:后台执行--no-deps:不启动link的容器--build:启动容器前先构建镜像6 Dockerfile文件因为PHP-FPM构建稍微庞大,涉及到许多扩展。所以单独用Dockerfile文件构建PHP-FPM:FROMphp:fpm##Copysources.listtocontainer.##Hereweuse163.comsourceslist.##PHP5.6.31+shouldusejessiesourceslist##PHP7.2.0+shouldusestretchsourceslist##Formorepleasecheck:##PHPofficialdockerrepository:https://hub.docker.com/r/library/php/#COPY./files/sources.list.stretch/etc/apt/sources.list#COPY./files/sources.list.jessie/etc/apt/sources.list##UpdateUbuntuRUNapt-getupdate##mcryptRUNapt-getinstall-ylibmcrypt-devRUNdocker-php-ext-installmcrypt##GDRUNapt-getinstall-ylibfreetype6-devlibjpeg62-turbo-devlibpng12-devRUNdocker-php-ext-configuregd--with-freetype-dir=/usr/include/--with-jpeg-dir=/usr/include/RUNdocker-php-ext-install-j$(nproc)gd##IntlRUNapt-getinstall-ylibicu-devRUNdocker-php-ext-install-j$(nproc)intl##GeneralRUNdocker-php-ext-installzipRUNdocker-php-ext-installpcntlRUNdocker-php-ext-installopcacheRUNdocker-php-ext-installpdo_mysqlRUNdocker-php-ext-installmysqliRUNdocker-php-ext-installmbstring##...完整Dockerfile请移步本项目GitHub堆栈。7 nginx设置文件这里,我们还需要稍微修改nginx设置文件:location~.php${fastcgi_passfpm:9000;fastcgi_indexindex.php;includefastcgi_params;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;}这里,我们仅需把fastcgi_pass改成:fpm:9000。

也就是,PHP-FPM的侦听主机改成:Nginx links PHP-FPM容器的别名,在docker-compose.yml文件内里我们设置为fpm。这样Nginx容器启动的时候,就会自动修改自己的/etc/hosts,让fpm指向php-fpm容器的IP。修改之后,重启容器中的nginx:$dockerexecdlnmp_nginx_1nginx-sreload其中,dlnmp_nginx_1是容器的名称,也可以指定容器的ID。8 站点根目录写权限有时候,我们的PHP代码需要某个目录的写权限。

好比,Wordpress的wp-content/uploads目录,只有写权限我们才气正常上传文件。默认的,容器中的/var/www/html目录属于root,我们需要修改为www-data,PHP才气正常写目录。先进入到容器中:$dockerexec-itdlnmp_php-fpm_1/bin/bash然后修改目录权限:$chown-Rwww-data:www-data/var/www/html这样PHP就能正常读写目录了。

9 数据库9.1 使用MySQL在docker-compose.yml文件中,我们指定了MySQL数据库root用户的密码为123456。所以,我们就可以在主机中通过:$mysql-h127.0.0.1-uroot-p输入密码,就可以进入MySQL下令行。

说明:这里MySQL的毗连主机不能用localhost,因为MySQL客户端默认使用unix socket方式毗连,应该直接用当地IP。在PHP代码中的使用方式与在主机中使用稍有差别,如下:$pdo=newPDO('mysql:host=mysql;dbname=site1','root','123456');其中,host的值就是在docker-compose.yml内里指定的MySQL容器的名称。这是因为PHP代码是在FPM容器中,FPM容器启动时会自动在/etc/hosts中加上:172.17.0.2mysql11e55f91c4c3dlnmp_mysql_1就是说,mysql自动指向了MySQL容器动态生成的IP。

9.2 使用RedisRedis使用和MySQL类似。在主机和容器内部都通过地址127.0.0.1,端口6379会见。PHP则是跨容器会见,host参数用redis(links指定的名称),端口用6379。10 让DNMP随系统启动到这里我们用docker搭建的Docker (Linux) + Nginx + MySQL + PHP情况已经可以正常使用了。

但每次启动系统都得切换到项目目录,再执行compose up,就略显繁琐。要是能在系统启动的时候自动启动容器,岂不是更好,下面是详细的方法。

10.1 Ubuntu系统Unity桌面从Launcher中搜索Startup Applications(启动应用法式),然后Add一项,名字:Dnmp,下令填:docker-compose-f/home/gary/dnmp/docker-compose.ymlup-d其中,-f 指定docker-compose.yml文件的位置。然后生存即可。

10.2 其他Linux系统其他下令行下的Linux系统,可以直接编辑 /etc/rc.local 文件,加上上面的下令。


本文关键词:基于,Docker,一键,LNMP,Nginx+MySQL+PHP7,5+Redis,安装,od体育官网

本文来源:od体育官网-www.rehobothnm.com

Copyright © 2005-2021 www.rehobothnm.com. od体育官网科技 版权所有