docker的前世今生

docker来自哪里?

从我们运维部署的历史来看,宿主机从最初的物理机到虚拟机,再到docker,一步步演进到现在。技术演进其实是为了解决当前技术的痛点,那我们来看看有哪些痛点以及如何克服痛点的。

物理机

一般来说,一台物理服务器的配置都很高,都会部署较多的服务以充分利用物理机的资源,这就会带来许多的问题

  1. 服务之间互相影响,如A服务占满了CPU或内存,就会把机器上所有服务都卡死
  2. 资源浪费,若服务对基础环境的要求不一致,如linux或java版本等,那么服务就得放在别的机器上
  3. 故障恢复困难,一旦系统出现故障或卡死,需要重启机器上的所有服务,经历过的都知道,时间漫长且困难

虚拟机

既然物理机有以上问题,那么怎么解决呢?从解决问题的思路上来说,就是隔离,把基础环境隔离,服务隔离,这就引入了虚拟机,通过虚拟化技术,将一台物理机隔离成多个独立的虚拟机,互不受影响,这样就能部分解决物理机的问题,所有的影响都限制到了单台虚拟机,而不是整台物理机。当然,引入虚拟机也有对应的问题,以及提出了更高的要求

  1. 虚拟机的管理复杂,存在管理虚机的消耗
  2. 虚机的依赖管理复杂,常常遇到测试环境没问题,而生产环境报错的情况

docker

那么,虚拟机上面的问题,该如何解决呢?再次隔离,把每个服务都进行隔离,互不影响,这样就将影响降低到最小。那么docker就应运而生,每个服务就是一个容器,互相隔离,环境版本都可以根据自己的需求进行配置,服务出现故障不会影响其他服务,也不会因为资源占用问题,夯死整台机器。此外容器的故障恢复速度非常快,基本是秒级。

关于解决虚拟机的问题,docker解决了虚机的依赖管理复杂的问题,这是毋庸置疑的。此外,docker是不需要虚拟机的,若直接部署在物理机上,那么就解决虚拟机管理复杂的问题(因为实际原因,docker可能是部署在虚机上的)。当然任何的新技术都会引入新的问题,关于docker的问题,后面介绍k8s的时候再介绍。

docker现在何处

docker的基本使用

docker可以简单分为两块,一个是镜像,一个是容器。镜像是静态的,容器是运行时。那么我们先看看镜像是如何创建的。

编写dockerfile
# 基础镜像
FROM dockerhub.kubekey.local/public/openjdk:8
# 对外暴露的端口
EXPOSE 8082
EXPOSE 9998
#启动时接受的参数
ARG profile
ENV profile ${profile}
RUN echo "profile: ${profile}"
# 将原路径复制到镜像内的目录下
COPY ./OaCenter-1.0-SNAPSHOT.jar /jar/OaCenter-1.0-SNAPSHOT.jar##统一内部时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone# 启动时执行命令
ENTRYPOINT java -server -Xms4g -Xmx4g -Xss512M -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/outOfMemory.hprof -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20m -Xloggc:/logs/gc.log -jar /jar/OaCenter-1.0-SNAPSHOT.jar --spring.profiles.active=${profile}
构建镜像
docker build --build-arg profile=uat -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$BUILD_NUMBER .
运行镜像
docker run -d $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$BUILD_NUMBER --name xxx

至此,容器就运行起来,对外提供服务了。

docker运维的常用命令

# 停止容器
docker stop xxx
# 重启容器
docker restart xxx
#进入容器
docker exec -it xxx bash
# 进入 shell启动的容器
docker exec -it xxx sh
# 查看所有容器
docker ps
# 查看所有容器,包括停止的
docker ps -a
# 容器的状态
docker stats
# 查看某个容器的详细信息
docker inspect xxx
# 复制容器的文件到宿主机
docker cp xxx:src_path dest_path
# 复制宿主机文件到容器
docker cp src_path xxx:dest_path
# 查看容器的日志
docker logs -f xxx
# 清理未使用的镜像、容器、卷和网络。
docker system prune

docker三板斧

一个容器服务突然报错,该如何处理?

第一步:docker ps

docker ps查看所有容器,若没看到,那么docker ps -a,如果docker ps -a也没看到,那么恭喜你,三板斧失败,你需要找到镜像文件,用启动命令或脚本去启动了。反之,如遇到下面三种情况,那么直接docker restart xxx,一般80%的情况下都能解决问题。

  1. docker ps没看到,docker ps -a看到了
  2. status为Exited
  3. status为UP,括号里unhealthy
docker ps
CONTAINER ID   IMAGE          COMMAND                  PORTS                status    NAMES
09b93464c2f7   nginx:latest   "nginx -g 'daemon off"   80/tcp, 443/tcp       Up 16 hours (healthy)         myrunoob
96f7f14e99ab   mysql:5.6      "docker-entrypoint.sh"   0.0.0.0:3306->3306/tcp Exited(0) 16 hours ago       mymysql

Up:表示容器正在运行中。

Created:表示容器已经被创建,但还未启动。

Exited:表示容器已经停止运行

第二步:docker logs -f xxx

容器若重启失败,那么就得看容器的日志了,从容器的日志查看失败的原因,可能内存不足,配置缺失等等,如果找到服务失败的原因,并解决掉,然后docker restart xxx,应该也能解决问题。

第三步:docker inspect xxx

主要检查State,Env,HostConfig里面的信息,一般来说就能看到错误的原因,针对性的去处理即可。

docker inspect xxx
[{"Id": "d2f5e3f19a6a","Created": "2024-07-23T00:00:00Z","Path": "bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 12345,"ExitCode": 0,"Error": "","StartedAt": "2024-07-23T00:00:00Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:abc123","ResolvConfPath": "/var/lib/docker/containers/d2f5e3f19a6a/resolv.conf","HostnamePath": "/var/lib/docker/containers/d2f5e3f19a6a/hostname","HostsPath": "/var/lib/docker/containers/d2f5e3f19a6a/hosts","LogPath": "/var/lib/docker/containers/d2f5e3f19a6a/d2f5e3f19a6a-json.log","Name": "/my_container","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"CapAdd": null,"CapDrop": null,"Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","ConsoleSize": [0,0],"Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": null,"BlkioDeviceReadBps": null,"BlkioDeviceWriteBps": null,"BlkioDeviceReadIOps": null,"BlkioDeviceWriteIOps": null,"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": null,"DiskQuota": 0,"KernelMemory": 0,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"Mounts": [],"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/l/abc123/diff","MergedDir": "/var/lib/docker/overlay2/merged","UpperDir": "/var/lib/docker/overlay2/upper","WorkDir": "/var/lib/docker/overlay2/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "d2f5e3f19a6a","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["bash"],"Image": "ubuntu","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {}},"NetworkSettings": {"Bridge": "","SandboxID": "abc123","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/abc123","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "abc123","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "abc123","EndpointID": "abc123","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null}}}}
]

一般来说,三板斧能解决95%以上的问题。当然还有一些情况,比如我近期遇到过修改宿主机iptables,导致容器挂掉的情况,重启也会失败,这种情况,需要重启宿主机就能解决此问题。

docker的原理和优势

原理

主要是利用了Linux内核的特性:namespacecgrouprootfs

  1. namespace将文件,网络,进程和权限进行隔离。
  2. cgroup限制namespace可使用的资源,如cpu,内存等
  3. rootfs用以创建新的根文件系统
优势
  1. 独立性,每个容器完全隔离,不会互相影响
  2. 启动快,容器因为简单和资源少,启动速度在秒级
  3. 运行环境一致,不会出现测试环境可以,生产环境失败的情况
  4. 迁移快,更换机器或者扩展节点,只需保存容器,在新机器上启动即可

docker去向何方

docker已经很方便了,为何现在k8s更如火如荼呢?这时候就得说到docker的缺点了。在大型系统中,采用微服务+docker部署方式之后,同时可能存在几百上千的容器在同时运行,同时产生的就是管理问题。我怎么把上千的容器部署到对应的节点上,怎么对容器进行部署重启,总不能一台机器一台机器上去运维部署,这显然不符合技术自动化发展的趋势。在这种情况下,k8s应运而生(其实不仅仅有k8s,还有docker swam等,最后k8s脱颖而出)。k8s简单来说就是容器编排工具,那么我们看看k8s的架构图。

在这里插入图片描述

Controller Manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

API Server 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;

Scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;

Kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;

etcd 保存了整个集群的状态;

Kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;

总结

k8s为使用大规模容器服务提供了极大的便利,对于持续部署和自动化运维几乎都是一键操作。但是在最新的k8s版本已经舍弃了docker,后面可以继续聊聊这个的原因以及k8s的详细介绍和运维

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6249.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑办公技巧之如何在 Word 文档中添加文字或图片水印

Microsoft Word是全球最广泛使用的文字处理软件之一,它为用户提供了丰富的编辑功能来美化和保护文档。其中,“水印”是一种特别有用的功能,它可以用于标识文档状态(如“草稿”或“机密”)、公司标志或是版权信息等。本…

【机器学习案列】探索各因素对睡眠时间影响的回归分析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

2024年度总结

迟来的2024年度总结,本文主要包括创作经历的回顾、个人成长与突破、以及职业与生活的平衡。 文章目录 1、 创作经历回顾2、 成长回顾3、 职业与生活的平衡4、 展望未来 1、 创作经历回顾 从高中开始就喜欢给别人解答疑问,大学学习模电、数电时&#xff…

vim在命令模式下的查找功能

/ab 从上往下 n 下一个 N 上一个 示例: 在命令模式下直接点击键盘上的/就可以进行查找,比如我要查找a,输入a后再回车,就可以检索出文件中所有和a有关的内容。 ?ab 从下往上 N 下一个 n 上一个 示例:和上图相同…

机器学习-使用梯度下降最小化均方误差

前面有一篇文章《机器学习-常用的三种梯度下降法》,这篇文章中对于均方误差的求偏导是错误的,为了澄清这个问题,我再写一篇文章来纠正一下,避免误导大家。 一、批量梯度下降法 我们用 批量梯度下降法 来求解一个简单的 线性回归…

基于quartz,刷新定时器的cron表达式

文章目录 前言基于quartz,刷新定时器的cron表达式1. 先看一下测试效果2. 实现代码 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&…

LabVIEW智能胎压监测

汽车行车安全是社会关注焦点,轮胎压力异常易引发交通事故,开发胎压监测系统可保障行车安全、降低事故发生率。 系统组成与特点 (一)硬件组成 BMP - 280 气体压力传感器:高精度、稳定性好、能耗低,适合车载…

C语言教程——文件处理(1)

目录 前言 二、什么是文件 2.1文件的概念 2.2程序文件 2.3数据文件 2.4文件名 2.5二进制文件和文本文件 三、文件操作 3.1文件指针 3.2文件的打开与关闭 四、文件的顺序读写 4.1fgetc 4.2fputc 4.3fputs 4.4fgets 总结 前言 我们知道电脑上有许许多多的文件&a…

【橘子ES】Kibana的分析能力Analytics简易分析

一、kibana是啥,能干嘛 我们经常会用es来实现一些关于检索,关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI,你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

c#的tabControl控件实现自定义标签颜色

最近项目需要自定义tabControl控件颜色,而默认这个控件是不支持自定义标签颜色的,于是想办法实现了这个功能,效果如下图所示: 直接上代码: using System; using System.Collections.Generic; using System.ComponentM…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件,最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型,具备高吞吐、低延迟、高可用和强一致性的特点,适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

Odoo免费开源ERP最佳业务实践:生产管理

文 / 开源智造(OSCG) Odoo亚太金牌服务 概述 Odoo是全球排名第一的免费开源ERP系统,以其强大的功能和模块化设计著称,适用于各种规模及类型的企业。Odoo集成了生产、采购、销售、库存、财务、人力资源、市场营销、电子商务等多个…

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…

【2024年华为OD机试】(A卷,200分)- 优雅子数组 (JavaScriptJava PythonC/C++)

一、问题描述 题目描述 如果一个数组中出现次数最多的元素出现大于等于 k 次&#xff0c;被称为 k-优雅数组&#xff0c;k 也可以被称为优雅阈值。 例如&#xff1a; 数组 [1, 2, 3, 1, 2, 3, 1] 是一个 3-优雅数组&#xff0c;因为元素 1 出现次数大于等于 3 次。数组 [1,…

电子应用设计方案102:智能家庭AI鱼缸系统设计

智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境&#xff0c;同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定&#xff0c;包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

Vue3.5 企业级管理系统实战(三):页面布局及样式处理 (Scss UnoCSS )

本章主要是关于整体页面布局及样式处理&#xff0c;在进行这一章代码前&#xff0c;先将前两章中的示例代码部分删除&#xff08;如Home.vue、About.vue、counter.ts、App.vue中引用等&#xff09; 1 整体页面布局 页面整体布局构成了产品的框架基础&#xff0c;通常涵盖主导…

Linux 消息队列的使用方法

文章目录 1.概念2. 创建消息队列3. 发送消息4. 接收消息5. 消息结构体6. 消息队列控制&#xff08;删除、获取队列状态&#xff09;消息队列是否存在7. 使用场景8. 注意事项使用例子判断消息队列是否存在的代码获取队列空间大小 1.概念 消息队列是一种进程间通信 (IPC) 机制&a…

低代码可视化-转盘小游戏可视化-代码生成器

转盘小程序是一种互动工具&#xff0c;它通过模拟真实的转盘抽奖或决策体验&#xff0c;为用户提供了一种有趣且公平的选择方式。以下是对转盘小程序的详细介绍&#xff1a; 转盘小程序的应用场景 日常决策&#xff1a;转盘小程序可以帮助用户解决日常生活中的选择困难问题&a…

【Prometheus】Prometheus如何监控Haproxy

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…