使用 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,一个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
关于 LearnKu
推荐文章: