当前位置: 首页 > news >正文

云原生之基石-容器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技术肯定不是这么简单的应用了事,那么我们怎么管理多个镜像,怎么管理多个容器等,怎么解决我们现实中大规模部署运行应用程序,思考和解决这些问题是我们学习云原生技术的一个思路,我们不能为了技术而技术,一种技术引进必须是要解决企业的一个方面的实际问题的,接下来的文章我会继续探讨这一系列问题。

相关文章:

  • html5 audio video
  • 如何使用websocket
  • Excel——重复项处理
  • 14.2 url后端过滤器(❤❤)
  • UE4 C++创建摄像机摇臂和相机并且设置Transform
  • HiveSQL——借助聚合函数与case when行转列
  • 【Qt 学习之路】在 Qt 使用 ZeroMQ
  • JVM-双亲委派机制
  • 华为机考入门python3--(9)牛客9-提取不重复的整数
  • 【Django-ninja】在django ninja中处理异常
  • ANSI Escape Sequence 下落的方块
  • maven java 如何打纯源码zip包
  • “极简壁纸“爬虫JS逆向·实战
  • 微信小程序:父组件调用子组件的方法
  • 【OrangePi Zero2的系统移植】交叉编译工具链配置、wiringOP库、智能分类工程代码
  • 时间复杂度分析经典问题——最大子序列和
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 10个最佳ES6特性 ES7与ES8的特性
  • CAP理论的例子讲解
  • Git学习与使用心得(1)—— 初始化
  • HomeBrew常规使用教程
  • Javascript 原型链
  • JS学习笔记——闭包
  • mysql 数据库四种事务隔离级别
  • Shadow DOM 内部构造及如何构建独立组件
  • Spark学习笔记之相关记录
  • Spring框架之我见(三)——IOC、AOP
  • VuePress 静态网站生成
  • Zepto.js源码学习之二
  • 从setTimeout-setInterval看JS线程
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 区块链将重新定义世界
  • 如何选择开源的机器学习框架?
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 终端用户监控:真实用户监控还是模拟监控?
  • HanLP分词命名实体提取详解
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • !!Dom4j 学习笔记
  • # centos7下FFmpeg环境部署记录
  • #《AI中文版》V3 第 1 章 概述
  • (06)Hive——正则表达式
  • (7)STL算法之交换赋值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (vue)页面文件上传获取:action地址
  • (windows2012共享文件夹和防火墙设置
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三分钟了解debug)SLAM研究方向-Debug总结