樹莓派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\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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM