(1)课程调查
进入大三下学期的后半段,大学阶段的理论课程应该已经修得八九不离十了,在这个时间点迎来系统综合实践这门课,作为培养计划的一门新课程,我们非常希望了解你们对于课程的希望,请写下你对这门课的认识和你理想中的这门课程是怎么样的
答:我觉得这门课应该是一门综合实践的课程,对以前所学各个学科的知识进行综合性指导实验,让我们学会将所学知识串联起来,并用于实践中去。
(2)了解微服务
第一次作业我们将接触一种新型的软件架构——微服务(也许部分同学已经有所了解)。大家要做的是学习并了解该技术,微服务是什么,有什么特点,相较于传统的软件架构,它有什么优缺点,它是怎样部署的。
• 什么是微服务
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
• 微服务架构的优点:
1. 每个服务都比较简单,只关注于一个业务功能。
2. 微服务架构方式是松耦合的,可以提供更高的灵活性。
3. 微服务可通过最佳及最合适的不同的编程语言与工具进行开发,能够做到有的放矢地解决针对性问题。
4. 每个微服务可由不同团队独立开发,互不影响,加快推出市场的速度。
5. 微服务架构是持续交付(CD)的巨大推动力,允许在频繁发布不同服务的同时保持系统其他部分的可用性和稳定性。

• 微服务架构的缺点:
1. 运维开销及成本增加:整体应用可能只需部署至一小片应用服务区集群,而微服务架构可能变成需要构建/测试/部署/运行数十个独立的服务,并可能需要支持多种语言和环境。这导致一个整体式系统如果由20个微服务组成,可能需要40~60个进程。
2. 必须有坚实的DevOps开发运维一体化技能:开发人员需要熟知运维与投产环境,开发人员也需要掌握必要的数据存储技术如NoSQL,具有较强DevOps技能的人员比较稀缺,会带来招聘人才方面的挑战。
3. 隐式接口及接口匹配问题:把系统分为多个协作组件后会产生新的接口,这意味着简单的交叉变化可能需要改变许多组件,并需协调一起发布。在实际环境中,一个新品发布可能被迫同时发布大量服务,由于集成点的大量增加,微服务架构会有更高的发布风险。
4. 代码重复:某些底层功能需要被多个服务所用,为了避免将“同步耦合引入到系统中”,有时需要向不同服务添加一些代码,这就会导致代码重复。
5. 分布式系统的复杂性:作为一种分布式系统,微服务引入了复杂性和其他若干问题,例如网络延迟、容错性、消息序列化、不可靠的网络、异步机制、版本化、差异化的工作负载等,开发人员需要考虑以上的分布式系统问题。
6. 异步机制:微服务往往使用异步编程、消息与并行机制,如果应用存在跨微服务的事务性处理,其实现机制会变得复杂化。
7. 可测性的挑战:在动态环境下服务间的交互会产生非常微妙的行为,难以可视化及全面测试。经典微服务往往不太重视测试,更多的是通过监控发现生产环境的异常,进而快速回滚或采取其他必要的行动。但对于特别在意风险规避监管或投产环境错误会产生显著影响的场景下需要特别注意。
   
• 部署微服务: Docker(一种开放源代码引擎,可让开发人员和系统管理员在Linux环境中部署自给自足的应用程序容器)提供了一种很好的方式来部署微服务以满足上述要求。 涉及的关键步骤如下:
1) 将微服务打包为(Docker)容器映像。 
2) 将每个服务实例部署为一个容器。 
3) 缩放是根据更改容器实例的数量完成的。 
4) 随着我们使用Docker容器,构建,部署和启动微服务的速度将大大提高(比常规VM快得多) 

(3)学习docker技术
docker作为微服务的一种十分典型的代表技术,我们要做的是:
• 学习了解docker的相关概念(容器、镜像等),了解docker、docker compose、Dockerfile、docker machine、Swarm、k8s是什么,是做什么用的,心中有概念即可;
◦ Docker Client
Docker引擎可以简单的理为Docker服务端程序,他让你可以运行基于docker构建的应用,它是一个cs架构的软件。当你运行docker version时,就会看到两大部分,client和server。通过client的指令通过API,我们可以直接和后台守护进程的server通信交互。
◦ Docker Daemon
daemon就是一个守护进程,它是整个docker的核心引擎,在0.9版本之前,客户端和服务端是同意在一个二进制文件中,后来为了根号的管理,划分为4个二进制文件:docker,containerd,docker-containerd-shim和docker-runc。
分开之后,守护进程与容器管理不再相互牵制,使得docker技术变得更人性化。
◦ Docker镜像
docker镜像是Docker系统中的构建模块,是启动一个Docker容器的基础。
◦ img
Docker镜像分层构建,从底层到上层,我们写的Dockerfile,就是镜像构建步骤。
◦ Docker容器
容器是docker的核心,根据镜像文件描述,docker会创建一个容器,你不用关心它内部有些什么,你只要知道它提供了你的应用程序所需的所有资源,你可以很方便的管理它。从宿主机来看,它只是一个简单的用户进程而已。

    ◦ Docker仓库
      相信大家对github都陌生,它是一个开源代码托管仓库,docker仓库和它的作用一样,不管他存放的是镜像。这样你就可以很方便的把你的镜像分享给其他人,不过你需要把你的镜像上传到docker的公开仓库去。在你本地也可创建私有仓库,方便不同服务器的应用发布。
      
• 搭建你自己的docker环境,系统环境不限(主流的有Ubuntu/CentOS/Debian/Windows/MacOS等),完成docker的基本入门,包括但不限于:容器的创建、删除、更新和查询,创建并维护自己的镜像仓库,实现拉取和上传镜像等

步骤:
更新 apt 包索引。
sudo apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库:
sudo apt-get install
apt-transport-https
ca-certificates
curl
gnupg-agent
software-properties-common

添加 Docker 的官方 GPG 密钥,then , 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
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
更新 apt 包索引。
sudo apt-get update
安装最新版本的 Docker Engine-Community 和 containerd ,或者转到下一步安装特定版本:
sudo apt-get install docker-ce docker-ce-cli containerd.io

要安装特定版本的 Docker Engine-Community,请在仓库中列出可用版本,然后选择一种安装。列出您的仓库中可用的版本:
apt-cache madison docker-ce

使用第二列中的版本字符串安装特定版本,例如 5:18.09.13-0ubuntu-xenial。
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

测试 Docker 是否安装成功,输入以下指令,打印出以下信息则安装成功:
• sudo docker run hello-world

容器内运行程序:
sudo docker run ubuntu:15.10 /bin/echo "Hello world" Hello world

运行交互式容器:
sudo docker run -i -t ubuntu:15.10 /bin/bash

退出容器:exit

后台模式启动容器:
sudo docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
(结果是一串字符,实际上是容器ID)

确认容器是否在运行:sudo docker ps

在宿主主机内使用 docker logs 命令,查看容器内的标准输出:
sudo docker logs 容器ID或容器别名(通过ps命令查看)

容器的删除:sudo docker stop 容器ID或容器别名

使用 docker pull 命令来载入 ubuntu 镜像:
sudo docker pull ubuntu

以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
sudo docker run -it ubuntu /bin/bash

查看所有的容器,并使用 docker start 启动一个已停止的容器

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
sudo docker run -itd --name ubuntu-test ubuntu /bin/bash

进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
• docker attach

  	注意:此时如果从这个容器退出,会导致容器的停止。

• docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
![](https://img2020.cnblogs.com/blog/1795930/202004/1795930-20200416163342231-611694243.png)


![](https://img2020.cnblogs.com/blog/1795930/202004/1795930-20200416163352016-1534504157.png)


导出容器

如果要导出本地某个容器,可以使用 docker export 命令。
sudo docker export upbeat_gagarin > ubuntu.tar

此时ubuntu.tar已经保存在主目录下。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
sudo docker import ubuntu.tar test/ubuntu:v1

此外,也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
删除容器使用 docker rm 命令:
sudo docker rm -f ubuntu-test

下面的命令可以清理掉所有处于终止状态的容器。
sudo docker container prune
Docker 仓库管理
仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。
Docker Hub
目前 Docker 官方维护了一个公共仓库 Docker Hub。
大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
注册
https://hub.docker.com 免费注册一个 Docker 账号,并创建一个仓库(ubuntu0)
登录和退出
登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。
sudo docker login

退出
退出 docker hub 可以使用以下命令:
sudo docker logout

拉取镜像
你可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。
Sudo docker search 关键词 :查询与关键字相关的镜像

推送镜像
用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。
以下命令中的 username 请替换为你的 Docker 账号用户名。

Sudo docker tag 镜像名:版本号 docker用户名/仓库名

• docker仓库链接:docker hub 
• 参考资料:Docker Documentation;Docker教程 | 菜鸟教程