使用 docker 部署你的 Laravel 项目

使 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
本帖已被设为精华帖!
本帖由系统于 6年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 20
superwen

在配上docker-composer就更好了。类似php的composer,也很好用。

7年前 评论

@superwen 是的,下次的的分享会把docker-compose作为重点

7年前 评论
CMD [“/usr/bin/supervisord"]

这里写错了,前面的引号是",不是 。害得我build了也不能运行 [:cry: ]

6年前 评论

没有责怪的意思 是希望楼主更新下

6年前 评论

@Ahri 非常感谢你帮我指出的错误

6年前 评论

@bean 这个镜像能部署到阿里云的容器服务上吗?

6年前 评论

可以的,只要你的服务器有docker

6年前 评论

docker已接在centos上运行了,没有必要在安装ubuntu了把

5年前 评论

那问题来了,laravel队列呢

5年前 评论

@running-fly 这里的Ubuntu事指我的基础镜像

3年前 评论

@AlicFeng 不好意思,我已经转go语言很久了,没有研究过laravel自带的队列了,如果你使用kafka或者nsq什么的,也可以直接在dockerhub上找到对应的镜像,在你的代码里面配置就可以了

3年前 评论

QQ不存在啊

3年前 评论
bean (楼主) 3年前
HiDaddy (作者) 3年前

问一个小白问题大佬,为什么我的storage,我设置了chmod权限,但是每天有新的日志的时候,还是给我报错failed to open stream: Permission denied 我得每天进行chmod。你QQ号加不上,希望得到大佬的帮助,救救孩子吧:1217215022

3年前 评论
kai_wang 2年前

FROM webdevops/php-nginx

设置工作目录

WORKDIR /var/www

将当前目录下的文件拷贝到工作目录

COPY . . COPY .env .

安装 Laravel 的依赖包

RUN composer install

Nginx 配置相关

RUN rm -rf /etc/nginx/conf.d/* COPY nginx.conf /etc/nginx/conf.d RUN chmod -R 777 /var/www/*

CMD ["php", "artisan", "serve", "--host=127.0.0.1"]

EXPOSE 8081 这是我的Dockerfile文件

11个月前 评论

server { listen 8081; index index.php index.html; root /var/www/public;

location / {
    proxy_pass http://host.docker.internal:8000;
}

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:8000;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

}
这是我的nginx.conf文件

11个月前 评论

但是现在的问题是我使用postman访问该服务中的API接口报错Error: connect ECONNREFUSED 192.168.18.3:8081

11个月前 评论

有哪位大佬可以帮忙看看是什么原因?

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!