• 树莓派raspberrypi系统安装docker以及编译nginx和php镜像


    前言

    在树莓派中搭建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.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 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 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

    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: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
    " 
             "yaf.environ=product
    " 
             "yaf.use_namespace=1
    " 
             >> /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 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起来就搞定。

    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       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就可以访问了

    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

  • 相关阅读:
    ACM: Copying Data 线段树-成段更新-解题报告
    POJ 2488 A Knight's Journey
    POJ 3349 Snowflake Snow Snowflakes Hash
    POJ 2299 Ultra-QuickSort 归并排序、二叉排序树,求逆序数
    POJ 1035 Spell checker 简单字符串匹配
    POJ 3267 The Cow Lexicon 简单DP
    POJ 1459 Power Network 最大流(Edmonds_Karp算法)
    POJ 3687 Labeling Balls 逆向建图,拓扑排序
    HDU 1532 Drainage Ditches 最大流 (Edmonds_Karp)
    POJ 3026 Borg Maze bfs+Kruskal
  • 原文地址:https://www.cnblogs.com/oliverCJ/p/10832717.html
Copyright © 2020-2023  润新知