收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
一、私有仓库建立
docker pull registry
在docker 引擎终端设置
vim /etc/docker/daemon.json { "insecure-registries": ["ip网址:5000"], 添加 "registry-mirrors": ["https://05vz3np5.mirror.aliyuncs.com"] } systemctl restart docker.service docker create -it registry /bin/bash docker ps -a
会是异常状态
docker start
宿主机的/data/registry自动创建挂载容器中的/tmp/registry
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
更改标记为ip网址:5000/nginx
docker tag nginx:latest ip网址:5000/nginx
上传
docker push ip网址:5000/nginx The push refers to repository [ip网址:5000/nginx]
获取私有仓库列表
获取registry的镜像仓库中的镜像信息
curl -XGET http://ip网址:5000/v2/_catalog
测试私有仓库下载
docker pull ip网址:5000/nginx
二、Cgroup 资源配置方法
docker 使用cgroup控制资源
respones request
Docker通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 基本覆盖了常见的资源配额和使用量控制。
Cgroup 是 Control Groups 的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、磁盘 IO 等等)的机制
07年谷歌,可以控制资源分配通过操作系统内核,控制应用程序使用内存资源、cpu资源、 文件系统资源等等
cgroup是一种资源控制手段
也是容器隔离的6个名称空间的一种实现手段每个容器相当于一个进程
三、CPU使用率控制
cpu周期: 1s为一个周期的定律,参数值一般为100000 (CPU衡量单位是秒)。
假如需要给此容器分配cpu使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2s。
cpu在一个时刻,只能给一个进程占用。
使用 stress 工具测试 CPU 和内存
使用 Dockerfile 来创建一个基于 Centos 的 stress 工具镜像。
mkdir /opt/stress vim /opt/stress/Dockerfile FROM centos:7 RUN yum install -y wget RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo RUN yum install -y stress cd /opt/stress/ docker build -t centos:stress .
使用如下命令创建容器,命令中的–cpu-shares 参数值不能保证可以获得 1 个 vcpu 或 者多少 GHz 的 CPU 资源,它仅是一个弹性的加权值。
docker run -itd --cpu-shares 100 centos:stress
默认情况下,每个 Docker容器的CPU份额都是1024。单独一个容器的份额是没有意义的。只有在同时运行多个容器时,容器的 CPU 加权的效果才能体现出来。
两个容器 A、B 的 CPU 份额分别为 1000 和 500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得 CPU 的时间片。
但分配的结果取决于当时主机和其他容器的运行状态, 实际上也无法保证容器 A一定能获得CPU时间片。比如容器A的进程一直是空闲的,那么容器B是可以获取比容器A更多的CPU时间片的。极端情况下,例如主机上只运行了一个容器,即使它的 CPU 份额只有 50,它也可以独占整个主机的CPU资源。一个主机运行一个容器,只运行了一个应用(容器也是虚拟化技术 )
一个主机运行一个应用Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的CPU份额来确定有多少CPU资源分配给它,
资源分配 结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。
可以通过 cpu share 可以设置容器使用 CPU 的优先级/权重,比如启动了两个容器及运行查看 CPU 使用百分比。docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10 容器产生10个子函数进程 docker exec -it f4953c0d7e76 bash 进入容器使用top查看cpu使用情况 再开启一个容器做比较 docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10 docker exec -it 5590c57d27b0 bash //进容器使用top对比两个容器的%CPU,比例是1:2 docker stats 查看资源使用
四、 CPU 周期限制
Docker 提供了–cpu-period、–cpu-quota 两个参数控制容器可以分配到的 CPU 时钟周期。
–cpu-period 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配。cd /sys/fs/cgroup/cpu/docker容器ID/cpu.cfs_quota_us
宿主机怎么提供资源、怎么控制docker容器中的应用的:
CPU→VCPU→以进程的方式体现在workstation环境(docker环境中)→docker表现形式是容器→Vcpu以进程的方式控制容器→容器中的应用需要的是服务进程支持→宿主机内核中cpu可以被cgroup管理(通过分配资源手段)→linux 内核中的cgroup可以控制管理docker 容器中的应用。–cpu-quota 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。
与 --cpu-shares 不同的是,这种配置是指定一个绝对值,容器对 CPU 资源的使用绝对不会超过配置的值。cpu-period 和 cpu-quota 的单位为微秒(μs)。cpu-period 的最小值为 1000 微秒, 最大值为 1 秒(10^6 μs),默认值为 0.1 秒(100000 μs)。
cpu-quota 的值默认为 -1, 表示不做控制。cpu-period 和 cpu-quota 参数一般联合使用。redis 中,用来表示的永久 -1ttl teacher
-1
lrange teacher 0 -1容器进程需要每 1 秒使用单个 CPU 的 0.2 秒时间,可以将 cpu-period 设置 为 100000(即 1 秒),cpu-quota 设置为 20000(0.2 秒)。
当然,在多核情况下,如果允许容器进程完全占用两个 CPU,则可以将 cpu-period 设置为 10000(即 0.1 秒), cpu-quota 设置为 200000(0.2 秒)。
选项 描述 –pus= 指定容器可以使用多少可用CPU资源。例如,如果主机有两个CPU,并且您设置了而Cpus =“1.5”, 那么该容器将保证最多可以访问一个半的CPU。这相当于设置-cpu-period ="100000"和–cpu- quota =“150000”。在Docker 1.13和更高版本中可用。 –Cpu-period= 指定CPU CFS调度程序周期,该周期与–pu-quota-起使用。默认为100000微妙,以微秒表示。 大多数用户不会从默认值更改此设置。如果您使用Docker 1.13或更高版本,请改用–cpus。 –Cpu-quota= 在容器上添加CPU CFS配额。每个–cpu-period允许CPU访问的容器数微秒数。换句话说,cpu- quota/ cpu-period。如果您使用Docker 1.13或更高版本,请改用-cpuS。 –cpuset-cpus 限制容器可以使用的特定CPU或核心。如果您有多个CPU,则容器可以使用的逗号分隔列表或连字 符分隔的CPU范围。第一个CPU编号为0.有效值可能为0-3 (使用第一,第二,第三和第四个 CPU)或1,3 (使用第二个和第四个CPU)。 –Cpu-shares 将此标志设置为大于或小于默认值1024的值,以增加或减少容器的重量,并使其能够访问主机 CPU周期的更大或更小比例。这仅在CPU周期受到限制时才会执行。当大量CPU周期可用时,所有 容器都使用尽可能多的CPU。这样,这是一个软限制。 --cpu-shares不会阻 止容器在群集模式下进 行调度。它优先考虑容器CPU资源的可用CPU周期。它不保证或保留任何特定的CPU访问权限。 docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress docker exec -it 98d2aaa50019 bash
查询容器的资源限制参数
(1)在指定容器目录中
cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_period_us cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_quota_us
(2)使用docker inspect 容器ID/容器名
"CpuPeriod": "CpuQuota":
五、 CPU Core 控制
对多核 CPU 的服务器,Docker 还可以控制容器运行使用哪些 CPU 内核,即使用–cpuset-cpus 参数。
这对具有多 CPU 的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。docker run -tid --name cpu1 --cpuset-cpus 0-1 centos:stress
执行以上命令需要宿主机为双核,表示创建的容器只能用 0、1两个内核。最终生成 的 cgroup 的 CPU 内核配置
cat /sys/fs/cgroup/cpuset/docker/
通过下面指令可以看到容器中进程与 CPU 内核的绑定关系,达到绑定 CPU 内核的目的。
docker exec taskset -c -p 1 容器内部第一个进程号pid为1被绑定到指定CPU上运行pid 1's current affinity list: 0,1
创建容器时 直接使用参数指定资源限制
创建容器后,指定资源分配
修改宿主机对应容器资源控制的文件
/sys/fs/cgroup/*
六、 CPU 配额控制参数的混合使用
通过 cpuset-cpus 参数指定容器 A 使用 CPU 内核 0,容器 B 只是用 CPU 内核 1。
在主机上只有这两个容器使用对应 CPU 内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。cpuset-cpus、cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。
在系统具有多个 CPU 内核的情况下,需要通过 cpuset-cpus 参数为设置容器 CPU 内核才能方便地进行测试。
宿主系统修改为4核心CPUdocker run -tid --name cpu3 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1 docker exec -it 84598dfadd34 bash exit top 按1查看每个核心的占用 docker run -tid --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1 docker exec -it bash
上面的 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年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
6fb4deab932.png)
[外链图片转存中…(img-tj3YaPxA-1715868542043)]
[外链图片转存中…(img-wfOfI3E8-1715868542043)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)