资讯专栏INFORMATION COLUMN

【docker实操】使用docker部署一个laravel应用

quietin / 2696人阅读

摘要:最近部署上线一个项目,新的服务器,在生产环境安装配置等各种东西一大堆很麻烦。本文是我学习并使用部署项目的一个记录。另外我们可以部署不同版本的应用,例如,并且互不干扰。之后部署只需要移植镜像生成容器,就能保证环境的一致。需要使用三个镜像。

最近部署上线一个项目,新的服务器,在生产环境安装配置nginx、php、mysql、git、composer等各种东西一大堆很麻烦。docker已经火了一段时间,已经成了后端和运维的必备技能,之前老大也说要尝试下,于是就来体验一下docker的魅力。本文是我学习并使用docker部署项目的一个记录。

docker优势

docker的主要优势可以总结为:一次构建,到处部署。当我们使用docker构建好项目后,在开发环境、测试环境、生产环境都可以使用统一的镜像来部署,保证了环境的一致。并且docker支持linux、mac os、windows三大平台,代码运行在容器中,不受外部操作系统的影响,只和你的镜像有依赖关系。

另外我们可以部署不同版本的应用,例如mysql5.5、mysql5.7,并且互不干扰。

操作思路

关于docker的安装和相关概念在此都不赘述了,网上有很多资料,说下具体实施的思路。

正确的使用方式不是项目完成后才开始构建docker镜像,而是项目架构、依赖、环境确定了之后就构建和配置好docker镜像,之后代码的开发和运行都在容器之中。之后部署只需要移植镜像生成容器,就能保证环境的一致。

我这个项目很简单,只用到nginx、php、mysql这三件套,nginx使用php-fpm作为cgi解析器。需要使用三个镜像:nginx、php-fpm、mysql。为什么要用三个镜像而不是把这三个集成到一个大镜像中?这是docker推荐的做法,镜像之间尽量解耦,方便复用,避免臃肿的镜像,容器间通过网络连接起来。

官方提供了很多优质镜像,我们只需要挑选并基于官方镜像来配置就好。

构建镜像

完整文件详见我的github

nginx镜像

DockerFile:

FROM nginx:1.10

ADD nginx.conf /etc/nginx/nginx.conf
ADD site.conf /etc/nginx/conf.d/
ADD mkdir.sh /opt/

RUN chmod +x /opt/mkdir.sh && /opt/mkdir.sh

将基本配置和站点配置复制进去,用shell脚步来创建好log文件夹

php-fpm镜像

DockerFile:

FROM php:7.0-fpm

ADD apt-list /opt/

RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak  
    && cat /opt/apt-list > /etc/apt/sources.list  
    && apt-get update  
    && apt-get install -y 
        libfreetype6-dev 
        libjpeg62-turbo-dev 
        libmcrypt-dev 
        libpng-dev

RUN docker-php-ext-install -j$(nproc) iconv mcrypt 
        && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ 
        && docker-php-ext-install -j$(nproc) gd 
       && docker-php-ext-install pdo_mysql 
       && docker-php-ext-install zip
        
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 
        && composer config -g repo.packagist composer https://packagist.phpcomposer.com 

php镜像的是最麻烦的,要装系统依赖,php扩展,composer,还要设置环境变量。php扩展那块参考官方镜像dockr-hub-php

使用了apt,所以我们要修改apt源,官方php镜像是基于debian的,不是ubuntu的源。

dockerfile一个run建一层,这里建议apt install作为一层,安装php扩展作为一层,而不是都放在一层。这样的好处就是如果第二层php扩展装失败了,不用再跑一遍apt install。最后一层我们装上composer。

为了让php版本一致,我们应该调用php容器内的php作为cli:
docker run -it -v $PWD:/opt/code -w /opt/code my-php php -v

命令太长了,我们可以做个alias,在~/.bash_aliases中加入一行(注意最后空格):
alias myphp="docker run -it -v $PWD:/opt/code -w /opt/code --rm my-php "

我们在yourpath/opt/code下创建laravel应用,修改权限,注意在宿主机将你加入www-data group:

cd ~/docker-php/opt/code
myphp composer create-project --prefer-dist laravel/laravel .
sudo chown -R www-data:www-data . && sudo chmod -R 775 .
mysql镜像

DockerFile:

FROM mysql:5.7

mysql最简单,直接用官方的就行了

docker-compose启动容器

我们现在有三个镜像,如果一个个启动、连接、挂载很麻烦,官方提供了docker-compose工具,将配置写在一起,一键启动。

docker-compose.yml:

nginx:
    build: ./nginx
    ports:
      - "80:80"
    links:
      - "php"
    volumes:
      - ~/docker-php/opt:/opt

php:
    build: ./php
    ports:
      - "9000:9000"
    links:
      - "mysql"
    volumes:
      - ~/docker-php/opt:/opt

mysql:
    build: ./mysql
    ports:
      - "3306:3306"
    volumes:
      - ~/docker-php/opt/data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456

使用docker-compose up命令启动容器组:

启动访问 yourhost:80 可以看到熟悉的laravel欢迎页面:

进入mysql容器建个数据库建个表测试一下数据库连接:
docker exec -it dockerphp_mysql_1 bash

修改yourpath/opt/code/routes:

测试了一下报错:
SQLSTATE[HY000] [2002] Connection refused

google了一下,修改一下.env,把db_host改为你的ip:
DB_HOST=127.0.0.1 -> DB_HOST=yourhost

访问/mysql,页面输出,大功告成:

Reference:

docker入门到实践

Docker在PHP项目开发环境中的应用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27221.html

相关文章

  • docker实操使用docker部署一个laravel应用

    摘要:最近部署上线一个项目,新的服务器,在生产环境安装配置等各种东西一大堆很麻烦。本文是我学习并使用部署项目的一个记录。另外我们可以部署不同版本的应用,例如,并且互不干扰。之后部署只需要移植镜像生成容器,就能保证环境的一致。需要使用三个镜像。 最近部署上线一个项目,新的服务器,在生产环境安装配置nginx、php、mysql、git、composer等各种东西一大堆很麻烦。docker已经火...

    SunZhaopeng 评论0 收藏0
  • Laravel 教程 - 实战 iBrand 开源电商 API 系统

    摘要:最佳实践良好的编码规范单元测试持续集成文档,从一开始就形成良好的编码习惯。真实的电商业务所有的业务需求来自真实的客户,并且线上良好运营中。 重要通知: Laravel + 小程序的开源电商版本源码已经在 github 上拉,欢迎提交 issue 和 star :) 开源电商 Server 端: Laravel API源码 开源电商 client 端:小程序源码 iBrand 简介...

    iOS122 评论0 收藏0
  • 使用 Kubernetes 来部署你的 Laravel 程序

    摘要:有些人将其称为容器编排平台,而并非唯一的此类平台。但是在中,您可以快速扩展出多个实例你看看使用扩展你的网站是何其便捷。当你指向群集的地址和节点的端口号时,你就已经可见浏览器中正在运行的程序了。 showImg(https://segmentfault.com/img/remote/1460000017838786?w=1120&h=757); Laravel 是开发 PHP 应用程序的...

    JowayYoung 评论0 收藏0
  • 利用 Docker 包 Laradock 服务器部署 Laravel & ThinkSNS+

    摘要:能跑应用就不错了,周六想在服务器用试试部署开发环境。官网内测申请方式提供个人企业联系方式及认证信息实名企业营业执照照片或扫描件及申请说明,发送邮件至即可获得内测资格,申请从速。 前段时间不知道抽上面疯,买了一台低配的 ECS,配置就是 1m1u。能跑应用就不错了,周六想在服务器用 Laradock 试试部署开发环境。 安装 Docker 因为我的系统是 CentOS 7 并且对比 Do...

    idisfkj 评论0 收藏0

发表评论

0条评论

quietin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<