1、课程调查
对系统综合实践这门课的认识&&理想中这门课的样子
起初以为这门课是和计算机系统结构相配套的实践课,是和硬件方面相关的实践操作。直到老师在群里扔出的博客园二维码,我的内心:d(ŐдŐ๑)。。。不过听到是要学习Docker,内心其实还是有点激动的,以前就有听说过Docker,现在终于可以借着这个机会自己来尝试一下了。既然是实践课,还是希望能够从中学到一点东西吧,不仅仅是知识,还有实际动手能力以及解决问题的方法之类的。最后,还是希望这门课不会给我带来太多的压力。
2、微服务
-
微服务
微服务是一种架构风格,以专注于单一责任与功能的小型功能区块为基础,利用模组化的方式组合出复杂的大型应用程序,应用程序各功能区块使用与语言无关的API集相互通讯,且每个服务可以被单独部署。也就是说,一个大型复杂软件应用由一个或多个微服务组成,每个微服务仅关注于完成一件任务并很好地完成该任务。
-
微服务特点
- 按照业务来划分服务,单个服务代码量小,业务单一,易于维护。
- 每个微服务都有自己独立的基本组件,例如数据库、缓存等,且运行在独立的进程中。
- 微服务之间的通信是通过HTTP协议或者消息组件,且具有容错能力。
- 微服务有一套服务治理的解决方案,服务之间不耦合,可以随时加入和剔除服务。
- 单个微服务能够集群化部署,并且有负载均衡的能力。
-
优点
- 易于开发和维护。由于微服务单个模块就相当于一个项目,开发这个模块我们就只需关心这个模块的逻辑即可,代码量和逻辑复杂度都会降低,从而易于开发和维护。
- 启动较快。相对单个微服务而言,启动某个模块的服务速度明显是比启动单体架构的整个项目要快很多。
- 局部修改容易部署。如果在开发中发现了一个问题,对于单体架构,就需要重新发布并启动整个项目,非常耗时间。但是微服务则不同,只需要解决出Bug的那个模块的问题就可以了,解决完bug之后再重启这个模块的服务即可。部署相对简单,不必重启整个项目从而大大节约时间。
- 技术栈不受限。可以使用多种不同技术组合,而且由于所关注的该模块的逻辑,因此技术更换的成本也就会少很多。
- 按需伸缩。单体架构在想扩展某个模块的性能时不得不考虑到其它模块的性能会不会受影响,而微服务则不需要考虑其他模块的情况。
-
缺点
- 运维要求较高。对于单体架构来讲,只需要维护好这一个项目就可以了;但是对于微服务架构来讲,由于项目是由多个微服务构成的,每个模块出现问题都会造成整个项目运行出现异常,想要知道是哪个模块造成的问题往往是不容易的,因为无法一步一步通过debug的方式来跟踪,这就对运维人员提出了很高的要求。
- 分布式的复杂性。对于单体架构来讲,可以不使用分布式;但是对于微服务架构来说,分布式几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。
- 接口调整成本高。一旦某个微服务的接口发生大的变动,那么所有依赖它的微服务都要做相应的调整,涉及的微服务可能非常多,那么调整接口所造成的成本将会明显提高。
- 代码的重复。对于单体架构来讲,如果某段业务被多个模块所共同使用,便可以抽象成一个工具类,被所有模块直接调用;但是某一个微服务的工具类是不能被其它微服务所直接调用的,因此不得不在每个微服务上都建这么一个工具类,从而导致代码的重复。
-
部署
如果没有正确的策略,微服务应用的部署可能会寸步难行。而在选择适合的部署策略之前,需要全面考虑当前服务是由何种语言编写而成,其对应的框架,相应的部署、扩展与管理要求等方面。
- 基于主机(物理机或虚机)的多服务实例。该模式是最为传统的应用程序部署方法。在该模式下,软件开发人员可以提供单个或多个物理机或虚机,同时在每个主机上运行多个服务实例。此模式有几种不同的实现形式,其中包括:将每一个服务实例都作为一个单独的进程,或是在同一进程中运行多个服务实例。
- 基于主机(物理机或虚机)的服务实例。该部署方法能够在对应的主机上单独地运行每一个实例,包括:基于单个虚拟机的服务实例和基于单个容器的服务实例。基于单个虚拟机的服务实例模式,能够将每个服务打包成为诸如Amazon EC2 AMI的虚拟机(VM)镜像,此处的实例就是指那些通过既有镜像运行起来的VM。目前,使用该模式的一个典型应用便是Netflix的视频流服务。
- 基于容器的服务实例。常见的容器技术包括Docker和Solaris Zones。在这种部署模式下,每个服务实例都运行在其各自的容器中,因此也被称为操作系统级别的虚拟化机制。要使用该模式,需要将服务打包成为一个文件系统类型的镜像(通常称为容器镜像),其中包含执行该服务所需的应用程序、及其库文件。在完成打包之后,需要启动一到多个容器,并在物理机或虚拟机上运行它们。可以选择使用诸如Kubernetes或Marathon之类的集群管理器来管理多个容器。
- 无服务器部署。无服务器部署技术能够支持Java、Node.js和Python服务,AWS Lambda是全球开发人员使用最多的无服务技术。在该部署模式下,需要将服务打包成为一个ZIP文件,然后将其上传到Lambda函数(即一种无状态服务)中。同时需要提供各种元数据,这些元数据带有在处理请求时所调用到的不同函数名称。Lambda函数需要自动运行足够多的微服务实例,以处理不同的请求。而作为用户,只需根据所花费的时间、以及消耗的内存,为每个请求支付费用便可。
3、Docker技术相关概念
- Docker:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。一个完整的Docker由以下几个部分组成:Docker Client客户端、Docker Daemon守护进程、Docker Image镜像、Docker Container容器。
- Images:镜像,当我们从远程仓库下载软件后会存放到本地仓库,这个本地仓库就是images,可以使用docker images查看本地安装了哪些软件。
- Container:容器,是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。要有Container需要先有images,image就相当于抽象的类,Container就相当于具体实例化的对象。可通过Docker API或者CLI命令来启停、移动、删除容器。
- Docker Compose:Docker官方的开源项目,使用Python编写,负责实现Docker容器集群的快速编排,实现上调用了Docker服务的API进行容器管理。
- Dockerfile:用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成映像。
- Docker Machine:Docker官方提供的一个工具,它可以帮助我们在远程的机器上安装Docker,或者在虚拟机host上直接安装虚拟机并在虚拟机中安装 Docker。我们还可以通过docker-machine命令来管理这些虚拟机和Docker。
- Swarm:Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。
- k8s:是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在k8s中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
4、搭建Docker环境
-
系统环境
ubuntu-18.04.4
-
Docker安装
使用Docker仓库进行安装,步骤参考教程
更新apt包索引
sudo apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
添加官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
通过搜索指纹的后8个字符0EBF CD88,验证是否拥有带有指纹的密钥
sudo apt-key fingerprint 0EBFCD88
设置稳定版仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
安装Docker Engine-Community和containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io
测试Docker是否安装成功
sudo docker run hello-world
5、容器
-
创建容器
载入ubuntu镜像
docker pull ubuntu
创建并运行容器
docker run -it ubuntu /bin/bash
-
查看所有容器
docker ps -a
-
启动已停止的容器
docker start <容器ID>
-
停止容器
docker stop <容器ID>
-
重启容器
docker restar <容器ID>
-
进入容器
有两种指令可以实现该功能。使用docker attach退出容器时,会导致容器停止;使用docker exec则不会导致容器停止。
docker exec -it <容器ID> /bin/bash docker attach <容器ID>
-
退出容器
exit
-
更新容器
查看帮助
docker container update --help
更新
docker update [OPTIONS] CONTAINER [CONTAINER...]
-
删除容器
docker rm -f <容器ID>
输入命令
docker ps -a
查看,可以发现ID为54a760f4d60b的容器已经不存在。
6、镜像
-
镜像加速器
由于Docker的镜像需要从仓库拉取,这个仓库(dockerHub)国内下载很慢,可以使用镜像加速器,镜像加速器相当于把dockerHub的仓库拷贝了一份到国内,让国内用户方便下载。
获取阿里云镜像加速器地址
配置镜像加速器
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["<加速器地址>"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
-
登陆账户
sudo docker login --username=<username> registry.cn-hangzhou.aliyuncs.com
-
搜索镜像
docker search [Name]
-
拉取镜像
docker pull [仓库地址]:[镜像版本号]
输入docker images
查看本地镜像
-
上传镜像
sudo docker tag [ImageId] [仓库地址]:[镜像版本号] sudo docker push [仓库地址]:[镜像版本号]
可以在阿里云镜像仓库看到,镜像已经上传成功了