docker lnmp 多容器部署方案。完全基于 docker 官方镜像,遵循最佳实践,一容器一进程。

github 项目地址 https://github.com/March7/docker-lnmp

 

docker 基础

docker的基础用法请参考官方文档

中文文档参考

 

docker-compose

docker-compose 是用来管理编排多个容器协作的。

通过 docker-compose.yml 来编排 nginx、php、mysql 之间的通信和协作。

在 docker-lnmp 目录下通过命令 docker-compose up 启动容器

然后通过 localhost 或者 localhost:8000 就可以访问 index.php 了

 

docker-compose.yml 简单介绍

 

Mysql

先看 Mysql,因为这个 Mysql 镜像直接来自与官方,没有做任何修改。

    mysql: ### 容器名称
image: mysql:5.7 ### 官方镜像 版本号5.7
volumes:
- mysql-data:/var/lib/mysql ### 数据卷,mysql数据就存放在这里
ports:
- "3306:3306" ###端口映射,主机端口:容器对外端口
environment:
- MYSQL_ROOT_PASSWORD=123456 ### 设置环境变量,这个变量名是官方镜像定义的。

官方 Mysql 镜像构建参考

 

PHP

PHP 镜像也来自与官方,但是官方镜像并没有提供连接 Mysql 相关的 pdo_mysql 扩展,这里做了一点修改,所以不能直接用 image 来依赖官方镜像,需要单独写一个 Dockerfile 来自定义 PHP 镜像。

    php-fpm:
build:
context: ./php ### 自定义PHP镜像的配置目录
volumes:
- ./www:/var/www/html ### 主机文件与容器文件映射共享,PHP代码存这里
expose:
- "9000" ### 容器对外暴露的端口
depends_on:
- mysql ### 依赖并链接Mysql容器,这样在PHP容器就可以通过mysql作为主机名来访问Mysql容器了

自定义 PHP 镜像的配置文件 Dockerfile

### 来自官方的PHP镜像版本为7.1-fpm.
### 该版本只包含FPM不包括CLI,所以这里并不能执行composer
### 如果需要用PHP-CLI 需要再开一个CLI容器,或者安装同时包含FPM和CLI的版本
FROM php:7.1-fpm ### 设置环境变量
ENV TZ=Asia/Shanghai ### 执行bash命令安装php所需的扩展
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
### 这里是docker提供的安装php扩展的方法,在这里安装了pdo_mysql扩展还有GD库等
&& docker-php-ext-install -j$(nproc) iconv mcrypt mysqli pdo_mysql \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
### 扩展php.ini
COPY ./php.ini /usr/local/etc/php/conf.d/php.ini
 

Nginx

Nginx 需要配置一个 server, 所以也需要一点简单的定制

    nginx:
build:
context: ./nginx ### 自定义Nginx镜像的配置目录
volumes:
- ./www:/var/www/html 主机文件与容器文件映射共享,PHP代码存这里
ports:
- "80:80" ### 端口映射,如果你主机80端口被占用,可以用8000:80
- "443:443"
depends_on:
- php-fpm ### 依赖并连接PHP容器,这样在Nginx容器就可以通过php-fpm作为主机名来访问PHP容器了

自定义 Nginx 镜像的配置文件 Dockerfile

FROM nginx:1.11 ### 官方镜像

ENV TZ=Asia/Shanghai ### 环境变量

COPY ./nginx.conf /etc/nginx/conf.d/default.conf ### server配置

Nginx server 配置

server {

    listen 80 default_server;
listen [::]:80 default_server ipv6only=on; server_name localhost;
root /var/www/html;
index index.php index.html index.htm; location / {
try_files $uri $uri/ /index.php$is_args$args;
} location ~ \.php$ {
try_files $uri /index.php =404; ### 主要是这里用 php-fpm:9000来访问PHP容器
fastcgi_pass php-fpm:9000;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} location ~ /\.ht {
deny all;
} }
 

volumes 数据卷

数据卷独立与容器之外专门存放数据的

### 这里定义了mysql所用到的数据卷
volumes:
mysql-data:
 

php 测试代码

<?php
// 建立连接
try{
//这里的mysql:host=mysql,后面这个mysql就是我们的mysql容器
//用户名 root 是默认的
//密码 123456 就是我们在mysql容器设置的环境变量
$dbh = new PDO("mysql:host=mysql;dbname=mysql", "root", 123456);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$dbh->exec("SET CHARACTER SET utf8");
$dbh=null; //断开连接
}catch(PDOException $e){
print"Error!:".$e->getMessage()."<br/>";
die();
}
// 错误检查S
// 输出成功连接
echo "<h1>成功通过 PDO 连接 MySQL 服务器</h1>" . PHP_EOL; phpinfo(); ?>
 

如何部署 laravel

部署 laravel 要用到 composer 和 git 所以需要多部署一个 php-cli 容器 ,并安装 composer 和 git

github 源码没有该配置,需要手动添加一个。

php-cli 配置如下

    php-cli:
build:
context: ./php-cli
volumes:
- ../www:/var/www/html
tty: true

Dockerfile

FROM php:7.1-cli

COPY ./composer.phar /usr/local/bin/composer
RUN apt-get update && apt-get install -y git \
&& chmod 755 /usr/local/bin/composer

需要把 composer.phar 提前下载好,并放在 php-cli 目录下

 

进入容器

通过命令 docker exec -it dockerlnmp_php-cli_1 bash 进入容器来使用 composer 命令
dockerlnmp_php-cli_1 是 docker-compose 自动生成容器名称,你也可以自定义。
可以通过 docker-compose ps 来查看所有在运行的容器列表

docker-lnmp 多容器部署 Laravel 方案分享(转)的更多相关文章

  1. Docker之LNMP分布式容器部署

    Docker之LNMP分布式容器部署 目录 Docker之LNMP分布式容器部署 一.项目模拟 1. 项目环境 2. 服务器环境 3. 任务需求 二.Linux系统基础镜像 三.Nginx 1. 建立 ...

  2. 【开源社交系统研发日记】利用 Docker 包 Laradock 服务器部署 Laravel & ThinkSNS+ 等程序实战(多项目)

    什么是ThinkSNS+ ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+. 前段时间不知道抽上面疯 ...

  3. 利用 Docker 包 Laradock 服务器部署 Laravel & ThinkSNS+ 等程序实战(多项目)

    什么是ThinkSNS+ ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+.ThinkSNS V4. ...

  4. docker之swarm容器部署及运维

    1.概念 Docker Swarm 是 Docker 的集群管理工具.它将 Docker 主机池转变为单个虚拟 Docker 主机. Docker Swarm 提供了标准的 Docker API,所有 ...

  5. lnmp 环境下 部署 laravel 项目

    出现错误 Warning: require(): open_basedir restriction in effect. File(/xxxx/vendor/autoload.php) is not ...

  6. docker容器日志收集方案(方案N,其他中间件传输方案)

    由于docker虚拟化的特殊性导致日志收集方案的多样性和复杂性下面接收几个可能的方案 ​ 这个方案各大公司都在用只不过传输方式大同小异 中间件使用kafka是肯定的,kafka的积压与吞吐能力相当强悍 ...

  7. 容器部署解决方案Docker

      容器部署解决方案Docker 课程目标 目标1:了解Docker与虚拟机的不同点,相比的优势 目标2:掌握Docker的启动方法 目标3:掌握Docker镜像操作 目标4:掌握Docker容器操作 ...

  8. Docker容器服务发现方案

    一.      目的 在服务在容器中部署时,外部调用服务需要知道服务接口ip及端口号,这样导致部署时需要配置,从而增加部署的困难.本文档主要介绍如何使用ningx反向代理和consul进行自动化服务发 ...

  9. 服务器部署docker lnmp环境

    一.安装dockerDocker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上 1.uname -an 查看当前系统版本 2.yum -y install docker 下载 ...

随机推荐

  1. java 基础--8 种基本数据类型:整型、浮点型、布尔型、字符型 整型中 byte、short、int、long 的取值范围 什么是浮点型?什么是单精度和双精度?为什么不能用浮点型表示金额?

     一.8种基本数据类型(4整,2浮,1符,1布): 整型:byte(最小的数据类型).short(短整型).int(整型).long(长整型): 浮点型:float(浮点型).double(双精度浮点 ...

  2. windows与linux的文件路径

    在windows操作系统中,文件路径的分隔符是反斜杠(“\\”),例如: E:\\hsta\\pdf(这里为防止转义,所以要写成两个反斜杠) 但是在linux操作系统中,文件的分隔符是斜杠(“/”), ...

  3. 去重sort|uniq -d

    #!/bin/bash ############################################################### #Author :Bing # #Create ...

  4. LXML解析html代码和文件

    from lxml import etree text = """ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  5. FormsAuthentication.HashPasswordForStoringInConfigFile方法再.net core中的替代代码

    FormsAuthentication.HashPasswordForStoringInConfigFile()这个加密方法再.net core中不存在了,可以用下面的方式达到一样的加密效果 usin ...

  6. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)D(树状数组)

    //树状数组中数组的特性,有更巧妙的方法.//我们知道在树状数组中,对于数组tree[i],它所维护的区间为[i−lowbit(i)+1,i]//所以对于tree[2^i],它所维护的区间就为[1,2 ...

  7. scrapy shell中遇到的坑

    如果直接scrapy shell +网址  然后发现返回200 但是request和response的网址不同,那么可以使用百度短网址 https://dwz.cn/ 进行缩短.这样一般就能解决问题

  8. IntelliJ IDEA 破解之后,用了一段时间后,打开软件提示 no suitable licenses left on the license server

    IntelliJ IDEA 破解之后,用了一段时间后,打开软件提示 no suitable licenses left on the license server 需要让我们重新注册,原来是之前的地址 ...

  9. windows 10 遥控操作和传输文件

    传输文件命令 scp file user@192.168.1.1:/home/           file文件传到192.168.1.1/home/目录下 scp -r directory user ...

  10. Python 之并发编程之进程上(基本概念、并行并发、cpu调度、阻塞 )

    一: 进程的概念:(Process) 进程就是正在运行的程序,它是操作系统中,资源分配的最小单位. 资源分配:分配的是cpu和内存等物理资源 进程号是进程的唯一标识 同一个程序执行两次之后是两个进程 ...