2020系统综合实践 第1次实践作业
1.课程调查
在这两年半的学习中,我能感受到我们专业是软硬件兼修的,但是很少有软件硬件相结合的教学,因此,当我第一次看到这个课程名称的时候,我觉得这个课程应该就是培养我们的软硬件相结合的系统开发能力,大概感觉就是在硬件上编程,实现一些功能。在第一次课中,老师提到了树莓派,这证实了我之前的猜测,这是我一直期待的,也是我上大学前对这个专业所学内容的期望。
2.了解微服务
资料来源:知乎-华为技术宅基地
1.微服务是什么
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通(通常是基于HTTP的Restful API).每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构造。
2.微服务的特点
3.微服务的优点
- 提升开发交流,每个服务足够内聚,足够小,代码容易理解
- 服务独立测试、部署、升级、发布
- 按需定制的DFX,资源利用率,每个服务可以各自进行x扩展和z扩展,而且,每个服务可以根据自己的需要部署到合适的硬件服务器上
- 每个服务按需要选择HA的模式,选择接受服务的实例个数
- 容易扩大开发团队,可以针对每个服务(service)组件开发团队
- 提高容错性(fault isolation),一个服务的内存泄露并不会让整个系统瘫痪
- 新技术的应用,系统不会被长期限制在某个技术栈上
4.微服务的缺点
- 没有银弹,微服务提高了系统的复杂度
- 开发人员要处理分布式系统的复杂性
- 服务之间的分布式通信问题
- 服务的注册与发现问题
- 服务之间的分布式事务问题
- 数据隔离再来的报表处理问题
- 服务之间的分布式一致性问题
- 服务管理的复杂性,服务的编排
- 不同服务实例的管理
5.微服务的部署
- 每台主机上部署多个服务实例
- 每个主机一个服务实例
- 无服务的部署
详细资料
3.学习docker技术
学习资料来源:Docker教程 | 菜鸟教程 b站视频教学
1.docker的相关概念
- docker:让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或windows 机器上,也可以实现虚拟化
- docker compose:可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
- Dockerfile:在Docker中创建镜像最常用的方式,是一个Docker镜像的描述文件
- docker machine:允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机的工具
- Swarm:提供Docker容器集群服务,是Docker官方对容器云生态镜像支持的核心方案
- k8s:开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等
2.搭建自己的docker环境
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"
安装 Docker Engine-Community
更新 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
2.镜像加速
b站教程
按照教程输入以下命令
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 info
在终端输出最后几行找到如下信息就表示配置成功
3.Docker 容器使用
先运行一个hello world
sudo docker run ubuntu:15.10 /bin/echo "Hello world"
各个参数解析:
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
运行交互式的容器
我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力:
docker run -i -t ubuntu:15.10 /bin/bash
各个参数解析:
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
注意第二行 root@0123ce188bd8:/#,此时我们已进入一个 ubuntu15.10 系统的容器
我们可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。
启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器
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 1067331d70b6
停止容器
使用 docker stop 命令来停止容器:
sudo docker stop 1067331d70b6
启动已停止运行的容器
查看所有的容器命令如下:
$ docker ps -a
使用 docker start 启动一个已停止的容器:
$ docker start 容器ID
后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以通过 -d 指定容器的运行模式。
$ docker run -itd --name ubuntu-test ubuntu /bin/bash
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
- docker attach :退出容器终端会导致容器停止。
- docker exec:推荐使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
以docker exec命令为例
docker exec -it 1067331d70b6 /bin/bash
导出容器
$ docker export 1067331d70b6 > ubuntu.tar
导出容器 1067331d70b6 快照到本地文件 ubuntu.tar。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
$ cat ~/ubuntu.tar | docker import - test/ubuntu:v1
删除容器
$ docker rm -f 容器ID
4.Docker 镜像使用
列出镜像列表
我们可以使用 docker images 来列出本地主机上的镜像。
获取一个新的镜像
docker pull ubuntu:13.10
查找镜像
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
docker search httpd
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
拖取镜像
docker pull 镜像名
以拖取httpd 官方版本的镜像为例
删除镜像
docker rmi 镜像名
以删除hello-world镜像为例
更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
docker run -t -i ubuntu:15.10 /bin/bash
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
通过命令 docker commit 来提交容器副本。
docker commit -m="has update" -a="tinor" e6ea5f605966 tinor/ubuntu:v2
各个参数说明:
- -m: 提交的描述信息
- -a: 指定镜像作者
- e6ea5f605966:容器 ID
- tinor/ubuntu:v2: 指定要创建的目标镜像名
使用 docker images 命令来查看我们的新镜像 tinor/ubuntu:v2:
使用我们的新镜像 tinor/ubuntu 来启动一个容器
docker run -t -i tinor/ubuntu:v2 /bin/bash
5.Docker 仓库管理
创建一个阿里云镜像仓库
在docker里登入阿里云
从Registry中拉取镜像
sudo docker pull registry.cn-hangzhou.aliyuncs.com/fzu/tinor:[镜像版本号]
复制镜像ID并设置tag
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/fzu/tinor:[镜像版本号]
将镜像推送到Registry
sudo docker push registry.cn-hangzhou.aliyuncs.com/fzu/tinor:[镜像版本号]
阿里云仓库可以看到刚刚push的镜像