使用 docker 部署你的 Laravel 项目 | Laravel China 社区 – 高品质的 Laravel 和 PHP 开发者社区 – Powered by PHPHub

来源: 使用 docker 部署你的 Laravel 项目 | Laravel China 社区 – 高品质的 Laravel 和 PHP 开发者社区 – Powered by PHPHub

使 docker部署laravel项目

一.安装docker#

  • 一.安装docker
  • 二.下载镜像
  • 三. 自定义php镜像
  • 四. 运行自己的应用环境

    我使用的是centos 7.2,在centos下安装docker是件非常容易的事情,在命令行执行:

yum install docker

完成安装之后开启docker和加人开机自启动,可以使用 命令:

service docker start
chkconfig docker on

此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:

systemctl  start docker.service
systemctl  enable docker.service

看看你的docker安装结果,运行命令:

docker —version

显示以下提示,那么就恭喜你安装成功

Docker version 1.10.3, build cb079f6-unsupported

二. 下载镜像#

docker官方有dockerhub 提供安全切完善的镜像下载,而且docker提供了很方便的方式可以在docker客户端执命令即可。首先分析我们需要哪些docker镜像才能完成项目的部署。我们需要一个提供http服务的container,一个mySQLcontainer,一个rediscontainer,一个php-fpmcontainer,最后还有一个数据卷container,那么我们就需要去下载这些镜像,在命令行下可以使用docker search Images_name 去搜索你想要的镜像

首先pull 基础镜像Ubuntu的

docker pull docker.io/ubuntu

由于laravel框架使用php版本比较高,所以我建议大家都使用php7以上的版本,而且我这里使用了redis,需要安装redis扩展,PDO扩展,XML扩展等等,所以我决定自己build一个image。那么就开始吧

首先创建一个Dockerfile文件,输入以下内容

FROM ubuntu:latest

RUN apt-get update && apt-get install -y software-properties-common language-pack-en-base \
    && LC_ALL=en_US.UTF-8 add-apt-repository -y ppa:ondrej/php \
    && apt-get update \
    && apt-get install -y php-xml php7.0 php7.0-fpm php7.0-mysql mcrypt php7.0-gd curl \
       php7.0-curl php-redis php7.0-mbstring sendmail supervisor \
    && mkdir /run/php \
    && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

RUN sed -i -e 's/listen = \/run\/php\/php7.0-fpm.sock/listen = 0.0.0.0:9000/g' /etc/php/7.0/fpm/pool.d/www.conf \
    && sed -i -e 's/;daemonize = yes/daemonize = no/g' /etc/php/7.0/fpm/php-fpm.conf

WORKDIR /var/app

EXPOSE 9000

CMD [“/usr/bin/supervisord"]

除了Dockerfile以外,我们还需要一个supervisor 文件,放在Dockerfile同级目录。

那么就创建一个supervisor文件吧。内容如下:

[supervisord]
nodaemon = true
logfile = /var/log/supervisord.log
logfile_maxbytes = 10MB
pidfile = /var/run/supervisord.pid

[program:php-fpm]
command = php-fpm7.0
user = root
autostart = true
autorestart = true

这里我们的php-fpm镜像还没有完成,还需要build,输入命令:

docker build -t php7-fpm -f Dockerfile

另外一个需要自定义的镜像就是nginx,我就不废话那么多了,直接贴Dockerfile,另外我们需要加载一个nginx的配置和一个nginx网站的配置,玩过nginx的同学都懂啦。

FROM docker.io/nginx
RUN mkdir -p /var/app \
    && chown -R nginx:nginx /var/app
WORKDIR /var/app
COPY nginx.conf /etc/nginx/nginx.conf

接下来给你们分享一下我的nginx的配置和网站配置,nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;
    gzip_disable "MSIE [1-6].(?!.*SV1)";

    server_tokens off;
    include /etc/nginx/conf.d/*.conf;
}

请记住你上面设置的 user 因为dockerfile里面设置工作目录要讲nginx用户权限给它

继续给网站配置吧default.conf

server {
    listen 80;

    # 用真实的域名替换 “_”
    server_name your_domain_name;

    charset utf-8;

    root   /var/app/public;
    index  index.php index.html index.htm;

    gzip on;
    gzip_disable "msie6";
    gzip_types text/plain text/css text/xml text/javascript application/json
        application/x-javascript application/xml application/xml+rss application/javascript;

    error_page 404 = /index.php;

    access_log off;
    error_log /var/log/nginx/error.log crit;

    client_max_body_size 64m;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location /. {
        return 404;
    }

    location ~ \.php$ {
         include fastcgi_params;
         try_files $uri =404;

         fastcgi_pass php:9000;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
         fastcgi_read_timeout 300;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_index index.php;
    }

    location ~ /\.ht {
        deny  all;
    }
}

请注意,fastcgi_pass php:9000 ,这里不再是127.0.0.1:9000,因为你的php解析交给php-fpmcontainer处理,所以这里的php就是php-fpm的别名

OK,需要自定义的两个container已经完成,下面另外两个,redismySQL 就直接使用docker 官方提供的镜像。

直接使用命令拉下来吧:

docker pull docker.io/redis
docker pull docker.io/mysql

接下来比较重要,因为我们的container运行有依赖关系的,首先,php运行需要linkmysqlredis的,nginx启动是要linkphp上的,请允许我用依赖这个词来简单的说吧。所以首先要启动redismysql两个container,再启动php,等php启动之后最后才能启动nginx

接下来我就用我学到的基础知识,来让你们把laravel运行到docker上吧

首先我们启动redismysql,这里我必须说一下的是,这就是使用docker的好处,如果你的mysqlredis突然崩溃,你可以不用担心数据有任何闪失,因为我们再container外挂在了一个数据卷,什么事数据卷可以自己度娘,不多废话,直接上运行命令吧。

那就先启动mysql,我将mysql的data文件挂载到了宿主机上,这样就实时同步备份了container的数据

docker run -d —name=testmysql  -v /var/data:/var/lib/mysql MYSQL_ROOT_PASSWORD=testpassword  -e MYSQL_DATABASE=test_database docker.io/mysql

这里说明一下命令和参数是干嘛的,-d 是后台运行 --name=testmyql 是设置container名称,-v 是挂载宿主机到container -e 设置环境变量传递mysql密码 -e参数是可以多次使用
,例如:-v 前面是你宿主机的路径,冒号是你容器里的路径。

再启动redis,同样也挂载了redis的备份文件

docker run -d --name redis -v /var/www/mydoc/shares/dump.rdb:/data/dump.rdb docker.io/redis

有了redismysql,我们就可以启动php-fpm了

docker run -d --name php -v /var/www/mydoc/shares/:/var/app --link mysql:mysql --link redis:redis php-fpm

这里除了上面加的参数以外,我们使用了—link 这个是链接两个容器,使两个容器能够通信

最后我们运行nginx来提供http服务

docker run -d -p 80:80 -v /var/data/conf/:/etc/nginx/conf.d/ --volumes-from php —link php:php nginx

这里解释一下 --volume-from ,它的意思是数据来自php这个container

OK ,至此,容器基本上都启动完毕。当然,如何将网站跑起来,需要你自己思考,学习嘛。必须自己动动脑子,当然我这个也是比较基础的。希望大神看到勿喷。

欢迎加QQ:343125118 交流.

最后我也提供一下我已经构建好的镜像给大家使用,我已经放在dockerhub上了,不需要上面的dockerfile去构建,直接使用就可以:

docker pull docker.io/beandu/php7-fpm
docker pull docker.io/beandu/nginx
分享到: 更多 (0)