在树莓派中搭建php环境,按正常流程通常是直接在系统中apt-get install相关的软件,不过若是某天我想无缝迁移到另外一个地方,就又得在从新安装一次环境。因此为了方便,就直接在树莓派中使用docker镜像来构建环境,这样之后在任意地方直接拉镜像就能够一键启动环境。php
$ curl -fsSL https://get.docker.com -o get-docker.sh $ sh get-docker.sh --mirror Aliyun
使用aliyun镜像下载安装,速度更快,脚本能自动识别arm架构,安装对应的架构版本html
安装好后,能够执行下面语句查看docker版本mysql
$ sudo docker version
若是不想切root去操做容器,能够将pi用户加进docker用户组linux
$ sudo usermod -aG docker pi
pi用户加进docker用户组后,就有权限查看和操做docker的全部容器,只是不能操做docker servernginx
最后能够启动一个镜像来试试效果git
$ docker run -it --rm hello-world
若是本地没有hello-world镜像,则会从官方镜像库拉取,并且会自动拉取arm版本的,执行成功后,应该会看到几段输出github
备注:web
树莓派是arm架构的,因此不能使用x86平台的镜像,在使用docker pull 拉取时,docker会自动根据当前架构去查找是否有架构匹配的镜像,因此,若是是自制镜像,则须要分平台编译,或者在x86平台使用QEMU虚拟机实现跨平台编译redis
查看当前架构的方法sql
$ uname -a
在树莓派的raspberrypi系统中执行,则会输出
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux
能够看到个人树莓派是armv7
镜像库中已经有现成的nginx和php官方镜像,也是开箱即用,不过咱们得增长一些配置和扩展,以便于本身的使用,因此咱们在官方镜像的基础上再编译一个新的属于本身专用的镜像。
首先在raspberrypi上创建文件夹专门管理这些文件
$ mkdir -p ~/docker/rpi
在raspberrypi创建对应管理文件夹
$ cd ~/docker/rpi $ mkdir nginx $ cd nginx
首先是建立Dockerfile
$ touch Dockerfile
而后编辑文件写入构建语句
$ vim Dockerfile #若是没有vim可使用nano,或者手动安装vim #写入如下语句 # 依赖的基础镜像 FROM nginx:latest #建立者名称 MAINTAINER olivercj #建立日志目录 RUN mkdir -p /data/web_log/nginx_log # 添加fastcgi参数配置文件 ADD ./fastcgi.conf /etc/nginx # 修改原来的nginx配置 ADD ./nginx.conf /etc/nginx/nginx.conf #打开端口80和443 EXPOSE 80 EXPOSE 443
如下是对应fastcgi.conf和nginx.conf的文件内容,,都须要在Dockerfile的同级目录建立并写入
# fastcgi.conf文件内容 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param REQUEST_SCHEME $scheme; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
================================分割线=========================
# nginx.conf文件内容
worker_processes 1; error_log /data/web_log/nginx_log/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 /data/web_log/nginx_log/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; client_max_body_size 10m; proxy_connect_timeout 65s; proxy_send_timeout 65s; proxy_read_timeout 65s; #gzip on; include /data/webconfig/nginx/conf.d/*.conf; #include /etc/nginx/conf.d/*.conf; }
这里咱们修改了原来nginx默认的日志目录,默认虚拟机配置加载目录,增长了fastcgi参数配置文件,修改了默认的nginx配置文件
目的是为了后面方便挂载目录,之后查看日志,增长配置什么的都更方便。
如今配置什么的都准备好了,能够构建了,执行如下命令
$ docker build -t xxxx/my_nginx_arm:0.1 .
最后一个点千万不能省掉,他表示当前目录,命令执行后悔在当前目录查找Dockerfile文件,而后根据文件描述自动进行构建编译,当成功后会使用-t后面的设置给新的镜像命名,其中xxxx表示本身的仓库名,主要是为了推送到仓库方便,若是不带这个仓库名,后面要推送以前就必须执行一个docker image tag xxxx/my_nginx_arm:0.1,建立一个新的tag,因此咱们这里一步到位。因为本地没有nginx:latest镜像,因此第一步他会去官方镜像库下载。
等编译完成,执行
$ docker images
就能够看到已经编译好的新的镜像了,他的TAG为xxxx/my_nginx_arm:0.1 ,版本为0.1
在raspberrypi创建对应管理文件夹
$ cd ~/docker/rpi
$ mkdir php $ cd php
首先是建立Dockerfile
$ touch Dockerfile
而后编辑文件写入构建语句
$ vim Dockerfile #若是没有vim可使用nano,或者手动安装vim #写入如下语句 FROM php:7.1-fpm MAINTAINER olivercj WORKDIR /data RUN apt-get update && apt-get install --allow-downgrades -y \ zlib1g=1:1.2.8.dfsg-5 \ zlib1g-dev \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ && 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 bcmath calendar gettext mysqli pdo_mysql RUN pecl install redis-4.1.1 \ && pecl install yaf-3.0.5 \ && docker-php-ext-enable redis yaf RUN echo "yaf.use_spl_autoload=1\n" \ "yaf.environ=product\n" \ "yaf.use_namespace=1\n" \ >> /usr/local/etc/php/conf.d/docker-php-ext-yaf.ini RUN rm -rf /usr/local/etc/php-fpm.d/*.conf ADD ./php-fpm.conf /usr/local/etc/php-fpm.conf ADD ./www.conf /usr/local/etc/php-fpm.d/www.conf #ADD ./php.ini /usr/local/etc/php RUN mkdir -p /data/web_log/php_log EXPOSE 9000
如下是对应php-fpm.conf和www.conf的文件内容,都须要在Dockerfile的同级目录建立并写入。php.ini由于文件内容很长,这里不方便贴出,并且只是改动了一些时区,超时等配置,咱们能够在镜像启动后手动进入容器修改配置,因此这里就注释掉,不替换默认的配置
#php-fpm.conf文件内容 [global] daemonize = no error_log = /data/web_log/php_log/error.log include=etc/php-fpm.d/*.conf ===============分割线================ #www.conf文件内容 [www] user = www-data group = www-data access.log = /data/web_log/php_log/access.log clear_env = no ; Ensure worker stdout and stderr are sent to the main error log. catch_workers_output = yes listen = 0.0.0.0:9000 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 pm.status_path = /php-status
这里咱们依赖的是php-fpm7.1,若是须要其余Php版本,能够自行修改,同时也修改了原来php的默认日志目录,并且在dokcerfile中咱们增长了不少新的扩展,固然若是你有本身须要的其余扩展,也能够本身加进去,其中zlib1g这个须要注意,在debian不一样的系统版本中,对应的依赖版本号是不同的,当前zlib1g=1:1.2.8.dfsg-5 对应的是stretch版本系统。
准备好配置文件,就能够进行构建,执行如下命令
$ docker build -t xxxx/my_php-fpm71_arm:0.1 .
因为须要下载php镜像,还有安装扩展,可能会花费很是长的时间
编译完后一样执行docker iamges能够看到新的php镜像已经出如今列表中
镜像构建好只是存放在本地,在其余地方并不能直接拉取使用,因此须要存到远程仓库里,咱们能够直接使用官方仓库,,首先去https://hub.docker.com/注册帐号,建立本身的仓库,命令为xxxx,而后在raspberrypi系统中执行docker login,用刚注册的帐号密码登陆,登陆后就能够执行推送了
#推送nginx镜像 $ docker push xxxx/my_nginx_arm:0.1 #推送php镜像 $ docker push xxxx/my_php-fpm71_arm:0.1
镜像有了,启动就很简单了,不过在启动以前须要作些准备,由于,咱们镜像中改变了默认的日志,配置目录,为了方便管理,咱们使用挂载的方式,打通宿主机和容器之间的存储,这样之后直接在宿主机就能够查看和修改一些重要内容
在raspberrypi系统中执行
#建立php日志目录 $ sudo mkdir -p /data/web_log/php_log #建立Nginx日志目录 $ sudo mkdir -p /data/web_log/nginx_log #建立nginx虚拟机配置目录 $ sudo mkdir -p /data/webconfig/nginx/conf.d/ #建立代码存放目录 $ sudo mkdir -p /data/web_root
#修改目录及其子目录权限
$ sudo chown -R pi:pi /data
如今能够启动容器了
#启动php容器 $ docker run -itd -P --name php --restart always -v /data:/data xxxx/my_php-fpm71_arm:0.1 #启动nginx容器 $ docker run -itd -p 80:80 -p 443:443 --name nginx --link php --restart always -v /data:/data xxxx/my_nginx_arm:0.1
咱们必须按顺序先启动php容器,再启动nginx容器,由于nginx容器link了php容器,主要是为了方便容器间通讯,使nginx能够方便的发送fastcgi请求到php.
咱们使用-v命令挂载了宿主机的data目录。
到目前为止,整个php+nginx环境已经构建好了,下次若是换系统,只须要安装个docker,而后Pull相关镜像,直接run起来就搞定。
接下来咱们搭建pi-dashboard,做为在这套环境下搭建网站的例子
首先仍是在raspberrypi系统中,进入站点根目录
$ cd /data/web_root
咱们把这个目录做为全部网站的总的目录
拉取pi-dashboard代码
$git clone https://github.com/spoonysonny/pi-dashboard.git
拉取完成后,目录下会生成pi-dashboard的目录,里面就是咱们须要的代码
而后建立虚拟机配置
$ cd /data/webconfig/nginx/conf.d/
在这个目录下建立一个Pi-dashboard的虚拟机配置
$ vim pi-dashboard.conf #写入如下配置内容 server { listen 80; server_name pi-board.local.com; access_log /data/web_log/nginx_log/pi_access.log main; error_log /data/web_log/nginx_log/pi_error.log error; root /data/web_root/pi-dashboard/; location / { index index.php index.html index.htm; try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; include fastcgi.conf; } }
其中server_name 能够改为本身喜欢的域名,root指向刚刚拉取的代码的目录
保存后,为了使配置生效,须要从新nginx,有2种方式,1个就是直接重启容器,不过这种方式有点暴力,咱们一般仍是采用nginx的平滑重启来加载更新配置
nginx运行在容器中,因此有2种方式进行平滑重启
1.登陆到容器中,执行平滑重启
#登陆容器 $ docker exec -it nginx /bin/bash #登陆后,会切换到容器的bash中,执行如下命令 #检查配置合法性,若是没问题再执行下一条 $ nginx -t # 平滑重启 $ nginx -s reload
2. 直接在docker命令上执行,实际上是将登陆和执行串起来
#检查配置合法性,若是没问题再执行下一条
$ docker exec nginx nginx -t
#平滑重启
$ docker exec nginx nginx -s reload
nginx重启以后,整个网站搭建就完成了
这时若是咱们须要在我的电脑访问这个网站,就须要作hosts映射
linux/unix类系统在/etc/hosts中增长一条记录
x.x.x.x pi-board.local.com
x.x.x.x表示树莓派对应的IP地址,能够在raspberrypi中经过ifconfig获取
而后在我的电脑的浏览器中直接输入pi-board.local.com就能够访问了
至此,环境搭建已经完成,咱们能够在树莓派上轻松愉快的搭建本身的网站,若是有同窗不想构建镜像,能够直接拉取我已经构建好的,开箱即用
nginx: https://cloud.docker.com/u/olivercj/repository/docker/olivercj/ningx-arm
php: https://cloud.docker.com/u/olivercj/repository/docker/olivercj/php-fpm-arm