树莓派docker搭建lnmp环境

2017-11-04 17:10:02

    前面已经用docker搭建许多laravel环境了,这次尝试使用树莓派搭建可谓信心满满,可惜安装的过程中还是不可避免了踩了不少坑,特此从头记录一下。

    首先在控制台执行

    curl -fsSL get.docker.com -o get-docker.sh
    sudo sh get-docker.sh

    等待一段时间后,docker安装成功,然后执行

    sudo usermod -aG docker your-user
    newgrp - docker

    然后执行docker version 查看,显示docker信息,说明docker-ce已经正确无误的安装了。

    安装完以后,试着跑一下laradock,果然安装不成功,这是因为树莓派毕竟是卡片电脑,有一些镜像必须要量身去打造,所以我们只能自己去写Dockerfile文件啦。

    首先在某个可写目录下,新建三个文件夹,一个命名为docker,用来存放相应的Dockerfile文件,一个命名为wwwroot用来存放程序文件,最后一个新建为.data,用来存放数据库文件。我们在docker文件夹中新建docker-compose.yml文件内容为

    version: '2'

services:
  
### Applications Code Container #############################

    applications:
      image: tianon/true
      volumes:
        - /home/nosay/wwwroot:/var/www/html

### Applications Code Container #############################

    mysql:
      image: hypriot/rpi-mysql
      container_name: nosay_mysql
      volumes:
        - /home/nosay/.data:/var/lib/mysql
      environment:
        - MYSQL_DATABASE=muzilong
        - MYSQL_USER=muzilong
        - MYSQL_PASSWORD=Caonidaye0023
        - MYSQL_ROOT_PASSWORD=Caonidaye0023
      ports:
        - "3306:3306"
      networks:
        - backend
        
### PHP-FPM Container #######################################

    phpfpm:
      build:
        context: ./phpfpm
      container_name: nosay_phpfpm
      volumes_from:
        - applications
      ports:
        - "9000:9000"
      links:
        - mysql
      networks:
        - backend

### nginx Container #######################################

    nginx:
      build:
        context: ./nginx
      container_name: nosay_nginx
      volumes_from:
        - applications
      ports:
        - "80:80"
      links:
        - phpfpm
      networks:
        - backend         
              


### Networks Setup ############################################

networks:
  #frontend:
    #driver: "bridge"
  backend:
    driver: "bridge"

    在docker文件夹中建立nginx文件夹,放入Dockerfile文件,内容为

FROM nginx

MAINTAINER Nosay <admin@muzilong.cn>

COPY default.conf /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/nginx.conf

CMD ["nginx"]

EXPOSE 80 443

    其中,nginx.conf文件内容为

user  nginx;
worker_processes  1;
daemon off;

error_log  /var/log/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

    default.conf文件内容为

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /var/www/html/laravel/public;
        index  index.php index.html index.htm;
        try_files $uri $uri/ /index.php$is_args$args;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/html/laravel/public;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /var/www/html/laravel/public;
        fastcgi_pass   phpfpm:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/laravel/public$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

    然后在docker目录下,建立phpfpm文件夹,放入Dockerfile文件,内容为

FROM php:7.1-fpm

MAINTAINER Nosay <admin@muzilong.cn>


RUN docker-php-ext-install pdo_mysql

RUN apt-get update -yqq && apt-get install -y vim git zip unzip

EXPOSE 9000

    当然还要安装docker-compose 执行命令为:

sudo pip install -U docker-compose

  

    然后试执行

    docker-compose up -d

    执行起来比较慢,半天时间才把一个树莓派装好,其它的就简单多了,把镜像导出来然后再给别的树莓派就可以了。

    镜像导出命令:

    docker save 镜像id > 镜像.tar

    镜像导入命令:

    docker load < 镜像.tar

    

    如此这样操作,顺利的话就像博主一样,三台树莓派都装好了lnmp环境,这样我们试着用一台云服务器做下反向代理,并负载均衡一下看看。

    在云服务器中的nginx配置文件中写入

user www-data;
worker_processes  1;
pid /run/nginx.pid;
daemon off;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream backend {
    	#ip_hash;
        server 树莓派一ip:8441;
	server 树莓派二ip:8442;
	server 树莓派三ip:8443;
   	}
    server {
        listen       80;
        server_name  2;
        location / {
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
			 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             #禁用缓存
             proxy_buffering off;
             #反向代理的地址
             proxy_pass http://backend;     
        }
    }
}

    这样通过云服务器访问三次,得到以下界面

    这是树莓派1显示内容:

    image.png

    这是树莓派二显示内容:

    

    image.png

    

    这是树莓派三显示内容:

    image.png


    成功显示了三台树莓派中的内容,说明配置是正确无误的。此次操作加深了对docker的认识,也认识到对nginx配置不熟悉的不足,接下来会买一些书恶补一下nginx这块的知识,还是挺好玩的。