云原生
2021-09-26 17:05:09 3 举报
AI智能生成
云原生架构
作者其他创作
大纲/内容
云原生结构图
云是云原生的基础,为上层应用的运行提供了计算、网络、存储等基础资源
容器为应用在云上运行提供了平台,即应用运行在容器上,例如Docker;容器编排主要负责编排容器、管理容器的生命周期,负责容器间的网络通信、存储等等。实现了从单容器应用向多机器集群、多容器协同工作的模式转变。
应用架构层面,用户可以根据应用使用场景来选择微服务架构(Microservices)或者是无服务器架构(Serverless)
在复杂的交互场景当中,通过 服务网格(Service Mesh) 实现对应用服务的治理,主要是对服务间的通讯进行管控。
通过DevOps构建一个应用架构 持续集成、持续交付、持续部署(CI / CD)不断迭代更新的运维正向循环。
描述
认识云原生
https://landscape.cncf.io
Landscape图 & 路线图
https://cloudnative.to/
云原生社区
Linux Container(简称LXC)它是一种内核轻量级的操作系统层虚拟化技术。Linux Container主要由 Namespace 和 Cgroup 两大机制来保证实现。
什么是容器?
Docker 使用结构图
BusyBox
Alpine
Ubuntu
CentOS
比较常用的操作系统镜像
UnionFS(联合文件系统):Union文件系统是Docker镜像的基础,镜像可以通过分层来继承,基于基础镜像可以制作具体的应用镜像。
Docker 镜像原理
查看 docker 的版本信息
docker --version
查看 docker 信息
docker info
查看某一个镜像的详细信息
docker inspect 镜像名:tag
可以查询镜像的某一部分信息:-f {{.项目.项目}}如果一个项目下有好几条项目,则会将它们返回一个数组
docker inspect 镜像名:tag -f {{.Architecture}}
docker inspect
登录 docker 仓库
docker login ip:port
登出docker仓库
docker logout ip:port
docker命令
Name[镜像名] Tag[镜像标签] Image ID[镜像的ID] CreatedTime[创建时间] Size[镜像大小]
显示信息
-a:列出所有的镜像文件(包括中间镜像)
-q:仅输出镜像 ID
其中 key可以设置为以下几个: dangling:显示标记为空的镜像,值只有true和false label:这个是根据标签进行过滤,其中lable的值,是docker在编译的时候配置的或者在Dockerfile中配置的 before:这个是根据时间来进行过滤,其中before的value表示某个镜像构建时间之前的镜像列表 since:跟before正好相反,表示的是在某个镜像构建之后构建的镜像 reference:这个是添加正则进行匹配
docker images -f \"key=value\"
-f:显示过滤后的镜像
--digests:显示镜像的摘要信息
docker images
此次替换不会删除原来的镜像,会生成一个新的docker镜像
docker tag old_name:tag new_name:tag
拉取镜像。如果没有标签的话,默认拉最新的latest。
docker pull <镜像名>:<tag>
docker push 10.16.3.6:8083/mydocker:v3.0
向 Registry 中推送 镜像
docker push IP:Post/Name:Tag
导入镜像,镜像文件一般为tar包
docker load -i <镜像文件>
docker save -o <保存的镜像文件名> Name:tag
-a:提交镜像的作者
-c:使用Dockerfile指令创建镜像
-m:提交的文字说明
-p:在commit时,将容器暂停
option
docker commit [option] CONTAINER [REPOSITORY[:TAG]]
交互式的将一个镜像运行为容器。
-it <镜像名>:tag /bin/sh
后台模式,退出容器不会停止容器
-d 镜像名:tag
-v:宿主机目录:容器目录
-p:映射指定的端口。-p80:81—宿主机端口:容器内部端口
Docker 会映射一个 49000~49900的宿主机端口到容器
-P
--name:给容器起名字
容器创建后退出容器,容器就会被删除,不加--rm,容器退出后只是停止运行,并且保存数据
--rm
docker run
删除镜像。可以同时删除多个镜像
docker rmi <镜像名>:tag
当一个镜像拥有多个标签的时候,docker rmi 只是删除了多个镜像标签中的其中一个,并不会删除镜像文件,如果当镜像文件只剩下一个标签时,删除该标签会删除镜像文件。
如果有容器依赖镜像时,需要先删除容器,再删除镜像。
强制删除镜像
-f
docker rmi <镜像ID>
搜索远端仓库中的 docker 镜像,默认Docker Hub
docker search <name>
查看构建镜像历史
docker history <镜像名>:tag
镜像命令
docker create命令能够基于镜像创建容器。该命令执行的效果类似于docker run -d,即创建一个将在系统后台运行的容器。但是与docker run -d不同的是,docker create创建的容器并未实际启动,还需要执行docker start命令或docker run命令以启动容器。事实上,docker create命令常用于在启动容器之前进行必要的设置
docker create -it
删除已经停止的容器
容器ID/容器名
强制删除容器,即使运行中的
-f 容器ID
批量删除容器(运行中的容器也会删除)
-f $ (docker ps -a -q)
docker rm
停止容器,慢慢停止
docker stop 容器名/容器ID
直接杀死
docker kill 容器名/容器ID
docker start 容器名/容器ID
重启已经停止的容器
docker restart 容器名/容器ID
查找 运行中的容器信息
-a/--all:查找所有的容器信息,包括停止的容器
-l:上次运行的容器
-n number:查看前n个运行的容器
-q:查看容器的ID
docker ps
-f:动态显示容器日志
-t:加入时间戳
docker logs --tail 10 容器名
docker logs --tail 0 -f 容器名
--tail num:查看最后num条日志
docker logs -选项 容器ID
进入容器
exit(退出容器,容器停止)
ctrl+p+q(退出容器,容器不停止)
退出容器
docker exec -it 容器ID/容器名 /bin/bash
查看容器内运行的进程
docker top 容器ID
docker inspect --format='{State.running}' 容器名
通过 -f 或 --format 参数来查看某个结果
查看容器内部细节
docker inspect 容器ID
将容器中/opt下面的文件拷贝到了宿主机的/opt文件夹下
docker cp 容器ID:/opt/ /opt
容器重启
docker run -d --restart=always --name 容器名 镜像名 [要运行的shell语句],shell是容器启动后的执行命令
容器命令
Docker 命令
DockerFile是Docker镜像的构建文件。构建过程中会按照Dockerfile中的命令和脚本构建镜像。
1.DockerFile每条指令都是的保留字都是大写,并且保留字后至少跟一个参数,不能为空。2.DockerFile按照从上到下的顺序,顺序执行。3.DockerFile注释符号为#4.每条指令都会创建一个新的镜像层,并对镜像进行提交。
Dockerfile编写规则
FROM :基础镜像,当前镜像是基于哪个镜像来构建的。
MAINTAINER :镜像维护者的姓名和邮箱地址。
USER:该指令会指定镜像以什么样的用户去运行容器的
RUN [\"yum\
RUN <command> 或 RUN [\"<executeable>\
RUN:容器被构建时,需要运行的命令。执行在上一个已经构建好的中间镜像上
WORKDIR :指定在创建容器后,终端默认的工作目录,进入容器后的目录位置点(没有指定,默认根目录)。
ENV :在镜像构建过程中,设置的环境变量。 ENV MY_PATH /usr/mycentos,设置MY_PATH为usr/mycentos。docker run -e 可覆盖
ADD /opt/app/ /app/ADD 通过目的地址的结尾符号来判断源文件是目录还是b style=\
如果文件是以gzip、bzip2、xz结尾的源文件,会被自动解压
ADD :将宿主主机目录下的文件拷贝到镜像中,并且ADD命令自动处理URL和解压缩tar包。
如果路径是一个目录,则整个目录被复制到容器中;如果是一个文件,则该文件会同元数据一同被复制。
COPY :将从构建上下文的目录中的源路径文件/目录中复制到新一层的镜像内的目标路径的位置。COPY src dst (COPY [\"src\" \"dst\"])
docker 容器中的应用程序将会使用容器指定的端口,但并不意味着可以访问容器的端口,需要在docker run -p 主机端口:容器端口
EXPOSE :当前容器暴露的端口号(-p时会被修改)
容器卷的特点
VOLUME [\"/temp/data\"]:任何基于此镜像创建的容器,都会被创建一个该路径的挂载点VOLUME[\"/temp/data\
VOLUME :数据卷,用于容器数据的保存和持久化。
当一个镜像被其他镜像用做基础镜像时,该触发器会被执行
ONBUILE :当构建一个被继承的DockerFile命令时,父镜像在被子镜像继承后所触发的命令
docker run 命令行中的任何参数都会被当成参数再次传递给ENTRYPOINT指令中的指定的命令
ENTRYPOINT [\"/usr/bin/nginx\"],同时我们启动容器:docker run -it 镜像名/ID -g \"daemon off\"
等价于ENTRYPOINT [\"usr/bin/nginx\
ENTRYPOINT :指定容器启动时要运行的命令(命令不容易在容器启动时被覆盖) docker run --entrypoint 覆盖
CMD[\"executable\",\"param1\",\"param2\"] 使用exec执行
CMD :指定容器被启动时默认要执行的命令 (多个CMD命令,、会被最后一个CMD覆盖)同时docker run 命令会覆盖CMD指令
等价于Nginx服务器会以 /usr/bin/Nginx -h 的形式启动
ENTRYPOINT [\"/usr/bin/nginx\"] CMD [\"-h\"] / CMD[\"param1\
在容器启动时,如果没有运行docker run 命令,则Dockerfile文件会将 CMD 数组中的命令 -h,传递给ENTRYPOINT
CMD、ENTRYPOINT组合使用
CMD是容器默认要执行的命令。
ENTRYPOINT是启动容器真正要执行的命令。
CMD和ENTRYPOINT的区别
可以使用exec格式进行替换:ENTRYPOINT [\"/bin/sh\
shell和exec的区别
Supervisor
Dockerfile保留字指令
运行 -f 表示的位置的Dockerfile文件,并且镜像的仓库和镜像的名称可以指定,:后面为自定义的程序版本
docker build -f /dockerfile文件位置 -t 仓库名/镜像名:TAG .
表名在当前位置查找dockerfile文件,并进行镜像构建
docker build -t=\"仓库名/镜像名:tag\" .
构建镜像命令
如果镜像构建过程中失败,因为镜像是一层层构建的,因此会有镜像缓存。查看构建信息,在失败操作之前的镜像构建都是成功的,并且会返回成功镜像的ID
例如上一层镜像的ID为 123456 ,我们可以运行这个中间镜像。b style=\
调试过程。
调试构建镜像
Dockerfile构建镜像
Dockerfile
挂载数据卷的容器称为数据卷容器。其他容器通过挂载数据卷容器实现数据共享。
数据卷容器
docker run -v /宿主机目录:/容器目录 -it -name dc1 <镜像名>
docker run -it -name dc2 --volumn-from dc1 <镜像名>;可以将dc1上挂载的数据卷挂载到dc2上,
此时容器dc2继承(挂载)自dc01上,因此容器dc2和容器dc1对文件做任何改变都可以共享。
宿主机地址必须是绝对路径,如果目录不存在docker会自动创建路径。
docker 挂在的数据卷的默认权限是读写,如果用户想修改权限,也可以修改为只读。这样容器就只能读数据卷中的数据,不能修改数据了。
:ro — 只读 readOnly:rw — 读写 redawrite
数据卷挂载时,如果只写了 -v /docker路径,则将数据卷挂载到了docker文件夹下。b style=\
只读:docker run -v /宿主机目录:/容器目录:ro --name 容器名称 镜像名
容器间的共享传递
问题:当删除了dc01后,dc02是否会收到影响,挂载出现问题,不能访问数据卷中的文件。答案:删除dc01后,不会影响dc02访问数据卷;同样,如果有其他的容器--volume-from一个数据卷容器,也可以实现数据共享。结论:因此,容器之间挂载数据卷,实现数据共享,数据卷的生命周期一直存在,直到没有容器使用数据卷为止。
可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移
docker run -i -t --volumes-from data -v $(pwd):/backup docker/whalesay tar cvf /backup/backup.tar /data
将名为 data 的数据卷容器和名为 docker/whalesay 的容器共享数据卷,同时将当前目录挂载到容器的 /backup 目录,在容器中执行压缩命令:tar -cvf /backup/backup.tar /data ;目的是将/data中的数据打包压缩到 挂载目录下。
迁移:docker run -it --rm --volume-from 数据卷容器 -v $(pwd):/backup 镜像名 [tar xvf 压缩文件.tar /data(数据卷容器共享的地址)]
迁移、备份:
迁移数据
存储(数据卷)
Docker 通过 Linux 的 Namespace 实现与宿主机的资源隔离
Docker 启动后会在宿主机上创建一个 docker0 的虚拟网桥,相当于软件交换机。其作用是实现容器和宿主机之间的通信、转发。
Docker 会随机分配一个IP地址给docker0,172.17.0.0段。当容器启动后,在容器内部会启动eth0的网卡,docker0也会生成veth的虚拟网卡和容器的网卡进行桥接
Docker实现网络通信
host:容器不会自动创建虚拟网卡,使用宿主机的IP和端口
contrainer:容器不会自己创建虚拟网卡,而是和一个指定的容器共用同一个IP,和范围端口
none:关闭了容器的网络功能
docker Bridge 拓扑地址
Bridge:为每个容器分配虚拟IP和端口,并将容器的网卡桥接到docker0的虚拟网桥,通过docker0和 iptables nat 表配置与宿主机通信
网络模式
docker network ls
查看bridge的详细信息:docker network inspect bridge
docker run -it --network=host/none/bridge
设置docker启动的网络模式
docker 默认的网络模式:Bridge模式
查看docker网络
Docker网桥是Linux网桥,因此可以使用 brctl show 来查看网桥和端口信息。新的容器被创建后,都会将docker0作为默认网关
docker0
将主机的 配置文件 通过挂载的方式挂在到容器中
docker 中的DNS服务
容器的网络拓扑是否关联。即所有的容器是否连接到docker0上
主机的防火墙软件 iptables 是否允许通过
容器间的访问需要两方面:
容器间访问
容器的访问控制,主要通过Linux上的 iptables 防火墙来实现。
(命令)sysctl net.ipv4.ip_forward(输出)nte.ipv4.ip_forward = 1
容器访问外部网络,需要本地系统的转发支持。
如果在Docker启动时,指定 --ip-forward=true,Docker 会自动的设定系统的 ip_forward参数为1
容器访问外部
本地容器访问外部地址时,iptable表都会 nat 成本地的IP地址(源地址伪装操作)
iptables -t nat -nL
在本地的iptable的nat表中添加相应的映射规则
外部程序访问容器时
外部访问容器
网络访问
网络
Docker
容器技术有哪些
轻量级,只打包了必要的依赖
秒即启动,与虚拟机相比启动速度在秒级
易于移植,一次构建,随处启动。
弹性伸缩,配合容器管理平台可以实现占用资源的伸缩。
容器的特点
现在市面上有多种容器技术,因此需要一个标准来规范容器技术。OCI(Open Container Initiative)推出开放容器标准。标准主要包括runtime运行时标准和image镜像标准
a). creating:使用 create 命令创建容器,这个过程称为创建中 b). created:容器创建出来,但是还没有运行,表示镜像和配置没有错误,容器能够运行在当前平台 c). running:容器的运行状态,里面的进程处于 up 状态,正在执行用户设定的任务 d). stopped:容器运行完成,或者运行出错,或者 stop 命令之后,容器处于暂停状态。这个状态,容器还有很多信息保存在平台中,并没有完全被删除
容器运行时标准 (runtime spec)
a). 文件系统:以 layer 保存的文件系统,每个 layer 保存了和上层之间变化的部分,layer 应该保存哪些文件,怎么表示增加、修改和删除的文件等; b). config 文件:保存了文件系统的层级信息(每个层级的 hash 值,以及历史信息),以及容器运行时需要的一些信息(比如环境变量、工作目录、命令参数、mount 列表),指定了镜像在某个特定平台和系统的配置。比较接近我们使用 docker inspect <image_id> 看到的内容; c). manifest 文件:镜像的 config 文件索引,有哪些 layer,额外的 annotation 信息,manifest 文件中保存了很多和当前平台有关的信息; d). index 文件:可选的文件,指向不同平台的 manifest 文件,这个文件能保证一个镜像可以跨平台使用,每个平台拥有不同的 manifest 文件,使用 index 作为索引。
容器镜像标准(image spec)
标准
容器标准化
容器技术的诞生其实主要解决了 PaaS 的层的技术实现。
容器化传统应用 提高现有应用的安全性和可移植性,节约成本。
持续集成、持续交付、持续部署 (CI/CD)。通过 Git 推送代码触发 CI/CD,可以做到快速构建镜像,快速部署到环境中。
微服务。容器适合将微服务打包在镜像中,运行在容器中,做到秒级启停、独立部署和服务松耦合的功能。
弹性调整。可以通过 Kubernetes 来实现计算资源的合理调配。
容器主要的适用场景
容器的使用场景
cgroup实现资源限制,namespace实现资源隔离。
cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。
cgroup
在每个容器中,我们都可以看到文件系统,网卡等资源,这些资源看上去是容器自己的。Linux 实现这种方式的技术是 namespace。namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。
Mount namespace 让容器看上去拥有整个文件系统。容器有自己的 / 目录,可以执行 mount 和 umount 命令。当然我们知道这些操作只在当前容器中生效,不会影响到 host 和其他容器。
Mount Namespace
UTS namespace 让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID。
UTS namespace
IPC namespace 让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起。
IPC namespace
PID namespace
Network namespace 让容器拥有自己独立的网卡、IP、路由等资源
Network namespace
User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。
User namespace
namespace隔离技术
namespace
容器的底层实现
https://blog.csdn.net/cbmljs/article/details/92804520
https://www.cnblogs.com/qcloud1001/p/9273549.html
底层实现说明
https://blog.csdn.net/weixin_42138362/article/details/111606841
底层实现举例
https://www.cnblogs.com/bakari/p/10613710.html
优秀博客
容器
Kubernetes
容器编排
Microservices(微服务)
Serverless(无服务架构)
Istio
Service Mesh(服务网格)
代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion构建工具:Ant、Gradle、maven自动部署:Capistrano、CodeDeploy持续集成(CI):Bamboo、Hudson、Jenkins(gitlab+gerrit+jenkins)配置管理:Ansible、Chef、Puppet、SaltStack、ScriptRock GuardRail容器:Docker、LXC、第三方厂商如AWS编排:Kubernetes、Core、Apache Mesos、DC/OS服务注册与发现:Zookeeper、etcd、Consul脚本语言:python、ruby、shell日志管理:ELK、Logentries系统监控:Datadog、Graphite、Icinga、Nagios性能监控:AppDynamics、New Relic、Splunk压力测试:JMeter、Blaze Meter、loader.io预警:PagerDuty、pingdom、厂商自带如AWS SNSHTTP加速器:Varnish消息总线:ActiveMQ、SQS应用服务器:Tomcat、JBossWeb服务器:Apache、Nginx、IIS数据库:MySQL、Oracle、PostgreSQL等关系型数据库;cassandra、mongoDB、redis等NoSQL数据库项目管理(PM):Jira、Asana、Taiga、Trello、Basecamp、Pivotal Tracker
技术链
https://blog.csdn.net/qwefgh123321/article/details/103861006
DevOps
用户只要接上网络,并通过浏览器,就能直接使用在云端上运行的应用,而不需要顾虑类似安装等琐事,并且免去初期高昂的软硬件投入。SaaS主要面对的是普通的用户。
Saas(软件即服务)
PaaS是构建在 IaaS 之上的一种平台服务,提供操作系统安装、监控和服务发现等功能,用户只需要部署自己的应用即可。PaaS主要的用户是开发人员。
Paas(平台即服务)
是服务器租赁并提供基础设施外包服务。IaaS主要的用户是系统管理员。
IaaS(基础架构即服务)
云服务模型
Cloud(云)
云原生
0 条评论
回复 删除
下一页