樹莓派raspberrypi系統安裝docker以及編譯nginx和php鏡像

前言

在樹莓派中搭建php環境,按正常流程通常是直接在系統中apt-get install相關的軟件,不過若是某天我想無縫遷移到另外一個地方,就又得在從新安裝一次環境。因此爲了方便,就直接在樹莓派中使用docker鏡像來構建環境,這樣之後在任意地方直接拉鏡像就能夠一鍵啓動環境。php

1.安裝docker

$ 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

 

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\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 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

相關文章
相關標籤/搜索