docker-lnmp 多容器部署 Laravel 方案分享

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 \
        libpng12-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 来查看所有在运行的容器列表

本帖已被设为精华帖!
本帖由系统于 1年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
liupeng

用官方轻量的系统alpine linux构建镜像,才能采纳到生产环境中,可以改改不

1年前

请问大佬 ,php-cli这个容器在这里起得所用是什么呢 。用php-fpm 那个不是也一样可以进行composer操作么

1年前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会