树莓派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 olivercjWORKDIR /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/*.confADD ./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_logEXPOSE 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-dataaccess.log = /data/web_log/php_log/access.logclear_env = no; Ensure worker stdout and stderr are sent to the main error log. catch_workers_output = yeslisten = 0.0.0.0:9000pm = dynamicpm.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
转载于:https://www.cnblogs.com/oliverCJ/p/10832717.html
树莓派raspberrypi系统安装docker以及编译nginx和php镜像相关推荐
- 树莓派raspberrypi系统安装jdk1.8环境
java官方下载地址 目录: 首先下载安装包 完成后开始配置环境 刷新配置 坑 首先下载安装包 剩下的流程就和常规linux一样 这里需要注意的是,一定要对应系统的bit规格 32位和64位不兼容 下 ...
- Docker的安装和镜像管理并利用Docker容器实现nginx的负载均衡、动静分离
Docker的安装 一.Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ...
- docker的安装和使用及镜像的制作与上传
安装及使用docker //安装docker源 [root@localhost ~]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# curl ...
- 树莓派原生系统安装ROS(含网络代理,ROS编译安装以及ROS小车制作过程)
本文将自主搭建树莓派ROS自主导航小车 目前已经完成的有: 1.树莓派初始化配置 2.树莓派局域网网络代理 3.树莓派ros安装 4.hector-slam安装 5.自制阿克曼底盘控制(python) ...
- 树莓派也跑Docker和.NET Core
树莓派就是一个卡片大小的迷你电脑. 有了电脑,我们当然得先安装系统. 系统下载 https://www.raspberrypi.org/downloads/raspbian/ ,我选择的Raspbia ...
- Docker部署Angular+Nginx+uwsgi+Django项目
Docker部署Angular+Nginx+uwsgi+Django项目 0.前言 在开发部署时,容易遇到服务器环境不一致,多台服务重复部署操作过于繁杂的情况.这时可以采用Docker来提供一套统一的 ...
- 华为平板安装python_教你用树莓派安装集成docker版openwrt、homeassistant等及一些排坑指南...
教你用树莓派安装集成docker版openwrt.homeassistant等及一些排坑指南 2020-04-30 18:45:28 30点赞 290收藏 23评论 小编注:此篇文章来自即可瓜分10万 ...
- Docker手动构建 nginx+py3+uwsgi环境
Docker手动构建 nginx+py3+uwsgi环境 前述 这里使用的阿里云服务器部署,云服务器ssh登陆成功后,如果几分钟没有操作的话,sshd会自动断开登陆,对于我们来说,在部署软件有时要等很 ...
- 一起来玩树莓派--解决官方docker源安装失败的问题
解决官方docker源安装失败的问题 问题描述 解决方法 问题描述 入手一块3B+准备参加一个边缘计算的比赛,需要在树莓派上面安装docker.但是安装脚本的一键安装docker总是失败,利用apt安 ...
- 树莓派的系统安装(简单易入手教程!!!)
树莓派的系统安装(简单易入手教程!!!) 感谢一位幽默的大佬将这技术传授与我,接下来我将把我的理解一 一还原,让大家也可以获取到这样一个很棒的技能,若文章中有什么错误或不足的地方,望大家包涵并指正,希 ...
最新文章
- php a标签 执行js,关于a标签不能调用js方法的小细节,你注意到了么?
- 【本站原创】台大林轩田《机器学习基石》系列课程教材的习题解答和实现
- iOS图片编辑功能实现
- Codeforces 338 D. GCD Table
- P1458 顺序的分数 Ordered Fractions(有技巧的枚举)+C++类封装=精简代码
- mysql php pdo_php PDO mysql写法
- 求数组的最大值php,求PHP数组最大值,最小值的代码
- spark学习-65-源代码:schedulerBackend和taskScheduler的创建(3)-local-cluster
- 你们这些程序员,真得每天都在读代码吗?
- 【排序算法】希尔排序-常规排序
- Oracle JRE 7 Update 51 (64 bit) or higher is required forPolybase failed解决办法
- goeasy连接初始化,vue
- 矿产资源勘查评价的新进展——GIS在矿产资源评价中的应用
- 周纪二 周显王元年(癸丑,公元前368年)——摘要
- AI科普文章 | 语音识别准不准?—— ASR 效果评测原理与实践
- 超实用,这是我见过最全面的python入门教程,高中生不要错过
- Windows Server 2003的32位企业版支持4G以上内存
- bm26 bm27 bm5
- 虹科教您 | KPA Automation softPLC入门操作指南(1)
- Find Zombies
热门文章
- CentOS安装NVIDIA Video Codec SDK
- JNI FindClass出错的一种特殊情况
- LINUX安装依赖库的解决办法
- Python3不需要uuid:导入/usr/local/lib/python3.x/site-packages/uuid.py提示if not 0 time_low 32L错误
- 管理感悟:深入理解软件
- gstreamer中查看有哪些元素以及元素的属性(参数)
- 升级WINDOWS 10的失败
- allure 测试报告本地打开_自动化测试报告太丑?信息实用的Allure Report测试报告拯救你...
- 服务器上怎么查询ubuntu版本信息失败,Ubuntu安装包信息如何查看
- python视频教程免费慕课网-python视频教程慕课 | 最好的python视频教程谁有