2020系统综合实践 第1次实践作业
1.课程调查
上学期选课的时候看到这门课的时候,以为是一门纯硬件的课程,跑跑流水灯交通灯这种感觉。第一节课听到老师介绍的时候提到了上学期的软件工程我就有点害怕,也用了同样的博客体系,下意识的祈祷这不会是一门非常耗时的课(毕竟我准备去考研)。老师提到了这门课分为三个部分,docker,树莓派和最后的综合大作业,个人还是比较期待的,docker和树莓派在之前就听说过,觉得蛮酷的,这次终于可以自己体验一把了。老师给我们提供了几个学习链接就让我们自己折腾了,个人不是非常习惯这种放养式教育,又要走出自己的舒适区了,冲冲冲。
2.了解微服务
1.微服务是什么
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通(通常是基于HTTP的Restful API).每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构。
2.微服务的特点
- 力度小,且专注于做一件事
- 单独的进程
- 轻量级通信机制,通常是HTTP/REST接口
- 松耦合,可独立部署
3.微服务的优点
- 提升开发交流,每个服务足够内聚,足够小,代码容易理解
- 服务独立测试、部署、升级、发布
- 按需定制的DFX,资源利用率,每个服务可以各自进行x扩展和z扩展,而且,每个服务可以根据自己的需要部署到合适的硬件服务器上
- 需要选择HA的模式,选择接受服务的实例个数
- 容易扩大开发团队,可以针对每个服务(service)组件开发团队
- 提高容错性(fault isolation),一个服务的内存泄露并不会让整个系统瘫痪
- 新技术的应用,系统不会被长期限制在某个技术栈上
4.微服务的缺点
-
没有银弹,微服务提高了系统的复杂度
-
开发人员要处理分布式系统的复杂性
-
服务之间的分布式通信问题
-
服务的注册与发现问题
-
服务之间的分布式事务问题
-
数据隔离再来的报表处理问题
-
服务之间的分布式一致性问题
-
服务管理的复杂性,服务的编排
-
不同服务实例的管理
5.微服务的部署
- 一台主机部署多服务实例
- 每个主机一个服务实例
- 每台容器一个服务实例
- 松耦合,可独立部署
3.学习docker技术
1.docker的相关概念
- docker:让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或windows 机器上,也可以实现虚拟化
- docker compose:可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
- Dockerfile:在Docker中创建镜像最常用的方式,是一个Docker镜像的描述文件
- docker machine:允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机的工具
- Swarm:提供Docker容器集群服务,是Docker官方对容器云生态镜像支持的核心方案
- k8s:开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等
2.搭建自己的docker环境
本次作业采取的环境是ubuntu 18.04 LTS
1.Ubuntu 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 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
使用以下指令设置稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
更新 apt 包索引
sudo apt-get update
安装最新版本的 Docker Engine-Community 和 containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io
测试 Docker 是否安装成功
sudo docker run hello-world
至此,docker终于安装完成了
2.镜像加速
在b站上看一个老师讲解docker的时候,说从dockerhub拉取镜像的时候,会比较慢,最好整一个加速,当时它是用阿里云做演示的,所以我也模仿了一下
先是注册一个阿里云账号https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
然后获取到自己的阿里云加速地址
配置镜像加速器,您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["自己的加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3.容器的使用
这是菜鸟驿站里面的一个案例,跟着教程一步一步做让我对docker的操作有了初步的印象
使用 docker run 命令来在容器内运行一个应用程序,这里先检查了一下本机的镜像,发现不存在,就去镜像仓库上下载镜像,然后创建了一个容器,在容器里执行 bin/echo "Hello world"并输出结果
docker run ubuntu:15.10 /bin/echo "Hello world"
运行交互式的容器,我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力,-t: 在新容器内指定一个伪终端或终端,-i: 允许你对容器内的标准输入 (STDIN) 进行交互,可以通过exit来退出容器
docker run -i -t ubuntu:15.10 /bin/bash
创建一个以进程方式运行的容器,与上面一种方式不同,它工作在后台,输出结果是容器id的完整版
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
查看正在运行的容器
docker ps
使用容器的id来查看容器的标准输出
Docker logs 7a3aa39a4291
使用 docker stop 命令来停止容器,再次查看正在运行的容器时,未发现刚刚那个id
docker stop 7a3aa39a4291
以进程的方式启动容器时,使用attach的方式可以进入容器
docker attach 1e560fca3906
这里有两种方式,一种是exit,一种是exec,其差别是前者在退出容器时会导致容器的停止,后者不会
docker exec -it 3dd2895db7ed /bin/bash
导出与导入容器
docker export 3dd2895db7ed > ubuntu.tar
cat ubuntu.tar | docker import - test/ubuntu:v1
删除容器
docker rm -f 3dd2895db7ed
4.镜像的使用
使用 docker search 命令来搜索镜像
docker search httpd
使用 docker pull 命令来下载镜像
docker pull httpd
删除镜像,首先停止所有的container,然后删除容器,最后删除指定镜像
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi hello-world
更新镜像,首先创建一个容器,使用 apt-get update 命令进行更新,退出容器后使用docker commit 来提交容器副本
docker run -t -i ubuntu:15.10 /bin/bash
apt-get update
通过命令 docker commit 来提交容器副本
docker commit -m="has update" -a="runoob" 5a230ff0a626 runoob/ubuntu:v2
创建容器,即完成容器的更新
docker run -t -i runoob/ubuntu:v2 /bin/bash
查询容器信息
docker inspect be5bdc4f013c
5.仓库管理
由于docker hub太慢了所以我选择阿里云镜像
首先在阿里云里面建立一个公开的仓库
然后再docker里登入阿里云
sudo docker login --username=郑裕恒 registry.cn-hangzhou.aliyuncs.com
从Registry中拉取镜像
sudo docker pull registry.cn-hangzhou.aliyuncs.com/dyssl/dyssl:[镜像版本号]
将镜像推送到Registry
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/dyssl/dyssl:[镜像版本号]
sudo docker push registry.cn-hangzhou.aliyuncs.com/dyssl/dyssl:[镜像版本号]
然后可以在阿里云上看到已经成功啦