2020系统综合实践 第1次实践作业
一.课程调查
进入大三下学期的后半段,大学阶段的理论课程应该已经修得八九不离十了,在这个时间点迎来系统综合实践这门课,作为培养计划的一门新课程,我们非常希望了解你们对于课程的希望,请写下你对这门课的认识和你理想中的这门课程是怎么样的。
- 这门课在我看到名字后似懂非懂,有点陌生,因为这门课不像有些实践课是有理论课搭配的,看到系统和综合,我想可能是要把前两年学到的知识综合运用的实践课,应该会有一定的难度。在第一次上课中看到docker、镜像等一系列名词时,又觉得不是那么陌生,虽然这些知识没学过,但是曾经见到过,有一些印象。我对这门课的希望是可以实际地提高我们的动手能力,学到一些方便我们使用计算机的知识技能,因为我觉得现在我们大部分人动手能力比较弱,而计算机又是工科,实践能力是必不可少的。
二.了解微服务
第一次作业我们将接触一种新型的软件架构——微服务(也许部分同学已经有所了解)。大家要做的是学习并了解该技术,微服务是什么,有什么特点,相较于传统的软件架构,它有什么优缺点,它是怎样部署的。
-
微服务是什么?
- 维基百科:微服务的概念最早是在 2014 年由 Martin Fowler 和 James Lewis 共同提出,他们定义了微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通讯。同时,服务会使用最小规模的集中管理 (例如 Docker)技术,服务可以用不同的编程语言与数据库等。
- 百度百科:微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。
- 看了一些定义之后我的理解就是把一款功能复杂的程序拆分成多个小的功能单一的程序。
-
微服务特点
- 按照业务来划分服务,单个服务代码量小,业务单一,易于维护。
- 每个微服务都有自己独立的基本组件,例如数据库、缓存等,且运行在独立的进程中。
- 微服务之间的通信是通过HTTP协议或者消息组件,且具有容错能力。
- 微服务有一套服务治理的解决方案,服务之间不耦合,可以随时加入和剔除服务。
- 单个微服务能够集群化部署,并且有负载均衡的能力。
- 整个微服务系统应该有一个完整的安全机制,包括用户验证、权限验证、资源保护等。
- 整个微服务系统有链路追踪的能力。
- 有一套完整的实时日志系统。
-
微服务的优点
- 每个微服务都很小,这样能聚焦一个指定的业务功能或业务需求。
- 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。
- 拓展性好,有新功能需要添加的时候,那就再建立一个微服务,和之前的互不干扰。
- 它们往往比传统的应用程序更有效地利用计算资源。
- 维护起来比较简单,毕竟每一个服务只关注于项目中的一个小模块。
- 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
- 微服务架构有助于新兴的云服务,如事件驱动计算。
-
微服务的缺点
- 微服务将原来的函数式调用改为服务调用,不管是用rpc,还是http rest 方式,都是增大系统整体延迟。
- 分布式系统可能复杂难以管理。
- 部署复杂。
- 内存占用量更高。
- 微服务需要更多的技术全局考虑。
-
微服务的部署
- 单主机多服务实例模式
- 单主机单服务实例模式
- 单容器单服务实例模式
三.学习docker技术
学习了解docker的相关概念(容器、镜像等),了解docker、docker compose、Dockerfile、docker machine、Swarm、k8s是什么,是做什么用的,心中有概念即可;
-
Docker:Docker是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
-
镜像:Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
-
容器:镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
仓库:仓库可看着一个代码控制中心,用来保存镜像。
-
docker compose:Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
-
Dockerfile:在Docker中创建镜像最常用的方式,就是使用Dockerfile。Dockerfile是一个Docker镜像的描述文件,我们可以理解成火箭发射的A、B、C、D…的步骤。Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
-
Docker Machine:Docker Machine是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,可以使用Docker Machine在本地的MAC或者windows box、公司网络,数据中心或者AWS这样的云提供商上创建docker。使用docker-machine命令,可以启动、审查、停止、重启托管的docker 也可以升级Docker客户端和守护程序并配置docker客户端和宿主机通信。Docker Machine 也可以集中管理所以得docker主机。
-
Swarm:Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
-
k8s:Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。它是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
-
docker整体架构
搭建你自己的docker环境,系统环境不限(主流的有Ubuntu/CentOS/Debian/Windows/MacOS等),完成docker的基本入门,包括但不限于:容器的创建、删除、更新和查询,创建并维护自己的镜像仓库,实现拉取和上传镜像等。
容器部分
- 本次我使用的系统环境是ubuntu-18.04,根据作业提供的网站上一步一步安装docker,安装成功后进行了一个简单的测试,执行以下代码,结果如下,表明安装成功。
sudo docker run hello-world
- 安装成功后就开始docker一些基本的功能学习。首先学习容器使用,pull一个ubuntu镜像。(之前已经执行过相同的操作了,所以这里没有显示下载)
sudo docker pull ubuntu
- 然后我们用镜像来创建一个容器,这里版本号如果不指定会使用latest。
sudo docker run -t -i ubuntu /bin/bash
- 如图就表明我们已经创建了一个容器,接下来我们进行一些简单的操作,我们创建一个文件夹并进入,最后退出容器。
mkdir test
cd test
exit
- 接下来查看一下当前的容器,发现容器有两个,一个是我们测试安装docker时创建的,另外一个是我们刚才使用ubuntu镜像创建的
sudo docker ps -a
- 容器在退出后会停止,接下来使用启动命令,容器的状态重新变为运行的状态
sudo docker start [容器id]
- 我们也可以使运行的容器停止
sudo docker stop [容器id]
- 可以看到容器重新停止。接下来我们去更新一个容器,操作我选的是交换限制等于内存加交换,具体可看该网页---容器更新操作。
docker container update [操作参数] CONTAINER [容器id]
- 接下来删除我们刚才创建的容器。
sudo docker rm -f [容器id]
- 如图可以看到,之前我们用ubuntu镜像创建的容器已经被删除。
- 如果我们退出一个容器后,又想重新使用它,需要先启动,再进入。
sudo docker attach [容器id]
镜像部分
- 查看本地主机上的镜像。
sudo docker images
- 如果本地主机上没有我们需要的镜像,那么我们可以docker hub上找我们需要的镜像。
sudo docker search httpd
- 获取镜像。
sudo docker pull [需要的镜像]。
- 删除镜像,注意在删除镜像之前需要删除用镜像创建的容器。(这里hello-world已经删除,httpd是我之前pull的)
sudo docker rmi [镜像]
- 把镜像push到自己的仓库中,这里速度比较慢
sudo docker tag ubuntu nwxshm/ubuntu
sudo docker push nwxshm/ubuntu
- 可以看到自己的仓库里已经有这个镜像了
- 从自己的仓库中获取镜像和上面的方法一样(我这里因为直接存在了所以没有执行下载)。
sudo docker pull nwxshm/ubuntu
后续
- 根据老师提供的方法,我换成使用阿里云的镜像仓库,速度果然快了很多。操作方法和之前相同,如图可以看到阿里云镜像仓库中已经出现了刚才push的镜像。
- 具体操作方法在阿里云镜像仓库中有很详细的解释。
四.小结
本次是第一次系统综合实践,相关软件之前没用过,再加上访问的一些网站是外国的,需要加入镜像源,需要学习的东西有很多,花费了很长的时间(上传镜像到自己的仓库我试了5次才成功,很容易超时)。但是收获还是很多的,完成这次实验后,体验到如果能熟练使用docker将会很便捷,因为我之前用过云服务器,它支持把自己仓库中的镜像直接拉过去,当时还不明白这是什么意思,现在大概明白了。这次作业坑有很多,网络是最大的坑,我们访问外网太慢了,甚至有些就进不去,在换镜像源和使用阿里云仓库后,解决了这个问题。我还需要继续努力学习。
Tips:帮填坑------pull镜像过慢换镜像源的方法