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