西区代码小仓库 - 树莓派
type: channel
link: https://lisper517.top/tag/%E6%A0%91%E8%8E%93%E6%B4%BE/
items: 树莓派延时摄影
items: DNS与更换DNS
items: Docker树莓派实践——Pi Dashboard
items: Docker实践——用于小诊所的开源医疗记录系统
items: Docker树莓派实践——qbittorrent
items: Docker树莓派实践——portainer使用https
items: Docker树莓派实践——Typecho及其备份
items: Docker树莓派实践——frp（附dashboard开启https、frp双向验证）
items: Docker树莓派实践——LNMP
items: Docker入门（一）

树莓派延时摄影
type: item
date: 2023-05-01T05:40:00+00:00
description: 步骤/目录： 0.需求介绍与准备 1.延时摄影 （1）安装摄像头 （2）开启摄像头权限 （3）32位Pi OS （4）64位Pi OS （5）一些优化 （6）crontab设置 2.其它本文首发于个人博客https://lisper517.top/index.php/archives/83/，转载请注明出处。本篇文章的目的是使用树莓派进行延时摄影。本文实验日期为2023年5月1日。使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ）。本文主要参考了 这篇文章 和 这篇文章 。0.需求介绍与准备需要对种植的植物进行延时摄影，观察生长情况。购买树莓派官方摄像头，大概是pi camera 2，购买摄像头支架。另外树莓派最好使用UPS供电，连接到wifi。1.延时摄影（1）安装摄像头在树莓派断电状态下将摄像头排线接到树莓派。（2）开启摄像头权限在raspi-config中找到Interface Options -> Legacy Camera（Legacy Camera也可能只是Camera），允许打开摄像头。重启后，可以找到/dev/video0这个设备，说明摄像头已准备就绪。（3）32位Pi OS在32位版本的Pi OS里，自带了raspistill命令用于拍照、raspivid用于视频，不过发布64位的Pi OS以后官方已开始慢慢舍弃这2个命令（也可能是64位系统还未加入这些非核心功能？）。树莓派使用摄像头的方法主要有3种：a.raspistill、raspivid命令，32位系统b.python，picamera库c.python，opencv库如果你使用的是32位的Pi OS并安装了python，可以如下使用picamera库来调用摄像头（笔者未实践）：pip install picamera mkdir ~/mybash/python nano ~/mybash/python/time_lapse_photo.py写入如下内容：#!/usr/bin/python from picamera import PiCamera if __name__=="__main__": camera=PiCamera() camera.capture("/temp/test.jpg")如果运行正常，应该可在/temp下找到test.jpg，之后使用crontab定时即可。（4）64位Pi OS笔者使用的是64位系统，from picamera import PiCamera时出现如下报错：OSError: libmmal.so: cannot open shared object file: No such file or directory据说这是因为这个.so文件没有64位的版本。不过也可以使用opencv库来操作摄像头：apt install python3-opencv mkdir ~/mybash/python nano ~/mybash/python/time_lapse_photo.py写入如下内容：#!/usr/bin/python import cv2 as cv # 读取设备 cap = cv.VideoCapture('/dev/video0', cv.CAP_V4L) # 设置分辨率 cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920) cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080) # 截图 ret, frame = cap.read() if ret: cv.imwrite('/temp/test.jpg', frame) # 必须释放摄像头 cap.release()此时可以在/temp目录下找到test.jpg，说明已经可以使用摄像头了。（5）优化及定时运行延时摄影在后期处理时需要使用图片生成视频。在参考文章中提到摄像头在晚上拍摄的图片太黑看不清，笔者修改后的python脚本如下（需要pip install numpy）：#!/usr/bin/python import cv2 as cv import numpy as np import time, os, shutil RESO = (1920, 1080) #图片和视频分辨率 IMG_DIR = r'/temp/test_photoes' #图片存放目录 IMG_DIR_NAS = r'/temp/photoes' #NAS上图片存放目录 IMG_DIR_ORDERED = r'/temp/ordered' #排序后图片存放目录 VIDEO_DIR = r'/temp/te…

DNS与更换DNS
type: item
date: 2022-08-27T07:20:00+00:00
description: 步骤/目录： 1.常用DNS 2.更换DNS 3.添加解析记录本文首发于个人博客https://lisper517.top/index.php/archives/37/，转载请注明出处。本文的目的是为树莓派更换DNS。本文实验日期为2022年8月27日。本文使用的树莓派为 4B 8GB 版，系统镜像是Pi OS的64位桌面版，名为 2022-04-04-raspios-bullseye-arm64.img 。1.常用DNSDNS，即 Domain Name Server（域名服务器），是可以将域名与IP进行转换的服务器。ip地址是xxx.xxx.xxx.xxx的格式、由数字组成，而我们访问网页时的域名显然更好记一些，但最终域名必须转换成ip，网络请求才能找到目的地，这就是DNS发挥作用的地方。DNS也需要通过ip访问，下面是一些常用的DNS（排名表示推荐程度）。国外：（1）Cloudflare DNS 1.1.1.1 1.0.0.1 2606:4700:4700::1111 #IPv6的DNS 2606:4700:4700::1001 （2）谷歌 8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844 （3）微软 4.2.2.1 4.2.2.2 （4）Norton ConnectSafe 199.85.126.10 199.85.126.20 199.85.126.30 199.85.127.10 199.85.127.20 199.85.126.30 （5）OpenDNS 208.67.222.222 208.67.220.220 （6）DNS Watch 84.200.69.80 84.200.70.40 （7）Comodo安全DNS 8.26.56.26 8.20.247.20 （8）威瑞信 64.6.64.6 64.6.65.6 （9）OpenNIC 192.95.54.1 192.95.54.3 （10）GreenTeamDNS 81.218.119.11 209.88.198.133国内：（1）114DNS（http://www.114dns.com/） 114.114.114.114 114.114.115.115 （2）腾讯（https://www.dnspod.cn/Products/Public.DNS） 119.29.29.29 182.254.118.118 （3）阿里（http://alidns.com/） 223.5.5.5 223.6.6.6 （4）百度（http://dudns.baidu.com/intro/publicdns/） 180.76.76.76 （5）CNNIC（http://www.sdns.cn/） 1.2.4.8 210.2.4.82.更换DNSDNS其实起到一个指路的作用，当你访问域名时指向对应的ip。但是有时候可能因为一些原因，DNS故意或无意间指错路了，就被称为 DNS污染 、 DNS劫持 ，这会让我们无法访问到正确的服务器，非常的危险。更换DNS为一些靠谱的DNS可以一定程度上规避这个问题。下面就以google的 8.8.8.8 和 8.8.4.4 为例，展示如何更换为这两个DNS。（0）路由器更换DNS登录路由器后台，一般都可以手动设置DNS，这样最方便。（1）windows系统在 设置 - 网络和Internet - 以太网 - （右上角）更改适配器选项 ，这里可以看到自己的网络连接，可能有无线、有线连接，看一下自己目前用的哪个网络，左下角没有红色叉的是正在使用的网络。对正在用的网络单击鼠标右键，点击 属性 ，点击下面的框里的 Internet协议版本 4 (TCP/IPv4) ，点击右下的 属性 - 常规 - 使用下面的DNS服务器地址 ，填入谷歌DNS。这实际上是设置了单个网络连接的DNS。如果同时使用有线、无线连接，最好把两个网络连接的DNS都设置一下；如果到新的地方、连接到新的网络，则也需要同样更改新网络连接的DNS。（2）linux系统（以树莓派为例）linux系统里一般都可以通过更改 /etc/resolv.conf 这个文件来更改DNS，具体的方法是在这个文件末尾加上：nameserver 8.8.8.8 nameserver 8.8.4.4并把原来的 nameserver 192.168.1.1 等之类的行删掉，或者也可以不删。但是这只是临时更改DNS，因为 /etc/resolv.conf 这个文件在每次开机后里面的内容都会由系统根据系统设置重写，所以开机后原来的设置就会丢失。不过一般这个文件前面的注释里都会提示如何永久更改DNS，像树莓派的这个文件，注释只有一行：# Generated…

Docker树莓派实践——Pi Dashboard
type: item
date: 2022-08-27T05:47:00+00:00
description: 步骤/目录： 0.Pi Dashboard简介 1.LNP部署Pi Dashboard本文首发于个人博客https://lisper517.top/index.php/archives/36/，转载请注明出处。本文的目的是使用docker、docker-compose在树莓派上运行Pi Dashboard。本文实验日期为2022年8月27日。本文使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ）。0.Pi Dashboard简介在windows系统中，可以用任务管理器便捷地查看电脑的CPU、显卡等使用情况；对于树莓派，这样的信息收集起来比较麻烦，好在有大神开发了Pi Dashboard，这是一个网页查看树莓派状态的工具，详细介绍在 https://make.quwj.com/project/10 。简单来说Pi Dashboard的部署和Typecho类似，也是放在nginx的文件夹里、搭配php使用，不同点是不需要mysql。1.LNP部署Pi Dashboard这里用docker-compose运行nginx、php服务，最后把Pi Dashboard放在nginx的网页根目录下即可。在树莓派上进行如下操作：mkdir -p /docker/pi_dashboard/conf/nginx mkdir /docker/pi_dashboard/www mkdir /docker/pi_dashboard/ssl_cert docker pull nginx:1.23.1 docker pull php:8.1-fpm nano /docker/pi_dashboard/conf/nginx/default.conf写入以下内容：server { listen 50443 ssl; server_name www.lisper517.top; ssl on; ssl_certificate /ssl_cert/.pem文件名; ssl_certificate_key /ssl_cert/.key文件名; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { index index.html index.htm index.php default.html default.htm default.php; root /var/www/html; } location ~\.php$ { fastcgi_pass php:9000; fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name; include fastcgi_params; } error_page 497 https://$host:50443$request_uri; }这是使用https的配置，注意更改 www.lisper517.top 和ssl证书的两个文件名。如果只使用http，则写入如下内容：server { listen 50443; location / { index index.html index.htm index.php default.html default.htm default.php; root /var/www/html; } location ~\.php$ { fastcgi_pass php:9000; fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name; include fastcgi_params; } }但是要注意，无论使用http还是https，都尽量不要把这个页面开放到公网。然后编写compose模板：nano /docker/pi_dashboard/docker-compose.yml写入如下内容：version: "3.9" services: nginx: image: nginx:1.23.1 ports: - "50443:50443" volumes: - /docker/pi_dashboard/conf/nginx:/etc/nginx/conf.d - /docker/pi_dashboard/…

Docker实践——用于小诊所的开源医疗记录系统
type: item
date: 2022-08-08T13:53:00+00:00
description: 步骤/目录： 0.准备工作 （1）购买并设置树莓派 （2）购买并设置服务器 （3）准备软件 1.方法一：docker + openmrs 2.方法二：gnuhealth 的树莓派系统 3.方法三：gnuhealth 直接安装（无法使用） 4.了解：新致“开源”医疗 附录：通过公网访问EMR或HIS本文首发于个人博客https://lisper517.top/index.php/archives/29/，转载请注明出处。本文的目的是搭建一个可用于小诊所的电子病历系统，省去一笔开支费用。有些方法中会用到docker、docker-compose。本文实验日期为2022年8月7日。本文使用的云服务器为阿里云轻量应用服务器（杭州），系统镜像为 Docker 19.03；树莓派为 4B 8GB 版，系统镜像是Pi OS的64位桌面版，名为 2022-04-04-raspios-bullseye-arm64.img 。笔者有医学背景，最近需要一个电子病历系统。医疗方面的电子化，可分EMR（electronic medical record）和HIS（hospital information system），EMR侧重于电子病历，而HIS侧重于使用计算机技术对整个医院进行管理，HIS包括EMR，HIS也难得多。但是如果只是想拥有一个私人的电子病历系统，或者开小诊所想使用电子病历，那么可以考虑使用一些开源的EMR或HIS（界面都是全英文的，但是一直用就熟练了，可以输入中文）。当然，这里的电子病历比较简陋，只是起到一个记录、方便查阅（相较于纸质病历）的作用，一般不应起法律效力。如果是单纯的医生、并不懂计算机技术，可以只看这篇文章，遇到中间的注释不懂的，如果没有实际影响可以跳过不看。如果对计算机技术感兴趣的，可从笔者的第一篇文章看起，这里用到的所有技术都能通过之前的文章学会。最后需要说明，下文中的所有方法，是让EMR或HIS在树莓派（一种微型电脑）上运行，服务器只提供一个公网ip、方便公网访问，如果只是在局域网中用（比如说自己开诊所，把树莓派放到诊所里面运行）就可以不买服务器；如果是上班时间摸鱼，想把病人记在自己的私人病历上，而且上班地方的电脑能连接外网，这种情况就可以买一个服务器。另外，以下的这些方法仅供娱乐，如果真的自己开诊所，建议找一些免费的病历系统用，付费的其实也不贵，1000￥/年差不多了。0.准备工作准备工作中，需要购买并设置树莓派；购买服务器，对服务器进行一些初始设置；在自己的电脑上准备相关软件。下文中出现的一个或多个X，一般指代不同的变化的数字。（1）购买并设置树莓派树莓派的详细介绍可参考 树莓派型号、参数与作用 （笔者之前的文章，赶时间的可以不看），粗略来说树莓派是一种便宜的微型电脑，可以用来运行一些任务。购买渠道上，建议到淘宝搜索 树莓派4B ，购买内存4GB或8GB版的，8GB版的目前（2022年8月）淘宝最便宜的是900￥左右，另外需要购买一个树莓派外壳（挑一个外观好看的）、树莓派官方电源、2张64GB的sd卡（2张以备不时之需）、1个读卡器（用于电脑读取sd卡），大概总成本在1100￥（8GB版）或900￥（4GB版）。另外还应该有一台自己的笔记本或台式机（这里需要是装windows系统，因为有些软件就是windows下运行的）。收到东西后，组装一下，把树莓派装进外壳，插上 type C 电源线，此时先不插sd卡。现在要准备一些软件。到 这个网址 下载树莓派的官方刻录工具（用于把树莓派的操作系统写入sd卡），下载的文件名为 imager-1.X.X.exe ，其中 1.X.X 是版本号，选最新的版本，下载完成后安装；点击 这个网址 下载树莓派的操作系统，下载的文件名为 20XX-XX-XX-raspios-bullseye-arm64.img.xz ，然后用7z或rar等软件把它解压成 .img 文件。sd卡插上读卡器、连接到自己的电脑，打开官方刻录工具，操作系统选择 使用自定义镜像 ，找到刚才下载的镜像；sd卡选择插上的sd卡（如果同时连了其他U盘，注意不要选到这些其他的设备），点击右下角的齿轮图标（设置），勾选 开启SSH服务 ，在下面的 Set username and password 里设置一个自己喜欢的用户名及密码（后续还要设置很多的密码，笔者建议所有的地方都用同一个密码，这个密码要8个字符以上，同时包含大小写字母和数字），勾选 配置WiFi ，输入自己的wifi名和密码（如果用网线直连树莓派，则可以不设置wifi。推荐用网线直连），点击保存，点击烧录，等待一会儿。之后弹出sd卡（烧录工具会自动弹出sd卡）并拔下读卡器、sd卡，把sd卡插到树莓派上（方向不要插反了，有金手指的一面朝向树莓派板），连上电源即开机…

Docker树莓派实践——qbittorrent
type: item
date: 2022-08-01T12:41:00+00:00
description: 步骤/目录： 1.编写compose模板 2.运行并验证本文首发于个人博客https://lisper517.top/index.php/archives/25/，转载请注明出处。本文的目的是使用docker、docker-compose在树莓派上运行qbittorrent。本文实验日期为2022年8月1日。本文使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ）。之前的文章中曾提到过qbittorrent，详见 树莓派+Samba+frp搭建NAS（网络云存储） 。简单来说，qbittorrent的作用是离线下载，一般搭配NAS使用。在docker官方仓库网页进行搜索，最后笔者选用的是linuxserver/qbittorrent镜像，其下载量为100M+，一个月前更新。1.编写compose模板如前所述，笔者使用树莓派+samba搭建了NAS，挂载一块硬盘到分享目录，路径为/home/samba_user/shared。如果没有NAS也无所谓，但由于树莓派本身存储较小，最好还是外接存储。另外，samba目前在官方仓库没有下载量大的官方镜像，所以仍然是直接在本地跑。在树莓派上进行如下操作：docker pull linuxserver/qbittorrent mkdir -p /docker/qbittorrent/conf mkdir /docker/qbittorrent/ssl_certificate id samba_user #这里的samba_user是为samba创建的系统用户 #输出uid=1002、gid=1003 nano /docker/qbittorrent/docker-compose.yml写入以下内容：version: "3.9" services: qbittorrent: image: linuxserver/qbittorrent environment: - PUID=1002 - PGID=1003 - TZ=Asia/Shanghai - WEBUI_PORT=8080 volumes: - /docker/qbittorrent/conf:/config - /home/samba_user/shared/DLs:/downloads - /docker/qbittorrent/ssl_certificate:/ssl_certificate ports: - "8080:8080" - "6881:6881" - "6881:6881/udp" restart: unless-stopped这里需要解释一下docker-qbittorrent的注意事项。PUID、PGID用于指定一位宿主机系统用户，该用户需要拥有宿主机的下载目录（本例中为/home/samba_user/shared），这样才不会有读写权限的问题，使用 id 用户名 可查看uid、gid。2.运行并验证cd /docker/qbittorrent docker-compose config docker-compose up若要后台运行docker-frpc，可使用docker-compose up -d命令。这时使用ufw打开8080、6881端口，即可浏览器登录到 树莓派ip:8080 ，出现qbittorrent网页UI，初始用户名密码为admin和adminadmin。在顶部工具栏下方，右边的齿轮图标为设置。接下来对qbittorrent进行一些初始设置：在 Web UI 中将语言改为中文；在 下载 中，将 默认Torrent管理模式 改为自动，勾选 保存未完成的torrent到 、 复制.torrent文件到（这两个目录自选），下面的 下载完成时发送电子邮件到 用的也是SMTP、有需要的可以打开， Torrent完成时运行外部程序 也可根据自身需要打开；在 速度 中，可以选择下载速度限制；在 BitTorrent 中，可调整最大同时下载数；在 Web UI 中，可设置使用HTTPS，修改用户名密码。

Docker树莓派实践——portainer使用https
type: item
date: 2022-07-29T15:58:00+00:00
description: 步骤/目录： 1.准备工作 2.运行并测试 3.其他方式本文首发于个人博客https://lisper517.top/index.php/archives/23/，转载请注明出处。本文的目的是使用docker在云服务器上运行portainer，并使得其网页UI只能使用https访问。本文实验日期为2022年7月29日。本文使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ）。云服务器为阿里云的轻量应用服务器，镜像为Docker 19.03。之前的文章中曾介绍过使用https访问frp的dashboard，详见 Docker树莓派实践——frp（附dashboard开启https、frp双向验证） 。上次生成的server.crt和server.key在本文中也会用到。本文主要参考了 portainer的官方文档 。1.准备工作首先需要生成自己的.crt和.key文件。这里和 Docker树莓派实践——frp（附dashboard开启https、frp双向验证） 中一模一样，同样参考了 gofrp文档 。在树莓派上进行以下操作：mkdir /home/pi/ssl_cert #或者在其他文件夹，只要是WinSCP登录用户能访问的文件夹 cd /home/pi/ssl_cert find / -name "openssl.cnf" #查找openssl.cnfopenssl.cnf是openssl的配置文件，需要拷贝到/home/pi/ssl_cert下。在树莓派上找到了/usr/lib/ssl/openssl.cnf和/etc/ssl/openssl.cnf，但内容与 gofrp文档 有些差异。于是笔者直接复制了 gofrp文档 中的配置：nano /home/pi/ssl_cert/my-openssl.cnf写入以下内容：[ ca ] default_ca = CA_default [ CA_default ] x509_extensions = usr_cert [ req ] default_bits = 2048 default_md = sha256 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca string_mask = utf8only [ req_distinguished_name ] [ req_attributes ] [ usr_cert ] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = CA:true接下来生成默认ca（CA即Certification Authority，颁发证书的机构）：openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -subj "/CN=www.lisper517.top" -days 5000 -out ca.crt其中可以把www.lisper517.top改成自己的域名，或者也可以乱写。然后使用以下命令生成证书：#第一条命令 openssl genrsa -out server.key 2048 #第二条命令 openssl req -new -sha256 -key server.key \ -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com" \ -reqexts SAN \ -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:47.98.39.236,DNS:lisper517.top")) \ -out server.csr #第三条命令 openssl x509 -req -days 365 \ -in server.csr -CA ca.crt …

Docker树莓派实践——Typecho及其备份
type: item
date: 2022-07-27T02:46:00+00:00
description: 步骤/目录： 1.方法一：独立镜像、network连接 （1）准备工作 （2）运行容器与测试 （3）收尾与总结 2.方法二：docker-compose （1）准备工作 （2）编写文件并运行项目 （3）收尾与总结 3.实战：编写易移植的typecho博客并使用https （1）准备工作 （2）编写nginx配置及compose模板 （3）运行项目并测试 （4）问题及其他 a.博客迁移 b.安装完成后无法登录 c.typecho镜像选择 d.typecho插件及其他 （5）后续 （6）为typecho添加其它功能 a.在文章页面添加最新文章 b.添加侧边栏目录索引 c.添加Sitemap d.添加网站图标 （7）使用其它主题 （8）升级版本本文首发于个人博客https://lisper517.top/index.php/archives/22/，转载请注明出处。本文的目的是使用docker、docker-compose在树莓派上运行Typecho。本文实验日期为2022年7月26日。本文使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ）。之前的文章中曾介绍过Typecho，详见 树莓派搭建个人博客 。简单来说，Typecho是LNMP环境下运行的个人博客。学习Docker后，发现docker官网有typecho官方维护的镜像，于是试着用docker运行typecho。另外，这个镜像的下载量为100K+，但更新时间为3年前。官方镜像虽然只有50K下载，但最近更新比较勤（据说之前typecho五年没更新，docker镜像就更不会更新了），所以下面还是使用官方镜像。在typecho官方镜像页可以看到后缀不同的镜像，这些镜像的命名格式是：nightly-php版本号-后缀。php的版本主要有7.3、7.4、8.0，后缀主要有 空后缀、cli、fpm、apache、alpine 。本文选用的镜像是nightly-php8.0-apache。1.方法一：独立镜像、network连接主要思路是使用nightly-php8.0-apache镜像（apache和nginx作用一样，也是网页服务器），搭配docker-mysql。两个容器独立运行，使用docker network连接。需要注意typecho设置时如何填写数据库地址。在这种方式中，可以不用Dockerfile或docker-compose。（1）准备工作准备文件夹并拉取镜像：mkdir -p /test/mysql/data mkdir /test/mysql/conf docker network create -d bridge net_test docker pull mysql:8.0.29 docker pull joyqi/typecho:nightly-php8.0-apache拉取typecho镜像时比较慢，需要耐心等待。感觉白天镜像下的快一点。（2）运行容器与测试进行如下操作：docker run -itd --name mysql_test -v /test/mysql/data:/var/lib/mysql -v /test/mysql/conf:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.29 docker run -d --name typecho_test -p 80:80 joyqi/typecho:nightly-php8.0-apache docker network connect net_test mysql_test docker network connect net_test typecho_test笔者实验时宿主机的80、3306端口没有被占用，有占用的话需自行更改。另外，typecho初始化时使用的数据库需要提前创建。进行如下操作：docker exec -it mysql_test bash mysql -uroot -p #这里连不上库可以参考 Docker树莓派实践——LNMP 中的附录 create database test; show databases; exit exit顺便也可以查看mysql容器是否运行正常。如果不想进入mysql容器，也可在mysql容器启动命令中指定MYSQL_DATABASE：docker run -itd --name mysql_test -v /test/mysql/data:/var/lib/mysql -v /test/mysql/conf:/etc/mysql/c…

Docker树莓派实践——frp（附dashboard开启https、frp双向验证）
type: item
date: 2022-07-27T02:44:00+00:00
description: 步骤/目录： 1.准备工作 2.编写frpc.ini和compose模板 3.运行并验证 附录： 1.让frps的dashboard使用https （1）tls介绍 （2）生成证书并运行 （3）访问的注意事项 2.frp双向验证 （1）介绍 （2）准备工作 （3）修改配置并运行本文首发于个人博客https://lisper517.top/index.php/archives/21/，转载请注明出处。本文的目的是使用docker、docker-compose在云服务器上运行frps、在树莓派上运行frpc。本文实验日期为2022年7月27日。本文使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ）。之前的文章中曾介绍过frp，详见 在树莓派上设置frp穿透 。简单来说，frp的运行需要一台有公网ip的机器和另一台机器（比如没有公网ip的内网机器）；frp的作用是把另一台机器的端口映射到公网机器，使得从公网机器也能访问到另一台机器的端口（即内网穿透）。在docker官方仓库网页可以搜索到很多frp镜像，这里frpc选用的是snowdreamtech/frpc镜像，其下载量为10M+，两个月前更新。frps镜像也是该作者的。1.准备工作首先准备云服务器。笔者这里使用的是阿里云，镜像为Docker 19.03。在云服务器上进行如下操作：docker pull snowdreamtech/frps mkdir -p /docker/frps/conf mkdir /docker/frps/ssl_certificate #存放tls相关证书 #安装docker-compose。使用env命令发现PATH里没有/usr/local/bin，就放在/usr/bin里了 curl -L https://github.com/docker/compose/releases/download/v1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/bin/docker-compose chmod +x /usr/bin/docker-compose docker-compose -v #编辑frps配置 vim /docker/frps/conf/frps.ini笔者使用的初始frps配置如下：[common] bind_port = 7000 #frpc上也要有相同的token值 token = 你的密码 #frps统计板 dashboard_port = 7500 dashboard_user = wuhuqifei dashboard_pwd = wuhuqifei #kcp据说是多消耗15%流量、降低tcp延迟。端口可和bind_port相同 kcp_bind_port = 7000使用初始配置时的运行命令：docker run -d --name frps -v /docker/frps/conf/frps.ini:/etc/frp/frps.ini --network host --restart=always snowdreamtech/frps为了让dashboard使用tls协议加密，笔者将frps.ini修改为：[common] bind_port = 7000 #frpc上也要有相同的token值 token = 你的密码 #frps统计板 dashboard_port = 7500 dashboard_user = wuhuqifei dashboard_pwd = wuhuqifei #kcp据说是多消耗15%流量、降低tcp延迟。端口可和bind_port相同 kcp_bind_port = 7000 #dashboard使用tls的相关配置 dashboard_tls_mode = true dashboard_tls_cert_file = /ssl_certificate/server.crt dashboard_tls_key_file = /ssl_certificate/server.key关于.crt、.key、ca.crt文件的介绍与自己生成的方法见 附录1. ，或者参考 gofrp文档 。然后更改命令，加上挂载证书存放目录的部分：docker run -d --name frps -v /docker/frps/conf/frps.ini:/etc/frp/frps.ini -v /docker/frps/ssl_certificate:/ssl_certificate --network host --restart=always…

Docker树莓派实践——LNMP
type: item
date: 2022-07-26T08:16:00+00:00
description: 步骤/目录： 1.下载、烧录Pi OS最新镜像 2.安装docker并调试；备份系统镜像 3.方法一：假docker法 （1）拉取并运行ubuntu镜像 （2）安装vim、nginx （3）安装php并配置nginx （4）安装mariadb （5）收尾及总结 4.方法二：胖容器法 （1）创建环境，运行容器 （2）测试容器 （3）收尾及总结 5.方法三：瘦容器法 （1）创建环境，配置nginx （2）创建网络，开启php、nginx容器并测试 （3）运行mysql容器并测试 （4）准备环境并编写compose模板，运行并测试 （5）收尾及总结 附录 1.docker连接mysql时显示"Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'" （1）docker run /bin/bash （2）Dockerfile CMD （3）docker run未挂载或映射端口 （4）mysql配置问题 2.使用docker-compose创建mysql容器时的初始化 （1）挂载配置文件和数据库 （2）进入服务容器修改 （3）挂载到/docker-entrypoint-initdb.d （4）Dockerfile COPY到/docker-entrypoint-initdb.d （5）--init-file选项本文首发于个人博客https://lisper517.top/index.php/archives/20/，转载请注明出处。本文的目的是使用docker、docker-compose在树莓派上搭建LNMP环境。本文实验日期为2022年7月25日。本文使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ），装上系统后仅做了一些基础配置（安装了ufw、watchdog，设置了ssh密钥，apt update了一下）。LNMP环境指Linux、Nginx、Mysql、Php，LNMP常用于提供动态网页服务。一般来说使用docker有三种方式搭建LNMP环境：一是使用linux容器（如centos或ubuntu），docker run -it ubuntu bash，类似不使用docker时进行安装；二是使用Dockerfile，FROM ubuntu开始构建一个镜像，安装NMP；三是单独生成N、M、P的镜像，使用docker-compose或其他方法管理。方法一属于下策，但是最简单易行；方法二可称为fat container，只需要一个镜像、一个容器，缺点是不利于NMP的版本变更，但在一些情况下也可以使用；方法三为thin container，需要三个容器跑一个功能，容器多但是利于版本更迭、调整环境，而且使用docker-compose可以非常方便地管理多个容器。这里三种方法都演示一下。另外，如果需要非docker搭建LNMP，可以参考之前的文章 树莓派搭建个人博客 。1.下载、烧录Pi OS最新镜像这里涉及的操作之前的文章已经介绍过了，详见 树莓派4B初始化 。本次实验使用的是树莓派4B。在系统镜像下载网页下载最新的Pi OS 64位桌面版（下载文件名为2022-04-04-raspios-bullseye-arm64.img.xz，解压为.img文件后大小为3.95GB）。注意2022年4月后Pi OS取消了默认的pi用户，但可以自己创建：在boot下新建userconf文件，写入以下内容：pi:$6$8WzhrUbnvxbJdS5n$p5acHHXaB02qI1eCJrSH4lSUOsXx9WnTvbNm2T9h9d/OmnFuf0qXGTAYF3GK5pqFONn7LiA4Khn4AHXcYG72D/这样就手动创建了pi用户，密码还是raspberry。装上系统后仅进行了apt-get upgrade，安装并设置了ufw、watchdog，调整了ssh设置。2.安装docker并调试；备份系统镜像安装、调试docker和docker-compose的过程在前面已经介绍，这里不再赘述（见 Docker入门（一） ）。记得换docker源。这里使用RaspberryBackup脚本备份系统，详细介绍见 树莓派备份-RaspberryBackup详解 。3.方法一：假docker法再次提醒，这种方法只是学术探讨，实际环境中不管是生成还是测试都不要使用。（1）拉取并运行ubuntu镜像docker pull ubuntu docker run -itd -p 80:80 --name ubuntu_LNMP --…

Docker入门（一）
type: item
date: 2022-07-11T13:43:00+00:00
description: 本文较长，属于系统性总结，可作为使用手册查阅。本文主要介绍了docker常识与基础。步骤/目录： 一、初识docker与安装docker 二、docker网页GUI与docker源 三、docker命令行基本操作 1.docker pull拉取镜像 2.docker run运行容器 3.docker image ls查看镜像 4.docker image rm删除镜像 5.docker commit保存容器 6.docker cp及其他命令 四、编写Dockerfile定制镜像 1.FROM和RUN命令 2.Dockerfile的其他指令 （1）COPY （2）ADD （3）CMD （4）ENTRYPOINT （5）ENV （6）ARG （7）VOLUME （8）EXPOSE （9）WORKDIR （10）USER （11）HEALTHCHECK （12）ONBUILD （13）LABEL （14）SHELL 3.拉取时自动对应系统 4.其他方式制作镜像 五、操作容器 1.启动容器 2.后台运行容器 3.终止/重启容器 4.进入容器 5.导入/导出容器 6.删除容器 六、仓库 1.官方仓库 2.私有仓库 3.使用Nexus帮助管理私有仓库 七、docker数据卷 1.数据卷的常用操作 2.挂载宿主机目录作为数据卷 八、容器与网络 1.端口映射 2.docker网络 3.配置DNS 4.高级网络配置本文首发于个人博客https://lisper517.top/index.php/archives/18/，转载请注明出处。本文的目的是对docker基础内容做总结归纳，使用本文从零学习docker将有一定难度。本文主要总结自菜鸟教程和Docker——从入门到实践和一些其他零散资料，有不明白的地方请参考原文。本文写作日期为2022年2月-7月。本文使用的是树莓派4B（内存8G版），系统为Pi OS 64位桌面版（2022年4月4日更新，镜像名 2022-04-04-raspios-bullseye-arm64.img ），装上系统后仅做了一些基础配置（安装了ufw、watchdog，设置了ssh密钥，apt update了一下）。一、初识docker与安装dockerDocker是基于Go语言的开源应用容器引擎，可以将应用和依赖打包成容器、在其他linux/windows/mac机器运行，还支持虚拟化。docker的优点主要有三：标准化、一致化；可移植、响应式部署；轻量级、硬件开销小。最后附上docker官网和Github社区版docker。另外，Docker对比传统虚拟机有很大优势（硬件开销小）。最后介绍一下docker架构：包括镜像，容器和仓库。面向对象编程中，类实例化后就创建了对象，对于docker来说，镜像=类，容器=对象，仓库则用来保存镜像。另外，可通过 仓库名:标签 指定镜像版本，不给出时默认为latest。安装docker推荐使用官方脚本自动安装，树莓派可运行如下命令：cd /tmp curl https://get.docker.com/ > ./docker_install.sh chmod +x docker_install.sh sh docker_install.sh –mirror Aliyun #换源安装 rm docker_install.sh没有配置源时不要直接apt install安装Docker，使用apt命令安装可参考树莓派实验室和Docker——从入门到实践。安装完后测试docker，输入：docker run hello-world #输出结果 Unable to find image 'hello-world:latest' locally #默认为latest，并先在本地查找 latest: Pulling from library/hello-world #从公共仓库pull，这里是默认的Docker Hub 9b157615502d: Pull complete Digest: sha256:97a379f4f88575512824f3b352bc03cd75e239179eea0fecc38e597b2209f49a Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted…