第一次实践作业
课程调查
选课的时候看到课程名还以为是一门偏硬件的课,但是当听到需要写博客时,便感到事情没那么简单。依稀记得一门名为“软件工程实践”的课也要写博客,瞬间感受到了压力。在被软工捶打了一学期之后,在我的大脑中似乎已经将写博客和软工等价起来了。但是究竟有没软工那么可怕,还得先学一学再说。
了解微服务
微服务是什么
微服务是SOA架构下的最终产物,该架构的设计目标是为了肢解业务,使得服务能够独立运行。
微服务的特点
优点
- 微服务最大的优点是,它们往往比传统的应用程序更有效地利用计算资源。这是因为它们通过扩展组件来处理功能瓶颈问题。这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个完整的应用程序的全新迭代。最终的结果是有更多的资源可以提供给其它任务。
- 微服务应用程序的另一个好处是,它们更快且更容易更新。当开发者对一个传统的单体应用程序进行变更时,他们必须做详细的QA测试,以确保变更不会影响其他特性或功能。但有了微服务,开发者可以更新应用程序的单个组件,而不会影响其他的部分。测试微服务应用程序仍然是必需的,但它更容易识别和隔离问题,从而加快开发速度并支持DevOps和持续应用程序开发。
- 第三个好处是,微服务架构有助于新兴的云服务,如事件驱动计算。类似AWS Lambda这样的功能让开发人员能够编写代码处于休眠状态,直到应用程序事件触发。事件处理时才需要使用计算资源,而企业只需要为每次事件,而不是固定数目的计算实例支付。
缺点
- 微服务架构可能带来过多的操作。
- 分布式系统可能复杂难以管理。
- 当服务数量增加,管理复杂性增加。
微服务的部署
- 基于主机(物理机或虚机)的多服务实例
该模式是最为传统的应用程序部署方法。在该模式下,软件开发人员可以提供单个或多个物理机或虚机,同时在每个主机上运行多个服务实例。此模式有几种不同的实现形式,其中包括:将每一个服务实例都作为一个单独的进程,或是在同一进程中运行多个服务实例。 - 基于主机(物理机或虚机)的服务实例
该部署方法能够在对应的主机上单独地运行每一个实例,包括:基于单个虚拟机的服务实例和基于单个容器的服务实例。基于单个虚拟机的服务实例模式,能够将每个服务打包成为诸如Amazon EC2 AMI的虚拟机(VM)镜像,此处的实例就是指那些通过既有镜像运行起来的VM。目前,使用该模式的一个典型应用便是Netflix的视频流服务。 - 基于容器的服务实例
常见的容器技术包括Docker和Solaris Zones。在这种部署模式下,每个服务实例都运行在其各自的容器中,因此也被称为操作系统级别的虚拟化机制。要使用该模式,需要将服务打包成为一个文件系统类型的镜像(通常称为容器镜像),其中包含执行该服务所需的应用程序、及其库文件。在完成打包之后,需要启动一到多个容器,并在物理机或虚拟机上运行它们。可以选择使用诸如Kubernetes或Marathon之类的集群管理器来管理多个容器。 - 无服务器部署
无服务器部署技术能够支持Java、Node.js和Python服务,AWS Lambda是全球开发人员使用最多的无服务技术。在该部署模式下,需要将服务打包成为一个ZIP文件,然后将其上传到Lambda函数(即一种无状态服务)中。同时需要提供各种元数据,这些元数据带有在处理请求时所调用到的不同函数名称。Lambda函数需要自动运行足够多的微服务实例,以处理不同的请求。而作为用户,只需根据所花费的时间、以及消耗的内存,为每个请求支付费用便可。
学习docker技术
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中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
搭建docker环境
-
系统版本
Ubuntu 16.04 -
卸载旧版本
Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们:
$ sudo apt-get remove docker docker-engine docker.io containerd runc
-
使用 Docker 仓库进行安装
因为是首次安装 Docker Engine-Community ,所以需要设置 Docker 仓库。之后便可以从仓库安装和更新 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 -
-
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥。
$ sudo apt-key fingerprint 0EBFCD88 pub rsa4096 2017-02-22 [SCEA] 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid [ unknown] Docker Release (CE deb) <docker@docker.com> sub rsa4096 2017-02-22 [S]
-
使用以下指令设置稳定版仓库
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stab"
-
-
安装 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
- 打印出以下信息说明安装成功
- 更新 apt 包索引。
容器
获取镜像
- 如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
$ docker pull ubuntu
启动容器
-
$ docker run -it ubuntu /bin/bash
-
参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。 -
退出终端,输入exit
启动已停止运行的容器
-
查看所有的容器
$ docker ps -a
-
使用 docker start 启动一个已停止的容器:
$ docker start b750bbbcfd88
后台运行
- 在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
$ docker run -itd --name ubuntu-test ubuntu /bin/bash
停止一个容器
-
停止容器的命令如下:
$ docker stop <容器 ID>
-
停止的容器可以通过 docker restart 重启:
$ docker restart <容器 ID>
进入容器
-
docker exec -it 243c32535da7 /bin/bash
删除容器
-
$ docker rm -f $ docker rm -f f79bc2927eec
镜像
列出镜像列表
-
docker images
-
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
获取一个新的镜像
-
docker pull 镜像名称
查找镜像
-
使用
docker search 镜像名称
来搜索镜像 -
注意:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
拖取镜像
-
使用命令
docker pull 镜像名称
来下载镜像
-
使用这个镜像
删除镜像
- 使用
docker rmi 镜像名称
来删除镜像,以删除镜像hello-world为例
创建镜像
-
更新镜像
-
更新镜像之前,我们需要使用镜像来创建一个容器。在运行的容器内使用 apt-get update 命令进行更新。
-
在完成操作之后,输入 exit 命令来退出这个容器。
-
此时 ID 为 e97d1c55ff58c 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2
-
使用新镜像 runoob/ubuntu 来启动一个容器
-
-
构建镜像
-
使用命令 docker build , 从零开始来创建一个新的镜像。为此,先要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建镜像。下面是建好的名为Dockerfile的文件:
-
使用cat命令在终端查看Dockerfile这个文件:
-
然后,使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像:
-
使用docker images 来查看创建的镜像,其已经在列表中存在,镜像ID为5b3b664946b4
-
使用新的镜像来创建容器:
-
设置镜像标签
使用 docker tag 命令,为镜像添加一个新的标签:
docker tag 镜像ID,这里是 5b3b664946b4 ,用户名称、镜像源名(repository name)和新的标签名(tag)。使用 docker images 命令可以看到,ID为5b3b664946b4的镜像多一个标签:
-
创建并维护自己的镜像仓库
-
这里遇到一个问题,使用docker login 登录时一直登录不上,账号密码检查了很多遍都没问题,但就是登不上。在网上试了各种方法后,还是不行。只能先放这里了。
-
过了一两天又来试,终于登上了,所有把下面的补齐:
-
登录docker
$ docker login
-
推送镜像
注:我的docker用户名是isweng,下面以推送镜像ubuntu:16.04到我的docker仓库为例。
$ docker tag ubuntu:16.04 isweng/ubuntu:18.04 $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE runoob/centos 6.7 5b3b664946b4 2 days ago 191MB runoob/centos dev 5b3b664946b4 2 days ago 191MB runoob/ubuntu v2 aa19460c1a95 3 days ago 137MB httpd latest bdc169d27d36 4 days ago 166MB alpine latest a187dde48cd2 3 weeks ago 5.6MB ubuntu latest 4e5021d210f6 4 weeks ago 64.2MB ubuntu 16.04 77be327e4b63 8 weeks ago 124MB hello-world latest bf756fb1ae65 3 months ago 13.3kB centos 6.7 9f1de3c6ad53 13 months ago 191MB ubuntu 15.10 9b9cb95443b5 3 years ago 137MB ubuntu 13.10 7f020f7bf345 5 years ago 185MB $ docker push isweng/ubuntu:16.04 $ docker search isweng/ubuntu NAME DESCRIPTION STARS OFFICIAL AUTOMATED
注:这里执行docker search isweng/ubuntu 没有结果,上网查了原因,说是有可能是因为排名太低搜不到。
但是上传是成功了,在我的docker 仓库可以看到这个镜像: