云原生之基石-容器Docker

1. 云原生应用程序部署需求

        云原生应用程序采用微服务架构来开发,势必产生大量的子系统,发布大量的程序包,部署起来工作量不小。

        程序运行是有依赖的,C/C++程序依赖各种动态库,Java程序依赖JDK和各种Jar库,Python程序依赖其解释器,目标操作系统必须满足一定的条件才能正常部署。

        大家会说,C/C++程序全部用静态链接方式,Java程序用SpringBoot打包本来就是可执行的,Python程序打包成可执行的,不就能解决上面讲的问题么,但实际打包部署中我们不会这么做,总有不这么做的情形,或者开发人员不关心运维人员的工作,根本就不理解其中的一些工作量。

        有没有一种统一的方法,在开发环境就把所有的依赖解决了,目标系统真正地不需要关心这些环境依赖问题?2013年Docker技术横空出世,完美地解决了这一系列问题。        

2. Docker技术横空出世

        Docker最初是dotCloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新。Docker项目后来加入了Linux基金会,遵从了Apache 2.0协议,项目代码在GitHub上进行维护。Docker自开源后受到广泛的关注和讨论,以至于dotCloud公司后来都改名为Docker Inc,并专注于Docker相关技术和产品的开发。目前,Docker已经成为全球最大的Docker容器服务提供商。

        因此,Docker背后的开发公司就是Docker Inc。它提供了Docker这个开源项目,并持续对其进行维护和更新。Docker Inc致力于推动容器技术的发展,使得开发者可以更加高效、便捷地打包、部署和管理应用程序。

        Docker是一个被广泛使用的开源容器引擎,它基于Linux内核的Cgroups、NameSpace,以及UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。Docker提供了一种特殊进程的方式,可以在宿主机上运行,并且依赖于Linux内核特性:名字空间(namespace)进行资源的隔离和cgroups(限制、记录任务组所使用的物理资源)。

3. Docker技术完美解决部署依赖问题

        Docker也可以对应用程序进行打包,允许开发者将他们的应用以及依赖包一起打包到一个可移植的容器中,然后发布到任何流行的Linux机器上,实现虚拟化。

Docker的设计目标包括:

  1. 提供一个简单的应用程序打包工具,开发者只需要关心如何打包容器,而不需要关心具体的配置。
  2. 实现开发人员和运维人员的职责逻辑分离,运维人员只需要关心如何管理这些容器。
  3. 在不同的环境中保持一致性,无论是测试环境还是正式环境,只需要部署Docker镜像即可。

        Docker的主要组件包括Docker Client(客户端)、Docker Daemon(守护进程)、Images(镜像)、Containers(容器)等。

        Docker Daemon是一个运行在宿主机(DOCKER-HOST)的后台进程,可通过Docker客户端与之通信。

        Images是Docker的镜像,相当于一个root文件系统,是只读的模板,用来创建Containers。

        Containers是Docker的运行实例,它可以被创建、启动、停止、移动或删除等。

        总的来说,Docker是一种轻量级的虚拟化技术,它可以让开发者更加高效、便捷地打包、部署和管理应用程序。

4. Docker安装

        作为一个系统架构师,我们最重要的是要搞清楚Docker技术解决了我们什么问题,然后来看看我们系统面对的问题,以及我们最合适的解决方案,Docker技术是否是我们最合适的解决方案,或者其中一部分。

        如果我们明确了这个问题,下决心选择了Docker技术,接下来具体安装工作,开发人员和运维人员都可以去做,用不着系统架构师自己亲自动手,下面把几年前运维人员安装的简单方法做一个记录,可能操作系统版本已经旧了,但基本方法是一样的。

        我们第一版是在ubuntu 16系统下安装的,第二版是在ubuntu 22系统下安装的,其实按照Docker官网Install Docker Engine on Ubuntu | Docker Docs进行安装即可,根本不用看二手资料。

4.1 检查操作系统安装的内核包


  sudo apt-get update
  sudo dpkg --get-selections |grep linux-image
  uname -r

4.2 安装docker需要的内核包


  sudo apt-get install linux-image-extra-virtual

  sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

4.3 安装docker engine


  sudo apt-get update
  sudo apt-cache policy docker-ce
  sudo apt-get install -y docker-ce

4.4 查看dockerd服务状态


  sudo systemctl status docker

4.5 把用户加入到docker组


  Add the user int group docker:
    sudo usermod -aG docker ${USER}  

  Print user and group information for the specified USER:
    id -nG

5. Docker镜像制作与容器运行

        假如我们创建一个SpringBoot工程,名称为demo, 编译成可执行jar文件,有基本的配置文件和日志配置文件,现在我们来看怎么做一个Docker镜像。


5.1 制作Dockerfile


  # Demo for java

  # 指定一个基础镜像
  FROM openjdk:8u131

  # 指定时区
  RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  RUN echo 'Asia/Shanghai' >/etc/timezone

  # 创建目录
  RUN mkdir /opt/demo
  RUN mkdir /opt/demo/config
  RUN mkdir /opt/demo/temp
  RUN mkdir /opt/demo/logs

  VOLUME /opt/demo/logs

  # 拷贝可执行jar文件和相关配置文件
  COPY ./demo.jar /opt/demo/
  COPY ./config/application.properties /opt/demo/config/
  COPY ./config/log4j2.xml /opt/demo/config/

  # 赋予可执行权限
  RUN chmod +x /opt/demo/demo.jar

  # 指定运行命令
  CMD /opt/demo/demo.jar 

2. 创建Docker镜像


  sudo docker build -t domo:v1 .

3. 运行Docker容器


  docker run -d -v /data/log/demo:/opt/demo/logs demo:v1
  docker ps
  docker ps -a

4. 删除Docker镜像


  docker rmi <IMAGE ID>
  如果有提示container还在关联引用着,不让删除的话,那先删除容器:
  docker rm <container ID>

 

6. 总结

        Docker技术以其一种轻量级的虚拟化技术完美地解决了云原生应用程序大规模部署时的依赖问题,相对于VMWare等虚拟机技术又非常之轻量小巧,让开发环境、测试环境和线上环境的部署行为一致,解放了生产力,值得我们好好研究和使用。

        以上讲得都是Docker作为一个技术工具,在单机上单程序打包运行的方案,Docker技术肯定不是这么简单的应用了事,那么我们怎么管理多个镜像,怎么管理多个容器等,怎么解决我们现实中大规模部署运行应用程序,思考和解决这些问题是我们学习云原生技术的一个思路,我们不能为了技术而技术,一种技术引进必须是要解决企业的一个方面的实际问题的,接下来的文章我会继续探讨这一系列问题。

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

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

相关文章

[office] excel求乘积的公式和方法 #媒体#笔记#经验分享

excel求乘积的公式和方法 本文首先给出两个常规的excel求乘积的链接&#xff0c;然后再例举了一个文字和数字在同一单元格里面的excel求乘积的公式写法。 excel求乘积的方法分为两种&#xff0c;第一种是直接用四则运算的*来求乘积&#xff0c;另外一种就是使用PRODUCT乘积函数…

AJAX——认识URL

1 什么是URL&#xff1f; 统一资源定位符&#xff08;英语&#xff1a;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff0c;或称统一资源定位器、定位地址、URL地址&#xff09;俗称网页地址&#xff0c;简称网址&#xff0c;是因特网上标准的资源的地址&…

2024年【氧化工艺】新版试题及氧化工艺操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 氧化工艺新版试题是安全生产模拟考试一点通生成的&#xff0c;氧化工艺证模拟考试题库是根据氧化工艺最新版教材汇编出氧化工艺仿真模拟考试。2024年【氧化工艺】新版试题及氧化工艺操作证考试 1、【单选题】 对现场窨…

Python入门:常用模块—os模块及sys模块

os模块 sys模块 import sys print(sys.argv) # 命令参数list&#xff0c;第一个元素是程序本身路径 print(sys.exit()) # 退出程序&#xff0c;正常退出是exit(0) print(sys.version) # 获取python解释程序的版本信息 print(sys.maxint()) # 最大…

02.01_111期_C++_构造函数初始化列表笔记

运算符重载对 1. 操作数的个数 2. 操作数出现的顺序都有确定要求 所以如果 对 << 这个操作符进行重载&#xff0c; <<这个操作符有两个操作数&#xff0c;而且左右操作数有顺序要求 那么d1将成为this指针指向的对象&#xff0c;也将会 <&l…

SpringCloud-微服务概述、SpringCloud入门概述、服务提供与消费

1.学习前言 1.1 学习前提 熟练使用SpringBoot 微服务快速开发框架了解过Dubbo Zookeeper 分布式基础电脑配置内存不低于8G 1.2 文章大纲 Spring Cloud 五大组件 服务注册与发现——Netflix Eureka负载均衡&#xff1a; ​ 客户端负载均衡——Netflix Ribbon ​ 服务端负载…

KVM和JVM的虚拟化技术有何区别?

随着虚拟化技术的不断发展&#xff0c;KVM和JVM已成为两种主流的虚拟化技术。尽管它们都提供了虚拟化的解决方案&#xff0c;但它们在实现方式、功能和性能方面存在一些重要的差异。本文将深入探讨KVM和JVM的虚拟化技术之间的区别。 KVM&#xff08;Kernel-based Virtual Mac…

hive 创建表 字段类型

hive 创建表 字段类型 在Hive中创建表时可以指定不同的字段类型。常见的字段类型包括&#xff1a; 数值类型&#xff08;Numeric Types&#xff09;&#xff1a; TINYINT&#xff1a;8位有符号整数 SMALLINT&#xff1a;16位有符号整数 INT&#xff1a;32位有符号整数 BIG…

Select 选择器 el-option 回显错误 value

离谱 回显的内容不是 label 而是 value 的值 返回官方看说明&#xff1a; v-model的值为当前被选中的el-option的 value 属性值 value / v-model 绑定值有3种类型 boolean / string / number 根据自身代码猜测是&#xff1a;tableData.bookId 与 item.id 类型不一致导致 &…

H5/CSS 笔试面试考题(61-70)

简述下面语法中,哪个可以定义一个带正方形的列表? () A:list-style-image: square B:list-style-color: square C:list-type: square D:list-style-type: square 面试通过率:76.0% 推荐指数: ★★★★ 试题难度: 初级 试题类型: 选择题 答案:d 简述在 HTML 中,样…

问题:3【单选题】实现职业理想的一般步骤是()。 #媒体#媒体

问题&#xff1a;3【单选题】实现职业理想的一般步骤是()。 A、创业-立业-择业 B、择业-创业-立业 C、择业-立业-创业 D、立业-择业-创业 参考答案如图所示

【几分钟】快速熟悉torch.save()、torch.load()、torch.nn.Module.load_state_dict()

【几分钟】快速熟悉torch.save()、torch.load()、torch.nn.Module.load_state_dict() &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;torch.save()详解&#x1f333;&#x1f333;torch.load()详解&#x1f333;&#x1f333;torch.nn.Modul…

php文件请求

/** Common File Request Method */ $file $request->file(‘file’); $file->getClientOriginalName(); // Returns the original file name $file->getClientOriginalExtension(); // Returns the original file extension $file->getClientMimeType(); // Ret…

c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)

至于枚举 会用就行 至少目前我感觉没什么太多问题 enum 被称为无作用域枚举 &#xff0c; enumclass / enumstruct 被称为有作用域枚举 看到了吧 语法规则 和 struct 差不多 只不过枚举成员 只是一个标志 它本质是数值 从上到下 下面的数根据上面的数 加 1 也可以直接…

YUM | 包安装 | 管理

YUM 功能 软件包安装&#xff1a; 通过yum命令安装软件包。例如&#xff0c;安装一个名为 example-package 的软件包 yum install example-package更新包 检查更新&#xff1a; 检查可用更新&#xff1a; sudo yum check-update <package_name>软件包更新&#xff1a; y…

python_ACM模式《剑指offer刷题》二叉树2

题目&#xff1a; 面试tips&#xff1a; 面试官有可能问到&#xff1a; 如果你需要频繁地查找第 k 小的值&#xff0c;你将如何优化算法&#xff1f;&#xff08;见思路三&#xff09; 思路&#xff1a; 思路一&#xff1a;二叉搜索树最大的特点就是中序遍历是递增的。因此…

蓝桥杯每日一题------背包问题(一)

背包问题 阅读小提示&#xff1a;这篇文章稍微有点长&#xff0c;希望可以对背包问题进行系统详细的讲解&#xff0c;在看的过程中如果有任何疑问请在评论区里指出。因为篇幅过长也可以进行选择性阅读&#xff0c;读取自己想要的那一部分即可。 前言 背包问题可以看作动态规…

CTFSHOW命令执行web入门29-54

description: >- 这里就记录一下ctfshow的刷题记录是web入门的命令执行专题里面的题目,他是有分类,并且覆盖也很广泛,所以就通过刷这个来,不过里面有一些脚本的题目发现我自己根本不会笑死。 如果还不怎么知道写题的话,可以去看我的gitbook,当然csdn我也转载了我自己的…

12.3 OpenGL顶点后处理:平面着色

平面着色 Flatshading Flat shading (平面着色)是一种简化渲染技术&#xff0c;它在光栅化阶段将一个图元&#xff08;primitive&#xff09;的所有顶点赋予相同的颜色或其它输出变量的值。这些赋予的值来自于该图元的“引发顶点”&#xff08;provoking vertex&#xff09;。…

幻兽帕鲁服务器怎么更新?如何快速在腾讯云更新幻兽帕鲁Palworld服务器,显示版本不兼容怎么解决

幻兽帕鲁服务器怎么更新&#xff1f;如何快速在腾讯云更新幻兽帕鲁Palworld服务器&#xff0c;显示版本不兼容怎么解决。最近的幻兽帕鲁服务器又更新了。 如何在不需要远程登录服务器的情况下&#xff0c;通过一行命令来更新幻兽帕鲁呢&#xff1f; 腾讯云轻量云一键部署幻兽…