在樹莓派中搭建php環境,按正常流程通常是直接在系統中apt-get install相關的軟件,不過若是某天我想無縫遷移到另外一個地方,就又得在從新安裝一次環境。因此爲了方便,就直接在樹莓派中使用docker鏡像來構建環境,這樣之後在任意地方直接拉鏡像就能夠一鍵啓動環境。php
$ 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
鏡像庫中已經有現成的nginx和php官方鏡像,也是開箱即用,不過咱們得增長一些配置和擴展,以便於本身的使用,因此咱們在官方鏡像的基礎上再編譯一個新的屬於本身專用的鏡像。
首先在raspberrypi上創建文件夾專門管理這些文件
$ mkdir -p ~/docker/rpi
在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
在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
鏡像有了,啓動就很簡單了,不過在啓動以前須要作些準備,由於,咱們鏡像中改變了默認的日誌,配置目錄,爲了方便管理,咱們使用掛載的方式,打通宿主機和容器之間的存儲,這樣之後直接在宿主機就能夠查看和修改一些重要內容
在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起來就搞定。
接下來咱們搭建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就能夠訪問了
至此,環境搭建已經完成,咱們能夠在樹莓派上輕鬆愉快的搭建本身的網站,若是有同窗不想構建鏡像,能夠直接拉取我已經構建好的,開箱即用
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