来源: 使用 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
,一个mySQL
的container
,一个redis
的container
,一个php-fpm
的container
,最后还有一个数据卷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-fpm
的container
处理,所以这里的php
就是php-fpm
的别名
OK,需要自定义的两个container
已经完成,下面另外两个,redis
, mySQL
就直接使用docker
官方提供的镜像。
直接使用命令拉下来吧:
docker pull docker.io/redis
docker pull docker.io/mysql
接下来比较重要,因为我们的
container
运行有依赖关系的,首先,php
运行需要link
到mysql
和redis
的,nginx
启动是要link
到php
上的,请允许我用依赖这个词来简单的说吧。所以首先要启动redis
,mysql
两个container
,再启动php
,等php
启动之后最后才能启动nginx
接下来我就用我学到的基础知识,来让你们把laravel
运行到docker
上吧
首先我们启动
redis
和mysql
,这里我必须说一下的是,这就是使用docker
的好处,如果你的mysql
,redis
突然崩溃,你可以不用担心数据有任何闪失,因为我们再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
有了redis
和mysql
,我们就可以启动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