第1次实践作业

课程调查

以为是脱离企业需求的校内课程,没想到是软件开发相关技术课程。但是听到说像软工实践类似的课程还是有些害怕,毕竟不是一个人能够轻松完成的。因为疫情的关系,本学期的时间严重不足,希望不要占用太多时间为好。

了解微服务

微服务是一种软件开发技术,是面向服务的体系结构(SOA)结构样式的一种变体,它将应用程序安排为一组松散耦合的服务。在微服务架构中,服务是细粒度的,协议是轻量级的。

Martin Fowler将基于微服务的体系结构描述为具有以下属性:

  • 适合于持续交付软件开发过程。对应用程序的一小部分进行更改仅需要重建和重新部署一个或少量服务。
  • 遵循诸如细粒度的接口(可独立部署的服务),业务驱动的开发(例如域驱动的设计)之类的原则。

概念

微服务运用了以业务功能为导向的设计概念,应用程序在设计时对业务功能或流程设计先行分割,将各个业务功能都独立实现成一个能自主运行的个体服务,然后再利用相同的协议将所有应用程序需要的服务都组合起来,形成一个应用程序。

若需要针对特定业务功能进行扩展时,只要对该业务功能的服务进行扩展就好,不需要整个应用程序都扩展,同时,由于微服务是以业务功能导向的实现,因此不会受到应用程序的干扰,微服务的管理员可以视运算资源的需要来配置微服务到不同的运算资源内,或是布建新的运算资源并将它配置进去。

好处

  • 模块化:这使应用程序更易于理解,开发,测试,并且对体系结构侵蚀更具弹性。
  • 可扩展性:由于微服务彼此独立地实现和部署,即它们在独立的进程中运行,因此可以独立地对其进行监视和扩展。
  • 分布式开发:它支持小团队自主开发,部署和独立扩展服务;还允许通过连续重构出现单个服务的体系结构。基于微服务的体系结构促进了持续集成,持续交付和部署。

缺点

  • 服务构成信息障碍。就网络延迟和消息处理时间而言,网络上的服务间调用比整体服务过程中的进程内调用成本高。
  • 测试和部署更加复杂。微服务是独立的,可以使用多种编程语言进行开发。但是每种语言都依赖于其自己的库和框架,因此,这些正在运行的多种编程语言将需要一套完全不同的库和框架。这增加了资源开销(和成本),并使部署成为复杂的考虑因素。
  • 认知负荷。该架构引入了额外的复杂性和新问题,例如网络延迟,消息格式设计,备份/可用性/一致性(BAC),负载平衡和容错。根据2020年微服务状态报告的发现,维护和调试仍然是构建微服务开发团队的最大问题之一。

Docke与微服务

由于微服务是独立的,独立的应用程序单元,每个微服务单元仅履行一个特定的业务功能,因此,它们本身可以被视为小型应用程序。如果应用程序创建十几个微服务或者构建具有不同技术栈的多个微服务,那么,开发团队很快就会遇到麻烦,因为开发人员必须负责比开发传统的单体应用程序更多的开发任务。

不过,目前有一个解决方案:使用容器封装每个微服务。Docker是一个容器化工具,旨在提供一种更简单的方式来处理容器化应用程序。它将微服务封装为所谓的Docker container,然后可以对其进行独立维护和部署。每一个容器中将负责一种特定的业务功能,而开发人员只需专注于自身的技术特点,开发微服务并将微服务封装成容器,微服务之间架构的任务只需交给另一些专业人员即可。

优点

  • Docker是一种流行的,不断发展的软件,具有出色的社区支持,并为微服务而构建
  • 与VM相比,它是轻量级的,从而使其成本和资源效率更高
  • 它提供了跨开发和生产环境的统一性,使其非常适合构建云原生应用程序
  • 它提供了用于持续集成和部署的工具
  • Docker提供了与流行工具和服务的集成,例如AWS,Microsoft Azure,Ansible,Kubernetes,Istio等。

学习docker技术

什么是docker

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

docker基本概念

Docker 包括三个基本概念:镜像(Image)、容器(Container)、仓库(Repository)

镜像

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。

仓库

一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

docker compose

Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排。Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。

Dockerfile

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

Docker Machine

Docker Machine 是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,可以使用Docker Machine在本地的MAC或者windows box、公司网络,数据中心或者AWS这样的云提供商上创建docker。Docker Machine 也可以集中管理所以得docker主机。

Docker Swarm

Docker Swarm提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。Docker Swarm 可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

kubernetes(k8s)

Kubernetes(k8s)是Google开源的容器集群管理系统。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

搭建docker环境

安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装:

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

安装完成后输入:

$ docker version

出现版本信息即为成功安装。

Docker 镜像加速器

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

  • Docker 官方提供的中国 registry mirror
  • 阿里云加速器
  • DaoCloud 加速器

这里以阿里云加速器为例进行介绍。在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
        "registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"]
}

之后重启服务。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

在命令行执行

$ docker info

如果从结果中看到了如下内容,说明配置成功。

使用docker镜像

获取

从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
  • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
  • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
    如:
$ docker pull tomcat

上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 tomcat,因此将会获取官方镜像 library/tomcat 仓库中标签为 latest(默认) 的镜像。

查询

使用命令:

docker images

可以查看目前docker已获取的镜像。列表包含了 仓库名标签镜像 ID创建时间 以及 所占用的空间

运行

有了镜像后,就能够以这个镜像为基础启动并运行一个容器。以上面的 tomcat 为例,打算启动以tomcat为镜像的容器,可以输入下面的命令:

$ docker run -it --rm -p 8080:8080 tomcat

下面验证一下tomcat是否启动成功。

再登陆hub.docker.com中查看版本是否正确。

可以看到,tomcat的版本号正好是5.54,与hub.docker.com中一致。

删除

如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为:

$ docker image rm [选项] <镜像1> [<镜像2> ...]

其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。
如:

docker image rm tomcat

使用docker容器

启动

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。所需要的命令主要为 docker run。

以上面的 tomcat 为例,打算新建以tomcat为镜像的容器并启动,可以输入下面的命令:

$ docker run -it --rm -p 8080:8080 tomcat

下面验证一下tomcat是否启动成功。

可以利用

$ docker container start

直接将一个已经终止的容器启动运行。

终止

使用

$ docker container stop CONTAINER ID

来终止一个容器

进入

在启动容器时附带-d参数,容器会在后台驻留。这时如果需要进入容器,可以使用

$ docker exec -it CONTAINER ID bash

进入容器。其中参数 i 表示交互式,参数 t 表示以Linux 终端形式进行。

退出容器时,输入 exit 即可。

删除

使用

$ docker container rm

来删除一个容器。需要注意的是,在删除一个容器前,必须先终止它,否则出现错误提示。

使用docker仓库

注册

登录 https://hub.docker.com/ 免费注册一个属于自己的个人账户。

登录

使用

$ docker login

命令,并根据提示登录账号。

搜索

使用

$ dokcer search

可以搜索在docker hub中的相关镜像。如 docker search mysql:

可以看到有关MySQL镜像的信息,其中包括镜像名字、描述、收藏数(表示该镜像的受关注程度)、是否官方创建、是否自动创建。另外,在查找的时候通过 --filter=stars=N 参数可以指定仅显示收藏数量为 N 以上的镜像。

拉取

使用

$ docker pull

进行拉取镜像操作。如 docker pull mysql:

推送

先使用

$ docker tag

为镜像打上自己的用户名/镜像名:标签。再使用

$ docker push

将镜像推送到自己的镜像仓库。

登录docker hub,能够看到相关镜像仓库

原文地址:https://www.cnblogs.com/auspiciousjimmy/p/12691001.html