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

来源:https://www.cnblogs.com/oliverCJ/archive/2019/05/08/10832717.html
-Advertisement-
Play Games

前言 在樹莓派中搭建php環境,按正常流程一般是直接在系統中apt-get install相關的軟體,不過如果某天我想無縫遷移到另一個地方,就又得在重新安裝一次環境。所以為了方便,就直接在樹莓派中使用docker鏡像來構建環境,這樣以後在任意地方直接拉鏡像就可以一鍵啟動環境。 1.安裝docker ...


前言

在樹莓派中搭建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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 該文章是系列文章 "基於.NetCore和ABP框架如何讓Windows服務執行Quartz定時作業" 的其中一篇。 可以訪問 "ABP模板" 創建項目 Demo.MyJob,ABP的模板是創建Web項目,而Topshelf所需的是Console項目。 Topshelf是什麼 Topshelf開源地 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。本系列痞子衡給大家介紹的是 飛思卡爾i.MX RTxxx系列微控制器相關知識 。 恩智浦半導體於2018年10月發佈的i.MX RTxxx系列開啟了ML/AI MCU的新紀元,其第一款晶元i.MX RT600,搭載一顆主頻高達300MHz的Cortex M33 ...
  • 對於生產環境,需以高可用的配置安裝 Rancher,確保用戶始終可以訪問 Rancher Server。當安裝在Kubernetes集群中時,Rancher將與集群的 etcd 集成,並利用Kubernetes 調度實現高可用。 ...
  • awk文本處理基於模式匹配檢查輸入文本,逐行處理並輸出通常用在shell腳本中,獲取指定的數據單獨用時,可對文本數據做統計 一、語法格式格式1:命令 | awk [選項] '[條件]{編輯指令}'格式2:awk [選項] '[條件]{編輯指令}' 文件..若有多條語句,可用分號分隔print是最常用 ...
  • 環境如下: 資源伺服器_1:192.168.10.10 centos 7 tengine 2.3.0 資源伺服器_2:192.168.10.129 centos 7 tengine 2.3.0 代理伺服器:192.168.10.130 centos 7 tengine 2.3.0 一、安裝tengi ...
  • 使用 jsvc 啟動tomcat(使用普通用戶運行) jsvc簡介 在生產中,tomcat應該以daemon的模式運行,而且如果需要以普通用戶的身份啟動tomcat,那麼就不能使用1024以下的埠,這是Liunx系統的限制,只有root用戶才能使用小於1024的埠。那麼該如何將tomcat配置成 ...
  • 首先感謝下github上大佬,我才能使用這個軟體。也可以直接瀏覽https://github.com/DoubleLabyrinth/navicat-keygen進行安裝,非常詳細。 1.https://www.navicat.com.cn/download/navicat-premium 根據自己 ...
  • 註:本文涉及到註冊表操作,不認識請不要隨意修改! 右鍵菜單項儲存在註冊表 中,一般各種程式的右鍵菜單項都可以在此項下麵找到; 添加右鍵菜單項 1. 右鍵單擊 ,`新建(N) 項(K)` ,創建一個新項(名字最好是功能相關); 2. 單擊新項,然後 雙擊 右側 值,寫入 內容(右鍵菜單項顯示的文本); ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...