天天看点

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

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

◆ Docker的原理

Docker有三个核心组件,掌握这三个组件的概念有助于我们进一步了解Docker的工作机制。

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

这三个组件组成了Docker的整个生命周期,下图是三者之间的关系。

你都30多岁的程序员了,还不懂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操作往镜像仓库上传或下载镜像。

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

◆ Docker构建部署过程

Docker构建部署过程主要包括下面三个步骤。

  • 构建:通过DockerFile来描述应用依赖的运行环境,包括操作系统、启动端口、执行脚步,通过编译运行DockerFile来生成Docker镜像,并放在本地仓库中。
  • 装载:将镜像推送(Push)到远端仓库。
  • 部署运行:从仓库拉取(Pull)镜像,并创建容器实例,启动部署容器实例。

下 面 我 们 以 金 融 公 司 开 源 微 服 务 网 关 产 品 ——SIAGateway(GitHub上的开源项目)为例,演示如何编写DockerFile,以及Docker构建部署过程。

◆ 网关项目源码结构

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

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

◆ DockerFile解析

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

对上述DockerFile说明一下,对Java开发程序员来说,大多数人都对Maven集成工具比较熟悉。其实DockerFile的编写过程与Maven有类似的地方,可以按照打包镜像工作的属性大致分为三部分,我们将这三部分总结如下。

  • 首先,选择基础镜像及yum源定义,如果部署机器能够使用阿里yum源,则此步忽略;应用运行加载需要的基础设施和依赖库。
  • 其次,对于yum源中不存在的第三方依赖软件库,可以从本地通过ADD命令加载,并为镜像定义全局环境变量。
  • 最后,加载已经打包好的应用软件包到镜像,也可以指定应用工作目录,以及需要使用的挂载点(Volume)等;定义镜像运行时需要执行的相关解压包或者授权等相关指令。

◆ 构建镜像

使用DockerFile构建镜像,需要注意的是,首先要把DockerFile依赖的应用包进行打包。对于SIA-Gateway项目而言,可以在根目录下执 行 mvn install 脚 本 进 行 代 码 打 包 。打 包 完 成 后 , 执 行docker.build.sh构建网关镜像。下面是构建镜像的代码。

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

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

  • 将SIA-Gateway推送到Docker私有仓库的命令如下。
你都30多岁的程序员了,还不懂Docker的原理及构建部署过程吗?
  • 将SIA-Gateway推送到Docker Hub的命令如下。
你都30多岁的程序员了,还不懂Docker的原理及构建部署过程吗?
  • 可以通过docker pull命令验证从私有仓库下载容器镜像。
你都30多岁的程序员了,还不懂Docker的原理及构建部署过程吗?

◆ 运行和部署容器镜像

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

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

对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启动部署的过程。

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

◆ DockerFile的常用指令

  • FROM指令:是整个DockerFile的入口,必须是第一条指令。代表新制作镜像的基础镜像。

【格式】

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

Docker中存在一种特殊的情况,就是不以任何基础镜像为基准。

基础镜像可以自己制作,也可以从开源的仓库拉取,例如Docker Hub或者国内阿里云的免费仓库。

  • COPY指令:用于将宿主机文件复制到镜像内的指定路径。

【格式】

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

你都30多岁的程序员了,还不懂Docker的原理及构建部署过程吗?
  • ADD高级复制:ADD的本质作用类似COPY,将本地文件添加到容器中。

【格式】

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

(1)ADD过来的压缩包可以自动在目标路径下进行解压。

(2)原始路径可以是一个链接,ADD过程会尝试从该链接下载所需的文件到目标路径。

(3)一般情况下,建议使用COPY,而不是ADD。因为COPY过来的文件可以配合使用RUN来进行解压或者其他操作,搭配使用更灵活,而且单条语句所负担的功能唯一。

  • ENV设置环境变量:ENV指令用于定义镜像的环境变量。

【格式】

你都30多岁的程序员了,还不懂Docker的原理及构建部署过程吗?
  • EXPOSE暴露端口:EXPOSE指令声明运行时容器提供的服务端口,在运行时并不会因为这个声明,应用就会开启这个端口的服务。

【格式】

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

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

  • VOLUME挂载共享卷。

【格式】

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

Docker的使用原则除了每个容器做尽量少的事情,还要求容器运行时应该尽量保持容器存储层不发生写操作。对于数据库类需要保存动态数据的应用,其数据库文件应该保存在卷(Volume)中,也就是将本地磁盘的某一个目录挂载至容器内。这样的共享目录可以同时被多个不同的容器所使用。

  • CMD服务启动指令:Docker不是虚拟机,而是一个进程。作为进程,可以设置启动镜像时的具体参数,其实就是设置一些你想自动启动的服务。

【shell格式】

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

【exec格式】

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

【参数列表格式】

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

在指定ENTRYPOINT指令后,用CMD指定具体的参数。

  • RUN指令:是DockerFile中最常用的指令之一,用来执行命令行的命令。

【格式】

shell格式:RUN<命令>,类似直接在终端输入命令。例如:

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

来源:

https://www.toutiao.com/article/7114633497968640519/?log_from=6379d68d5417b_1656571330504

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:[email protected]

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

来都来了,走啥走,留个言呗~

 IT大咖说  |  关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

  • 相关推荐

    推荐文章

  • 一次性把Docker的概念、容器与虚拟机的区别、容器交付的优势讲清
  • 从 CPU 讲起,深入理解 Java 内存模型!
  • 前端工程化:保姆级教学 Jenkins 部署前端项目
  • 中高级程序员可能都不会使用spring-boot-starter-jdbc访问MySQL
  • 探索云原生技术之基石——Docker容器
  • 一种并行,背压的Kafka Consumer
  • Nomad正在接管Kubernetes吗
  • MIT协议分布式文件系统,一个简单、方便的文件存储方案
  • 深入浅出 Nginx 实战与架构原理
  • 技术专家带你彻底掌握线程池