• 你都30多岁的程序员了,还不懂Docker的原理及构建部署过程吗?


    Docker的原理 Docker有三个核心组件,掌握这三个组件的概念有助于我们进一步了解Docker的工作机制。 ● 镜像:Docker Image,它是容器运行所需要的静态二进制文件和依赖包的集合,可以将它理解为一个面向Docker的只读模板,容器镜像基于分层的联合文件系统(UnionFS)实现。用户可以根据需求,通过DockerFile定制容器镜像,同时Docker提供了对镜像的各种API操作命令实现镜像版本管理的功能。 ● 容器:Docker Container,是从镜像创建的应用,是镜像的动态运行实例,Docker利用容器来运行和隔离应用。镜像自身是只读的,容器从镜像启动时在镜像最上层创建一个可写层,镜像本身保持不变,容器启动后以进程的方式运行。另外,Docker支持一个容器对应一个进程的方式,而这种方式也非常适合以单进程运行为主的微服务架构。 ● 仓库:Docker Repository,主要用来存放镜像,可以分为公有仓库和私有仓库。当用户创建了自己的镜像之后,就可以使用推送的方式将它上传到指定的公有仓库或私有仓库。这样用户下次在另一台机器上使用该镜像时,只需将其从仓库拉取下来就可以了。 这三个组件组成了Docker的整个生命周期,下图是三者之间的关系。

    Docker采用C/S架构,下面是Docker的主要运行过程和原理图,同时涵盖了Docker的核心组件。 ● 首先,Client通过相应的Docker命令以及HTTP或REST API等方式与Docker Daemon实现Docker服务的使用与管理。 ● 其次,Docker Daemon作为服务端(部署在本地或者远程),负责监听Client的请求并管理Docker对象(容器、镜像、网络等),Docker Image提供容器运行所需的所有文件。 ● Docker Daemon通过访问容器镜像仓库,负责Docker镜像的存储管理。镜像仓库可以用DockerHub或者自建私有镜像仓库。 可以通过Docker push或pull操作往镜像仓库上传或下载镜像。

    Docker构建部署过程 Docker构建部署过程主要包括下面三个步骤。 ● 构建:通过DockerFile来描述应用依赖的运行环境,包括操作系统、启动端口、执行脚步,通过编译运行DockerFile来生成Docker镜像,并放在本地仓库中。 ● 装载:将镜像推送(Push)到远端仓库。 ● 部署运行:从仓库拉取(Pull)镜像,并创建容器实例,启动部署容器实例。 下 面 我 们 以 金 融 公 司 开 源 微 服 务 网 关 产 品 ——SIAGateway(GitHub上的开源项目)为例,演示如何编写DockerFile,以及Docker构建部署过程。 网关项目源码结构

    说明:SIA-Gateway项目采用前后端分离架构,由Admin、前端(Vue)、核心(Core)三个模块组成。在Docker示例代码中,我们将三个模块整体打包到一个SIA-Gateway镜像中。 DockerFile解析

    对上述DockerFile说明一下,对Java开发程序员来说,大多数人都对Maven集成工具比较熟悉。其实DockerFile的编写过程与Maven有类似的地方,可以按照打包镜像工作的属性大致分为三部分,我们将这三部分总结如下。 ● 首先,选择基础镜像及yum源定义,如果部署机器能够使用阿里yum源,则此步忽略;应用运行加载需要的基础设施和依赖库。 ● 其次,对于yum源中不存在的第三方依赖软件库,可以从本地通过ADD命令加载,并为镜像定义全局环境变量。 ● 最后,加载已经打包好的应用软件包到镜像,也可以指定应用工作目录,以及需要使用的挂载点(Volume)等;定义镜像运行时需要执行的相关解压包或者授权等相关指令。 构建镜像 使用DockerFile构建镜像,需要注意的是,首先要把DockerFile依赖的应用包进行打包。对于SIA-Gateway项目而言,可以在根目录下执 行 mvn install 脚 本 进 行 代 码 打 包 。 打 包 完 成 后 , 执 行docker.build.sh构建网关镜像。下面是构建镜像的代码。

    镜像制作完成后,可以使用docker push命令将镜像推送到私有仓库或者远程仓库,Docker官方提供了一个搭建私有镜像的仓库,只需把镜像下载下来,运行容器并暴露5000端口。Docker Hub是Docker官方维护的容器镜像,可以使用docker search命令搜索所有镜像,本节省略Docker Hub的登录访问过程。 ● 将SIA-Gateway推送到Docker私有仓库的命令如下。

    ● 将SIA-Gateway推送到Docker Hub的命令如下。

    ● 可以通过docker pull命令验证从私有仓库下载容器镜像。

    运行和部署容器镜像 容器镜像构建好后,就可以运行和部署容器镜像,使用dockerrun.sh可以从本地加载部署运行SIA-Gateway镜像。docker-run.sh脚本如下。

    对docker run命令说明如下。 ●docker run--name gateway-test-d reg.caiwu/sia/gateway:v1 使用docker镜像reg.caiwu/sia/gateway:v1以后台运行模式启动一个容器,并将容器命名为gateway-test。 ● -v参数和-P参数 使用-v参数可以将主机的一个目录映射到容器的目录,例如主机目 录 ${str} /sia-gateway-buildcomponent/config 到 容 器目录/app/jar/ROOT/gateway/config。使用-P参数可以将容器的8080端口映射到主机的8080端口。 ● /bin/bash-c命令 docker run可以使用/bin/bash-c命令执行一个后台任务,这样容器就不会退出了。目前-c参数后紧跟的参数是/app/jar/ROOT/dockerstart.sh(对应执行的后台任务),而docker-start.sh脚本文件是在DockerFile中通过ADD命令打包到镜像中的。 容器载入后运行脚本 我们来看下docker-start.sh。这个命令是容器启动后加载dockerrun命令执行的容器内部网关程序的启动脚本,这里我们启动了Admin和Core中的多个服务。需要注意的是,在这个脚本中,至少需要有一个服务的进程是前台运行的,保证Docker不会销毁退出。至此,通过以上步骤实现了微服务应用基于Docker启动部署的过程。

    DockerFile的常用指令 ● FROM指令:是整个DockerFile的入口,必须是第一条指令。代表新制作镜像的基础镜像。 【格式】

    ​Docker中存在一种特殊的情况,就是不以任何基础镜像为基准。 基础镜像可以自己制作,也可以从开源的仓库拉取,例如Docker Hub或者国内阿里云的免费仓库。 ● COPY指令:用于将宿主机文件复制到镜像内的指定路径。 【格式】

    ​或

    ● ADD高级复制:ADD的本质作用类似COPY,将本地文件添加到容器中。 【格式】

    (1)ADD过来的压缩包可以自动在目标路径下进行解压。 (2)原始路径可以是一个链接,ADD过程会尝试从该链接下载所需的文件到目标路径。 (3)一般情况下,建议使用COPY,而不是ADD。因为COPY过来的文件可以配合使用RUN来进行解压或者其他操作,搭配使用更灵活,而且单条语句所负担的功能唯一。 ● ENV设置环境变量:ENV指令用于定义镜像的环境变量。 【格式】

    ● EXPOSE暴露端口:EXPOSE指令声明运行时容器提供的服务端口,在运行时并不会因为这个声明,应用就会开启这个端口的服务。 【格式】

    在DockerFile中写入这样的声明有两个好处,一是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;二是在运行中使用随机端口映射时,也就是docker run-P时,会自动随机映射EXPOSE的端口。 ● VOLUME挂载共享卷。 【格式】

    ​Docker的使用原则除了每个容器做尽量少的事情,还要求容器运行时应该尽量保持容器存储层不发生写操作。对于数据库类需要保存动态数据的应用,其数据库文件应该保存在卷(Volume)中,也就是将本地磁盘的某一个目录挂载至容器内。这样的共享目录可以同时被多个不同的容器所使用。 ● CMD服务启动指令:Docker不是虚拟机,而是一个进程。作为进程,可以设置启动镜像时的具体参数,其实就是设置一些你想自动启动的服务。 【shell格式】

    ​【exec格式】

    ​【参数列表格式】

    ​在指定ENTRYPOINT指令后,用CMD指定具体的参数。 ● RUN指令:是DockerFile中最常用的指令之一,用来执行命令行的命令。 【格式】 shell格式:RUN<命令>,类似直接在终端输入命令。例如:

    ​本文给大家讲解的内容是微服务交付:基于容器的交付-Docker的原理及构建部署过程

    1. 下篇文章给大家讲解的内容是微服务交付:Docker Compose编排服务与Maven插件构建Docker镜像

    2. 觉得文章不错的朋友可以转发此文关注小编;

    3. 感谢大家的支持!

  • 相关阅读:
    借助调试工具理解BLE协议_1.蓝牙简介和BLE工作流程
    金融科技论文D部分
    阿里云计算巢加速企业软件云化,助力企业业务创新
    面向对象【static关键字】
    React新手必懂的知识点
    C. Zero-Sum Prefixes Codeforces Round #833 (Div. 2)(前缀和+贪心)
    浅析kubernetes中client-go structure01
    MYSQL中的JDBC操作
    游戏服务器领域的 “状态同步”、“非状态同步”
    Tomcat 接收请求并传递给工作线程池流程
  • 原文地址:https://blog.csdn.net/Cr1556648487/article/details/126874552