• 对亚马逊云科技云原生课程容器的基本学习笔记


    目录

    前言

    一、容器化背后的发展历史和概念

    1.容器的抽象

    容器的比喻

    2.计算机领域的容器

    容器是一种标准化的软件单元

    二、容器和微服务架构

    1.容器的作用

    快速搭建开发环境

    将运行环境和配置放在代码中并部署

    使用docker-compose来模拟生产环境

    使用docker镜像进行自我部署

    2.容器解决的问题

    3.微服务架构的作用

    传统架构

     微服务架构

    4.容器和微服务架构的关联

    微服务的特性

    微服务和容器的搭配

    三、容器Dockerfile的使用

    1.Dockerfile的概念

    2.通过Dockerfile来制作jdk镜像的实操

    创建目录

    下载并上传到服务器中的目录

    在目录下创建Dockerfile文件

    执行命令构建镜像

    查看镜像是否建立完成

    3.Dockerfile的常用指令

    FROM指令

    RUN指令

    COPY指令

    CMD指令  

     ENTRYPOINT指令

    总结


    前言

    通过这次亚马逊云科技云原生课程的学习,我认识到了容器,知道了容器的重要性以及它的作用性多么大,以及学习到了微服务架构的特点,以及它和单体架构的区别在哪,以及为什么说容器是支持现代微服务架构使用的基础技术。


    一、容器化背后的发展历史和概念

    1.容器的抽象

    首先,我们要学习入门一门新的东西,那肯定要认识它,知道它的前世今生,那么,容器是什么东西呢,在古代,我们经常使用船在海上进行运输,那么这个船就可以比喻为容器。  以及在现代,我们经常见到的集装箱,它们都是一个个容器。这些例子都是通过平常生活中常见的物品,来进行比喻容器。

    容器的比喻

    在我们以前,我们运输物品,我们都是先把货物装在一个个容器或者箱子上,然后我们在装车运输过去。

    如图所示,在我们古代,我们的船就类似一个容器。

    如图所示,在比如,在我们生活中,经常看到的集装箱,它们也是一个个的容器,里面可以转载很多不同的货物,就好像我们开发的应用程序一样,然后在通过大船把这些集装箱统一安装好,然后运输。

    2.计算机领域的容器

    那么在计算机领域,又该如何理解容器呢?它在计算平台中,容器是一种标准化的软件单元,它同时也是在操作系统级别实施的一种形式的虚拟化。容器它是独立的轻量级软件包,其中包括运行应用程序所需的一切。例如:代码、运行时、系统工具、系统库和设置。而且所有容器共享底层主机系统的操作系统内核。 这些容器可以是大型企业应用程序中的服务,也可以是在隔离环境中运行的独立应用程序。

    容器是一种标准化的软件单元

    在计算机平台上,容器它其实是一个单元,可以在运行容器化平台的任何计算环境中快速可靠地运行,容器是在操作系统级别实施的一种形式的虚拟化。

    二、容器和微服务架构

    1.容器的作用

    快速搭建开发环境

    通过这次课程的学习,我们知道了容器的作用性是非常大的,然而现在的开发环境的机器通常内存比较小,在使用虚拟的时候,创建许多台虚拟机,那我们经常需要为开发环境的机器加内存,这是以前的做法,但现在不一样,Docker的出现,改变了这种现状,我们只需要在 Docker上搭建一套完整的开发环境,就 可以轻易的让几十个服务在 Docker 中跑起来了。

    将运行环境和配置放在代码中并部署

    容器Docker,它除了能让我们更加快速地搭建开发环境之外,它也能让你将运行环境和配置放在你的项目代码中,然后在进行部署,比如说,在同一个 Docker 的配置中,它可以在不同的环境中使用的,那这样的话,我们就不需要重复地造轮子了,提高了我们的工作效率,而且这样也降低了硬件要求和应用环境之间耦合度,对我们开发者或者运维人员来说都是莫大的好消息。

    使用docker-compose来模拟生产环境

    容器Docker,它除了能够给我们快速搭建开发环境之外,同样,它也可以搭建测试环境,预发布环境,以及生产环境,我们只需要将每个服务打包为一个 docker 镜像,并使用 docker-compose 来模拟生产环境,就可以将我们的系统运行在生产环境中进行测试了。

    使用docker镜像进行自我部署

    使用docker镜像,它还有一个很重要的特性,那就是自动化,比如这里的自我部署,现状主流的主机提供商都支持并提供托管 docker,只需要一个具有 shell 访问权限的专用节点,你可以自我部署了。只需要设置好 docker,并在你想要的端口上运行你的镜像即可以了。

    2.容器解决的问题

    和一个单纯的应用程序相比,操作系统很笨重,大家都知道操作系统运行起来是需要占用很多资源的,如果是刚刚安装的系统还什么都没有部署,单纯的操作系统其磁盘占用至少几十G起步,内存要几个G起步。

    在这台机器上开启三个虚拟机,每个虚拟机上都部署一个应用,那么这里都因虚拟机而占用了好几G了,所以我们没有办法划分出更过虚拟机从而部署更多的应用程序,可是我们部署的是应用程序,要用的也是应用程序而不是操作系统。

    还有就是启动时间问题,操作系统重启是非常慢的,因为操作系统要从头到尾把该检测的都检测了该加载的都加载上,这个过程非常缓慢。所以就诞生了容器技术,专门来解决这些问题的。之前的虚拟机的形式是这样的,比如这里可以建3个客户操作系统,应用程序A,B,C都分别占用一个客户操作系统,这样就会非常耗内存的,而且操作系统的启动也慢,效率也不高。

     那么现在采用了容器技术的,它是这样的,1个容器里面就包含了应用程序所需要的运行环境

    3.微服务架构的作用

    传统架构

    首先,我们以前开发软件,都是采用传统的单体的架构的,就是说很多的功能模块都是集中在一个项目里面的,而这时,有很多的功能是互相关联的,你比如,要修改某些功能,可能牵一发而动全身,可维护性和可扩展性太差了。

    如图所示,订购应用的程序是放在了一个服务器里运行,而报告应用程序用放在另一个服务器里运行,而这样的话,每新增一个功能,都要放在另一个服务器运行,这样肯定是不行,会造成很大的资源浪费。

     微服务架构

    所以,就出现了微服务架构,如图所示,而上面这些订购模块和报告模块等,都被改造成一个个微服务,通过通信互相联系调用,提高了可用性,以及它们都只需部署在一个服务器上运行即可,不会造成资源的浪费。

    4.容器和微服务架构的关联

    微服务的特性

    它的特性如图所示:

    它们之间的关联是非常好的,为什么这么说呢,这是跟微服务的特性密不可分的,微服务采用了分散式的革新设计,而也是智能终端节点、哑管道,它采用了独立产品形式,而不是项目形式,兼顾了开发与生产。

    微服务和容器的搭配

    怎么理解呢,与传统的瀑布开发项目模型相反,可以将微服务视为具有独立输入和输出的独立产品,无需考虑运行时环境的影响,容器会帮助你将所有依赖项和库打包到单个不可变对象中去。

    而且使用容器可使得开发、测试和生产环境保持一致,在开发人员系统上正常运行的容器化应用程序,也将能够在生产系统上以相同的方式来正常运行。

    所以,微服务和容器可以很好地搭配使用。

    三、容器Dockerfile的使用

    1.Dockerfile的概念

    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

    • Dockerfile是用于构建docker镜像的文件

    • Dockerfile里包含了构建镜像所需的“指令”

    • Dockerfile有其特定的语法规则

    Dockerfile文本文件里面包含了下面的命令,它的作用,如图所示:

    2.通过Dockerfile来制作jdk镜像的实操

    首先,我们来学习一下如何通过Dockerfile来进行镜像的制作,但在制作之前,我们要先了解一下镜像是什么,只有了解了,我们才能够知道它是干什么用的,通俗点来说,镜像就是一个运行这个进程所需要的环境。接下来,我们先按以下的步骤来创建镜像:

    创建目录

    我们首先需要创建一个目录,则需要执行下面的指令和指定文件夹

    mkdir –p /myy/local/dockerjdk8
    cd /myy/local/dockerjdk8

    下载并上传到服务器中的目录

    然后,接下来,就是下载jdk的tar包,先下载jdk-8u202-linux-x64.tar.gz并上传到服务器中的/myy/local/dockerjdk8目录

    在目录下创建Dockerfile文件

    然后呢,我们就在目录下面,创建一个Dockerfile文件,文件的内容如下:

    FROM centos:7
    MAINTAINER ITCAST
    WORKDIR /usr
    RUN mkdir  /usr/local/java
    ADD jdk-8u202-linux-x64.tar.gz /usr/local/java/
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_202
    ENV JRE_HOME $JAVA_HOME/jre
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    ENV PATH $JAVA_HOME/bin:$PATH

    接下来是,说明一下这些指令的含义,FROM *** 定义了使用哪个基础镜像启动构建流程

    MAINTAINER *** 声明了镜像的创建者

    ENV *** 设置环境变量

    RUN ***是Dockerfile的核心部分

    ADD *** 是将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压

    COPY *** 是和ADD相似,但是如果有压缩文件并不能解压

    WORKDIR *** 是设置工作目录

    执行命令构建镜像

    然后,接下来我们执行命令,构建镜像,注意的是,后面还有一个“.”的哈

           docker build -t='jdk1.8' .

    查看镜像是否建立完成

    最后,我们通过执行下面订单命令,查看镜像的信息,来判断是否已经建立完成

            docker images

    1. # 1、创建目录
    2. mkdir –p /usr/local/dockerjdk8
    3. cd /usr/local/dockerjdk8
    4. # 2、下载jdk-8u202-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
    5. # 3、在/usr/local/dockerjdk8目录下创建Dockerfile文件,文件内容如下:
    6. vi Dockerfile
    7. FROM centos:7
    8. MAINTAINER ITCAST
    9. WORKDIR /usr
    10. RUN mkdir /usr/local/java
    11. ADD jdk-8u202-linux-x64.tar.gz /usr/local/java/
    12. ENV JAVA_HOME /usr/local/java/jdk1.8.0_202
    13. ENV JRE_HOME $JAVA_HOME/jre
    14. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    15. ENV PATH $JAVA_HOME/bin:$PATH
    16. # 4、执行命令构建镜像;不要忘了后面的那个 .
    17. docker build -t='jdk1.8' .
    18. # 5、查看镜像是否建立完成
    19. docker images

    3.Dockerfile的常用指令

    FROM指令

             定制的镜像都是基于FROM的。

    RUN指令

             用于执行后面跟着的命令,

    1. RUN <命令行命令>
    2. RUN ["可执行文件", "参数", "参数"]
    3. # 例如:
    4. # RUN ["./test.java", "dev", "offline"] 等价于 RUN ./test.java dev offline

    COPY指令

          它是指从上下文目录中复制文件或者目录到容器里指定路径。

    COPY [--chown=<myy>:<s>] ["<源路径>",...  "<目标路径>"]

    CMD指令  

          它是用于运行程序的,与RUN指令不同的是,二者的运行时间不同,

    1. CMD <shell 命令>
    2. CMD ["<可执行文件或命令>","","",...]

     ENTRYPOINT指令

           它类似于CMD指令,

    ENTRYPOINT ["","","",...]

    可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

    代码如下(示例):

    1. import numpy as np
    2. import pandas as pd
    3. import matplotlib.pyplot as plt
    4. import seaborn as sns
    5. import warnings
    6. warnings.filterwarnings('ignore')
    7. import ssl
    8. ssl._create_default_https_context = ssl._create_unverified_context


    总结

    通过这次亚马逊云科技云原生课程的学习,我认识到了容器,知道了容器的重要性以及它的作用性多么大,以及学习到了微服务架构的特点,以及它和单体架构的区别在哪,以及为什么说容器是支持现代微服务架构使用的基础技术。

  • 相关阅读:
    RocketMQ 消费者消息回发 解析——图解、源码级解析
    每日一题——LeetCode1496.判断路径是否相交
    FineReport中字符串常用处理函数
    产品经理基础(一)
    Java:实现快速傅里叶变换算法(附完整源码)
    首届昇腾AI创新大赛,“照见”好学不倦的“后浪”
    React +ts + babel+webpack
    一种通用的业务监控触发方案设计
    SRC漏洞挖掘信息收集与挖掘技巧
    PyTorch入门之【tensor】
  • 原文地址:https://blog.csdn.net/weixin_46442877/article/details/127756022