在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 发布

Docker部署LNMP完整教程的更多相关文章

  1. Docker安装MySql完整教程、实操

    docker:官网 docker:镜像官网:        镜像官网可以所有应用,选择安装环境:会给出安装命令,例如:docker pull redis 默认拉取最新的版本(指定版本:docker p ...

  2. 【阿里云产品公测】阿里云ACE部署通用完整教程及评测

    [阿里云产品公测]阿里云ACE部署通用完整教程及评测 作者:阿里云用户bailimei ACE应该是目前在公测的服务中应用最广泛的一项服务.在公测云引擎ACE前曾使用过新浪SAE,而ACE给我的最初印 ...

  3. Docker部署lnmp 实战 (多注意配置文件,不管访问试试换个浏览器)

    Docker部署LNMP环境 关闭防火墙,设置自定义网络 systemctl stop firewalld systemctl disable firewalld setenforce 0 docke ...

  4. 使用 Docker 部署 LNMP 并搭建 wordpress

    准备 系统版本:CentOS Linux release 7.4.1708 (Core)   内核版本:3.10.0-693.el7.x86_64    IP:192.168.31.43    可访问 ...

  5. Centos7搭建Docker部署LNMP

    1.首先呢先更新yum源 yum update 2.1.安装docker存储库 yum install -y yum-utils \ device-mapper-persistent-data \ l ...

  6. Jenkins自动化部署最完整教程

    1.概述 Jenkins 是一个可扩展的持续集成引擎.主要用于持续.自动地构建/测试软件项目.监控一些定时执行的任务.Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行 ...

  7. CenOS7 docker部署lnmp环境

    Step1:下载lnmp镜像 [root@docker html]# docker pull winstonpro/lnmp Step2:启动lnmp镜像的docker实例 [root@docker ...

  8. docker部署LNMP架构

    环境要求: IP hostname 192.168.1.1 node1 项目规划: 容器网段:172.16.10.0/24 NGINX:172.16.10.10 MySQL:172.16.10.20 ...

  9. Jrebel热部署配置完整教程(IntelliJ IDEA、Jrebel、spring boot、springboot、eclipse、Tomcat)

    标签:IntelliJ IDEA.Jrebel.spring boot.springboot.eclipse.Tomcat1.安装插件并激活插件安装参考:http://blog.csdn.net/u0 ...

随机推荐

  1. Mac App破解之路九 vscode插件破解

    破解对象: luaide 破解目的:学习如何破解vscode插件 破解背景: vsscode用了这么多年,安装了很多插件,其中luaide插件是收费的.  说实话,100块并不贵, 我本来准备买的. ...

  2. vc++,MFC,组合框控件设置时0xC0000005: 读取位置 0x00000020 时发生访问冲突

    511.exe 中的 0x78bb5dec (mfc90ud.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000020 时发生访问冲突 _AFXWIN_INLINE int ...

  3. Module Error (from ./node_modules/eslint-loader/index.js):解决办法

    vue启动项目报如下错误: Failed to compile. ./src/components/Vcontent.vue Module Error (from ./node_modules/esl ...

  4. redis编译报错总结

    redis编译报错总结: 1.不能编译没有GCC 编译工具安装报错:问题1:make时可能会报如下错误cc -c -std=c99 -pedantic -O2 -Wall -W   -g -rdyna ...

  5. vue开发搭建(npm安装 + vue脚手架安装)

    一.概念 1.npm:  Nodejs下的包管理器. 2.webpack: 它主要的用途是通过CommonJS的语法,把所有浏览器端需要发布的静态资源,做相应的准备,比如资源的合并和打包. 3.vue ...

  6. java中值传递

    最近学基础的时候,老师讲了值传递和引用传递,这个问题一直不太明白,上网查了很多资料,按照自己的理解整理了一遍,发现之前不太明白的地方基本上想明白了,如有不正确的地方,欢迎指正,谢谢. 首先要说明的是j ...

  7. 【原创】Linux中断子系统(四)-Workqueue

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  8. python高阶-Linux基础命令集

    声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 1: 查看文件信息:ls ls常用参数: 参数 含义 -a 显示指定目录下所有子目录与文件,包括隐藏文件 -l 以 ...

  9. 看完这篇 HashSet,跟面试官扯皮没问题了

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  10. 洛谷 P2298 【Mzc和男家丁的游戏 】

    这道题还是挺水的,广搜模板题,注意一下细节就是了. :码代上上代码: #include <bits/stdc++.h> using namespace std; int n , m , s ...