收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
上面的 centos:stress 镜像安装了 stress 工具,用来测试 CPU 和内存的负载。通过 在两个容器上分别执行 stress -c 1 命令,将会给系统一个随机负载,产生 1 个进程。这个进程都反复不停的计算由 rand产生随机数的平方根,直到资源耗尽。 观察到宿主机上的 CPU 使用率,第三个内核的使用率接近 100%, 并且一批进程的 CPU 使用率明显存在 2:1 的使用比例的对比。
七、 内存限额
与操作系统类似,容器可使用的内存包括两部分:物理内存和 Swap。
Docker 通过下面两组参数来控制容器内存的使用量。-m 或 --memory:设置内存的使用限额,例如 100M、1024M。
–memory-swap:设置 内存+swap 的使用限额。
执行如下命令允许该容器最多使用 200M 的内存和 300M 的 swap。
#单纯做swap 和物理内存的硬限制docker run -it -m 200M --memory-swap=300M centos:stress
–vm 1:启动 1 个内存工作线程。
–vm-bytes 280M:每个线程分配 280M 内存。
默认情况下,容器可以使用主机上的所有空闲内存。
与 CPU 的 cgroups 配置类似, Docker 会自动为容器在目录 /sys/fs/cgroup/memory/docker/<容器的完整长 ID>
中创建相应 cgroup 配置文件如果让工作线程分配的内存超过 300M,分配的内存超过限额,stress 线程报错,容器 退出。
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M
八、Block IO 的限制
默认情况下,所有容器能平等地读写磁盘,可以通过设置–blkio-weight 参数来改变 容器 block IO 的优先级。
–blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。
在下面 的例子中,容器 A 读写磁盘的带宽是容器 B 的两倍。docker run -it --name container_A --blkio-weight 600 centos:stress cat /sys/fs/cgroup/blkio/blkio.weight docker run -it --name container_B --blkio-weight 300 centos:stress cat /sys/fs/cgroup/blkio/blkio.weight
九、 bps 和 iops 的限制
bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。
可通过以下参数控制容器的 bps 和 iops:–device-read-bps,限制读某个设备的 bps。
–device-write-bps,限制写某个设备的 bps。
–device-read-iops,限制读某个设备的 iops。
–device-write-iops,限制写某个设备的 iops。限制容器写 /dev/sda 的速率为 5 MB/s。
docker run -it --device-write-bps /dev/sda:5MB centos:stress dd if=/dev/zero of=test bs=1M count=1024 oflag=direct 可以按ctrl+c中断查看
通过 dd 命令测试在容器中写磁盘的速度。因为容器的文件系统是在 host /dev/sda上的,在容器中写文件相当于对 host /dev/sda 进行写操作。另外,oflag=direct 指定用 direct IO 方式写文件,这样 --device-write-bps 才能生效。
结果表明限速 5MB/s 左右。作为对比测试,如果不限速,结果如下。
docker run -it centos:stress dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
十、 构建镜像(docker build)时指定资源限制
build-arg=[] | 设置镜像创建时的变量 |
cpu-shares | 设置 cpu 使用权重 |
cpu-period | 限制 CPU CFS周期 |
cpu-quota | 限制 CPU CFS配额 |
cpuset-cpus | 指定使用的CPU id |
cpuset-mems | 指定使用的内存 id |
disable-content-trust | 忽略校验,默认开启 |
-f | 指定要使用的Dockerfile路径 |
force-rm | 设置镜像过程中删除中间容器 |
isolation | 使用容器隔离技术 |
label=[] | 设置镜像使用的元数据 |
-m | 设置内存最大值 |
memory-swap | 设置Swap的最大值为内存+swap,"-1"表示不限swap |
no-cache | 创建镜像的过程不使用缓存 |
pull | 尝试去更新镜像的新版本 |
quiet, -q | 安静模式,成功后只输出镜像 ID |
rm | 设置镜像成功后删除中间容器 |
shm-size | 设置/dev/shm的大小,默认值是64M |
ulimit | Ulimit配置 |
squash | 将 Dockerfile 中所有的操作压缩为一层 |
tag, -t | 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。 |
network | 默认 default。在构建期间设置RUN指令的网络模式 |
1.资源限制的主要类型
1)CPU 权重shares、quota、cpuset
2)磁盘 BPS、TPS限制,指定使用哪个磁盘、磁盘分区
3)内存 -m -swap 内存、交换分区
大部分做的是上限的限制2.资源限制的几种方式
1)build 构建镜像时,可以指定该镜像的资源限制
2)run 将镜像跑为容器的时候,可以指定容器的资源限制3)容器启动之后, 可以在宿主机对应容器的目录下。修改资源限制,然后重载
/sys/fs/cgroup/*(cpu、blk、mem)/docker/容器ID/→修改对应的资源限制文件参数就可以3.资源限制的状态查询
1)docker inspect 镜像ID/容器ID
2)直接查看宿主机对应容器ID资源限制的文件
3)docker statscgroup 资源 docker 原理之一 ,namespaces 6个名称空间
十一、 compose部署
Docker Compose配置常用字段
字段 描述 build dockerfile context 指定Dockerfile文件名构建镜像上下文路径 image 指定镜像 command 执行命令,覆盖默认命令 container name 指定容器名称,由于容器名称是唯一的如果指定自定 义名称,则无法scale deploy 指定部署和运行服务相关配置,只能在Swarm模式使用 environment 添加环境变量 networks 加入网络 ports 暴露容器端口,与-p相同,但端口不能低于60 volumes 挂载宿主机路径或命令卷 restart 重启策略,默认no,always,no-failure,unless-stoped hostname 容器主机名 Docker Compose常用命令
字段 描述 build 重新构建服务 ps 列出容器 up 创建和启动容器 exec 在容器里面执行命令 scale 指定一个服务容器启动数量 top 显示容器进程 logs 查看容器输出 down 删除容器、网络、数据卷和镜像 stop/start/restart 停止/启动/重启服务 环境部署所有主机安装docker环境(内容为docker基础)
yum install docker-ce -y
下载compose
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose cp -p docker-compose /usr/local/bin/ chmod +x /usr/local/bin/docker-compose mkdir /root/compose_nginx tree ./ ./ ├── docker-compose.yml 创建模板脚本 ├── nginx ├── Dockerfile 创建容器脚本 ├── nginx-1.15.9.tar.gz 复制源码包 └── wwwroot └── index.html 站点
vim /root/compose_nginx/docker-compose.yml version: '3' services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - 1216:80 - 1217:443 networks: - cluster volumes: - ./wwwroot:/usr/local/nginx/html networks: cluster:
docker-compose -f docker-compose.yml up -d
docker 基础操作/常规操作
1)image 容器的管理命令
2)dockerfile
3)docker 网络
4)docker 私有仓库
registry
harbordocker-compose→资源编排和管理手段 (docker swarm)
Harbor 服务
Harbor被部署为多个Docker 容器,因此可以部署在任何支持Docker 的Linux 发行版
上。(registry 为其核心组件)
Harbor比registry相比好处是: harbor 支持多种功能、图形化界面管理、多用户权限、角色管理机制、安全机制。
服务端主机需要安装Python、 Docker 和Docker Compose。(web 环境支持的是PY语言,故需要安装Python)。
1.下载Harbor 安装程序
wget http:// harbor.orientsoft.cn/habor-1.2.2/harborofline-installer-v1.2.2.tgz
tar zxvf harbor oflie-installer-v1.2.2.tgz -C /usr/local/
2.配置Harbor 参数文件
vim /us/local/harbor/harbor.cfg 第五行 hostname = 主机ip
关于Harbor.cfg 配置文件中有两类参数:所需参数和可选参数
(1)参数
所需参数这些参数需要在配置文件Harbor.cfg 中设置。
如果用户更新它们并运行install.sh 脚本重新安装Harbor,参数将生效。
具体参数
①hostname:用于访问用户界面和reeister 服务。它应该是目标机器的IP 地址或完全限定
的域名(FQDN)。
②ui url _protocol: (http 或https, 默认为http) 用于访问UI和令牌/通知服务的协议。如
果公证处于启用状态,则此参数必须为https。(身份验证时会向Mysql数据库进行比对,
然后授予令牌)
③max_ job_workers: 镜像复制作业线程。
④db_ password: 用于db_ auth的MySQL数据库root用户的密码。
⑤customize_ crt:该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。
当由外部来源提供密钥和根证书时,将此属性设置为off。
⑥ssl_cert: SSL 证书的路径,仅当协议设置为https 时才应用。
⑦ssl cert_key: SSL 密钥的路径,仅当协议设置为https 时才应用。
⑧secretkey_ path:用于在复制策略中加密或解密远程register 密码的密钥路径。
(2)可选参数
这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动Harbor 后在Web UI上进行更新。
如果进入Harbor.cfg, 只会在第一次启动 Harbor时生效,随后对这些参数的更新,Harbor.cfg将被忽略。
注意:如果选择通过UI设置这些参数,请确保在启动Harbour后立即执行此操作。具体来
说,必须在注册或在Harbor 中创建任何新用户之前设置所需的auth_mode。当系统中有用户时(除了默认的admin 用户),auth_mode 不能被修改。具体参数如下:
①Email: Harbor 需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能
时才需要。
请注意,在默认情况下SSL连接时没有启用。如果SMTP服务器需要SSL,但不支持STARTTLS,那么应该通过设置启用SSLemailssl=TRUE。
②harbour_admin_password: 管理员的初始密码,只在Harbour第-次启动时生效。之后,此
设置将被忽略,并且应UI中设置管理员的密码。
请注意,默认的用户名/密码是admin/Harbor12345 。
③auth mode:使用的认证类型,默认情况下,它是db_auth, 即凭据存储在数据库中。对于
LDAP身份验证(以文件形式验证),请将其设置为ldap_auth。
④self_registration: 启用/禁用用户注册功能。禁用时,新用户只能由Admin 用户创建,只有
管理员用户可以在Harbour中创建新用户。
注意:当auth_mode设置为ldap_auth时,自注册功能将始终处于禁用状态,并且该标志
被忽略。
⑤Token_ expiration: 由令牌服务创建的令牌的到期时间(分钟),默认为30分钟。
project_creation. restriction: 用于控制哪些用户有权创建项目的标志。默认情况下,每个人
都可以创建一个项目。
如果将其值设置为“adminonly",那么只有admin可以创建项目。
⑥verify_remote_cert: 打开或关闭,默认打开。此标志决定了当Harbor与远程register 实例通信时是否验证SSL/TLS 证书。
将此属性设置为off 将绕过SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用。
另外,默认情况下,Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑使用其他存储后端而不是本地文件系统,如S3、Openstack Swif、Ceph 等。但需要更新common/templates/egistry/config.yml 文件。
3.启动Harbor
sh /usr/local/harbor/install.sh
打开浏览器输入主机ip即可访问harbor
4.查看Harbor启动镜像
查看镜像
docker images
查看容器
docker ps -a cd /usr/local/harbor/ docker-compose ps
此时可使用Docker 命令在本地通过127.0.0.1 来登录和推送镜像。默认情况下,
Register服务器在端口80. 上侦听。
登录
docker login -u admin -P Harbor12345 http://127.0.0.1
下载镜像进行测试
docker pull cirros
镜像打标签
docker tag cirros 127.0.0.1/myproject-kgcirros:v1
上传镜像到Harbor
docker push 127.0.0.1/myproject-kgc/cirros:v1
以上操作都是在Harbor 服务器本地操作。如果其他客户端上传镜像到Harbor, 就会报
如下错误。出现这问题的原因Docker Registry 交互默认使用的是HTTPS,但是搭建私有镜
像默认使用的是HTTP 服务,所以与私有镜像交互时出现以下错误。
docker login -u admin -P Harbor12345 http://主机ip 会报错
解决
vim /us/ib/systemd/system/docker.service ExecStart=/us/bin/dockerd -H fd:// -insecure-registry 主机ip --containerd=/run/containerd/containerd.sock
systemctl daemon-reload systemctl restart docker docker login -u admin -p Harbor12345 http://主机ip
十二、 consul部署
consul 注册中心/注册机
服务器nginx: Nginx 、Consul、 Consul-template
服务器docker: Docker-ce、registrator(自动发现、注册的组件)template 模板(更新)
registrator(自动发现)
后端每构建出一个容器,会向registrator进行注册,控制consul 完成更新操作,consul会触发consul template模板进行热更新。
核心机制:consul :自动发现、自动更新,为容器提供服务(添加、删除、生命周期辅助功能)。1.consul服务器
mkdir /root/consul cp consul_0.9.2_linux_amd64.zip /root/consul cd /root/consul unzip consul_0.9.2_linux_amd64.zip mv consul /usr/bin consul agent \ -server \ server模式 -bootstrap \ 前端框架(node.js) -ui \ 可被访问的web界面 -data-dir=/var/lib/consul-data \ -bind= \ -client=0.0.0.0 \ -node=consul-server01 &> /var/log/consul.log & consul agent \ -server \ -bootstrap \ -ui \ -data-dir=/var/lib/consul-data \ -bind= \ -client=0.0.0.0 \ -node=consul-server01 &> /var/log/consul.log &
2.通过httpd api 获取集群信息
curl 127.0.0.1:8500/v1/status/peers 看集群server成员 curl 127.0.0.1:8500/v1/status/leader 集群 Raf leader curl 127.0.0.1:8500/v1/catalog/services 注册的所有服务 curl 127.0.0.1:8500/v1/catalog/nginx 查看 nginx 服务信息 curl 127.0.0.1:8500/v1/catalog/nodes 集群节点详细信息
3.容器服务自动加入consul集群
(1)安装 Gliderlabs/Registrator
可检查容器运行状态自动注册,还可注销 docker 容器的服务 到服务配置中心。
目前支持 Consul、Etcd 和 SkyDNS2。
执行操作:docker run -d \ --name=registrator \ --net=host \ -v /var/run/docker.sock:/tmp/docker.sock \ --restart=always \ gliderlabs/registrator:latest \ -ip=ip网址 \ consul://ip网址:8500
(2)测试服务发现功能是否正常
docker run -itd -p:83:80 --name test-01 -h test01 nginx docker run -itd -p:84:80 --name test-02 -h test02 nginx docker run -itd -p:88:80 --name test-03 -h test03 httpd docker run -itd -p:89:80 --name test-04 -h test04 httpd
(3)验证 http 和 nginx 服务是否注册到 consul
浏览器输入 http://ip网址:8500,“单击 NODES”,然后单击 “consurl-server01”,会出现 5 个服务.
在consul服务器上查看服务
curl 127.0.0.1:8500/v1/catalog/services
(4)安装 consul-template
Consul-Template 是一个守护进程,用于实时查询 Consul 集群信息,并更新文件系统 上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新 操作,重新加载 Nginx。Consul-Template ,可以查询 Consul 中的服务目录、Key、Key-values 等。
这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。
创建 Apache/Nginx Proxy Balancers、Haproxy Backends(5)准备 template nginx 模板文件
在consul上操作
vim /root/consul/nginx.ctmpl upstream http_backend { {{range service "nginx"}} server {{.Address}}:{{.Port}}; 此处引用的变量会指向后端的地址和端口(动态变化) {{end}} } server { listen 85; server_name localhost ip网址; 反向代理的IP地址(前端展示的NG服务的IP) access_log /var/log/nginx/kgc.cn-access.log; index index.html index.php; location / { proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; 后端真实IP proxy_set_header Client-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 转发地址 proxy_pass http://http_backend; } }
(6)编译安装nginx
yum install gcc pcre-devel zlib-devel -y tar zxvf nginx-1.12.0.tar.gz -C /opt ./configure --prefix=/usr/local/nginx make && make install ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
(7)配置 nginx
vim /usr/local/nginx/conf/nginx.conf http { include mime.types; 默认存在的 include vhost/*.conf; 添加虚拟主机目录(consul动态生成的配置文件就会放在这里) default_type application/octet-stream;
创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
创建日志文件目录
mkdir /var/log/nginx
启动nginx
usr/local/nginx/sbin/nginx
(8)配置并启动 template
cp consul-template_0.19.3_linux_amd64.zip /root/ unzip consul-template_0.19.3_linux_amd64.zip mv consul-template /usr/bin/
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
conf/vhost
![](https://img-blog.csdnimg.cn/91f59123fc8548078b5fd33dcfe268de.png) 创建日志文件目录
mkdir /var/log/nginx
![](https://img-blog.csdnimg.cn/57f48e66352640dfa4f952a1e8f254d5.png) 启动nginx
usr/local/nginx/sbin/nginx
![](https://img-blog.csdnimg.cn/3dd12ebcd7604c5a8d1c71b7db87cf81.png) ![](https://img-blog.csdnimg.cn/b9e580c97dea474e9f58bb5d82dadc0d.png) (8)配置并启动 template
cp consul-template_0.19.3_linux_amd64.zip /root/
unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/bin/
[外链图片转存中…(img-sm5IK23W-1715868576471)]
[外链图片转存中…(img-0KDanE3a-1715868576471)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)