前言

在树莓派中搭建php环境,按正常流程一般是直接在系统中apt-get install相关的软件,不过如果某天我想无缝迁移到另一个地方,就又得在重新安装一次环境。所以为了方便,就直接在树莓派中使用docker镜像来构建环境,这样以后在任意地方直接拉镜像就可以一键启动环境。

1.安装docker

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sh get-docker.sh --mirror Aliyun

使用aliyun镜像下载安装,速度更快,脚本能自动识别arm架构,安装对应的架构版本

安装好后,可以执行下面语句查看docker版本

$ sudo docker version

如果不想切root去操作容器,可以将pi用户加进docker用户组

$ sudo usermod -aG docker pi

pi用户加进docker用户组后,就有权限查看和操作docker的所有容器,只是不能操作docker server

最后可以启动一个镜像来试试效果

$ docker run -it --rm hello-world

如果本地没有hello-world镜像,则会从官方镜像库拉取,而且会自动拉取arm版本的,执行成功后,应该会看到几段输出

备注:

树莓派是arm架构的,所以不能使用x86平台的镜像,在使用docker pull 拉取时,docker会自动根据当前架构去查找是否有架构匹配的镜像,所以,如果是自制镜像,则需要分平台编译,或者在x86平台使用QEMU虚拟机实现跨平台编译

查看当前架构的方法

$ uname -a

在树莓派的raspberrypi系统中执行,则会输出

Linux raspberrypi 4.14.-v7+ # SMP Tue Feb  :: GMT  armv7l GNU/Linux

可以看到我的树莓派是armv7

2.编译nginx和php的arm镜像

镜像库中已经有现成的nginx和php官方镜像,也是开箱即用,不过我们得增加一些配置和扩展,以便于自己的使用,所以我们在官方镜像的基础上再编译一个新的属于自己专用的镜像。

首先在raspberrypi上建立文件夹专门管理这些文件

$ mkdir -p ~/docker/rpi

2.1 编译nginx镜像

在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
EXPOSE

以下是对应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 ; ================================分割线=========================
# nginx.conf文件内容
worker_processes ; error_log /data/web_log/nginx_log/error.log warn;
pid /var/run/nginx.pid; events {
worker_connections ;
} 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 ;
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

2.2 编译php镜像

在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.2..dfsg- \
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. \
&& pecl install yaf-3.0. \
&& 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

3. 启动

镜像有了,启动就很简单了,不过在启动之前需要做些准备,因为,我们镜像中改变了默认的日志,配置目录,为了方便管理,我们使用挂载的方式,打通宿主机和容器之间的存储,这样以后直接在宿主机就可以查看和修改一些重要内容

在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 : -p : --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起来就搞定。

4.搭建pi-dashboard

接下来我们搭建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 ;
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/ =;
} location ~ \.php$ {
fastcgi_pass php:;
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就可以访问了

5.

至此,环境搭建已经完成,我们可以在树莓派上轻松愉快的搭建自己的网站,如果有同学不想构建镜像,可以直接拉取我已经构建好的,开箱即用

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

树莓派raspberrypi系统安装docker以及编译nginx和php镜像的更多相关文章

  1. Linux运维之docker虚拟化部署nginx

    一.Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱 ...

  2. Docker的安装和镜像管理并利用Docker容器实现nginx的负载均衡、动静分离

    Docker的安装 一.Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ...

  3. Docker 06 部署Nginx

    参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...

  4. Docker容器编译安装Nginx

    Docker容器编译安装Nginx,最简单的Nginx配置. 创建容器&进入容器 宿主机2080映射容器的80端口 [root@localhost ~]# docker run -i -d - ...

  5. 树莓派也跑Docker和.NET Core

    树莓派是什么 树莓派就是一个卡片大小的迷你电脑. 安装系统 有了电脑,我们当然得先安装系统. 系统下载 https://www.raspberrypi.org/downloads/raspbian/ ...

  6. docker完整配置nginx+php+mysql

    首先了解一个方法: 使用docker exec进入Docker容器 docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用: s ...

  7. docker部署mysql,nginx,php,并上传镜像到私有仓库

    前言 最近公司准备把现有环境全部搞成容器化,所以笔者就先了解了一下docker,并搞了一搞,并把自己搞的过程记录下来.话不多说直接开干 环境说明 Centos7 Docker version 18.0 ...

  8. 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群

    庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介      前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...

  9. Docker Alpine Dockerfile 安装nginx,最小镜像

    Docker Alpine Dockerfile 安装nginx,最小镜像 FROM alpine MAINTAINER will ## 将alpine-linux:apk的安装源改为国内镜像 RUN ...

随机推荐

  1. Building a Service Mesh with HAProxy and Consul

    转自:https://www.haproxy.com/blog/building-a-service-mesh-with-haproxy-and-consul/ HashiCorp added a s ...

  2. 奶牛抗议 DP 树状数组

    奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...

  3. 利用window.open如何绕过浏览器拦截机制

    在浏览器的安全机制里,非用户触发的window.open方法是会被拦截的,例如: var btn = $('#btn'); btn.click(function () { // 算做用户触发,所以不会 ...

  4. java学习笔记(5) 控制语句、键盘输入

    控制语句: java控制可以分为7种: *控制选择结构语句: *if  if else *switch *控制循环结构语句: *for *while *do while *改变控制语句顺序: *bre ...

  5. Ranger部署

    一.Apache Ranger是什么? Apache Ranger是一个框架,Hadoop上对于保护数据数据安全性的安全框架.用于在整个Hadoop平台上启用,监视和管理全面的数据安全性. 二.特性 ...

  6. TP5验证码上传阿里云万网虚拟主机后,验证码不显示的解决办法

    TP5不显示验证码 清除缓冲区就应该可以了,今天我刚好也遇到了,解决的办法是在vendor/topthink/think-captcha/CaptchaController.php中加上这个ob_cl ...

  7. D3.js的v5版本入门教程(第九章)——完整的柱状图

    D3.js的v5版本入门教程(第九章) 一个完整的柱状图应该包括的元素有——矩形.文字.坐标轴,现在,我们就来一一绘制它们,这章是前面几章的综合,这一章只有少量新的知识点,它们是 d3.scaleBa ...

  8. 记一次edusoho问题

    问题描述:Edusoho如何迁移到本地windows或另外一台Linux服务器上 解决问题步骤: 1.参考官方文档官方文档地址如下:http://www.qiqiuyu.com/my/course/3 ...

  9. @PathVariable不起作用,报错:Cannot resolve @PathVariable ' '

    @PathVariable是占位符注解.可以把Url中变量的值传递到方法参数中. 示例如下: @PostMapping("/user/name/{id}") @ResponseBo ...

  10. centos安装redis 5.0版本的集群

    我在本地VM-Centos里安装5.0.5时安装遇到了些问题,参考了Blog:https://www.cnblogs.com/shawhe/p/9548620.html 顺利安装完成. 安装redis ...