第一次实践作业

课程调查

选课的时候看到课程名还以为是一门偏硬件的课,但是当听到需要写博客时,便感到事情没那么简单。依稀记得一门名为“软件工程实践”的课也要写博客,瞬间感受到了压力。在被软工捶打了一学期之后,在我的大脑中似乎已经将写博客和软工等价起来了。但是究竟有没软工那么可怕,还得先学一学再说。

了解微服务

微服务是什么

微服务是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
    • 打印出以下信息说明安装成功

容器

获取镜像

  • 如果我们本地没有 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 仓库可以看到这个镜像:

posted @ 2020-04-18 03:16  Boketto  阅读(285)  评论(0编辑  收藏  举报