本文是自己的学习笔记
1、什么是Docker
Docker是基于Go语言实现的云开源项目。它的角色是作为应用和环境的中间层,对应用屏蔽环境的变化,使应用的部署步骤,变量等不会随着环境的变化而变化。让App做到build anywhere and anytime。
所以Docker类似于Java虚拟机,让开发者不用操心操作系统的细节,只需要生产.class
文件交给虚拟机就可以在任何操作系统上运行Java。
不过Docker比虚拟机更方便和轻巧。
虚拟机本质上是虚拟出一套硬件,然后在其之上运行一个完整的操作系统,并在系统上再运行所需应用进程。
而Docker则不虚拟硬件,直接使用操作系统的内核,不需要花时间虚拟硬件和要求操作系统划出运行空间。那不同的应用只需要持有App本身的代码和相关的依赖,然后放入Docker容器中。多个应用就对应着多个Docker容器,这些容器共享OS的内核。整个过程更轻便占用更少的资源。
比如下图就是四个App放到四个Docker容器中,共同运行在一个机器上。他们共享内核资源但是又各自拥有自己的文件系统,所以容器之间互不打扰。
2、Docker的架构设计
从上图可以看出,Docker
主要分成三个部分,客户端,服务器和注册中心。
在Host
中有容器(Container),和镜像(Images)。
2.1、镜像(Image)
镜像是一个非常核心的概念。它可以看成是一个打包好的软件应用模具,我们可以利用它快速创建多个应用实例运行到容器中,如同模具一般一按即成型。
它包含着一个应用启动所需要的一起,比如应用程序代码,所需要的依赖,环境变量和配置等。
镜像就是Docker
移植性高的关键。它被设计成平台无关,这意味着我们可以在任何安装了Docker
的机器上通过同一个镜像快速启动多个应用实例,而不用担心在我机器上能运行在你机器上就不能的问题。
需要注意镜像是只读类型的文件,一旦创建就不可修改。必须修改就只能创建一个新的镜像。
2.2、容器(Container)
容器容的是应用实例。每个容器只能运行一个应用实例。
它可以被启动,开始,停止等。每个容器都相互隔离。
容器都是由镜像创建的,一个镜像可以创建多个容器。
2.3、仓库(Repository)
仓库是集中存放镜像文件的场所。
仓库和仓库注册服务器(Registry)是有区别的。仓库注册服务骑上存放着多个仓库,而每个仓库有包含了多个镜像,每个镜像有不同的标签做区分。通常标签就是版本号。
仓库也分为公开查看和私有仓库。
最大的公开库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云,网易云等。
公司或者团队内部可以创建一个内部公开的Docker
仓库。然后先创建一个基础镜像(例如,一个包含特定操作系统、运行时和常用工具的基础镜像),并将其推送到公有仓库。其他团队成员可以基于这个基础镜像进一步构建自己的应用镜像,从而确保开发、测试和生产环境的一致性。
2.4、Docker使用场景案例
- 开发人员 A 编写应用程序代码,并创建一个 Dockerfile 来定义如何构建该应用程序的 Docker 镜像。
- 开发人员 A 使用 docker build 命令构建镜像,并通过 docker tag 命令给镜像打上版本标签(例如 myorg/myapp:1.0.0)。
- 开发人员 A 使用 docker push 命令将镜像推送到团队的公有 Docker 仓库(私有仓库)。
- CI/CD 系统 检测到代码更新,自动触发镜像的构建和推送流程,确保仓库中的镜像始终是最新且符合规范的。
- 开发人员 B 需要在本地运行或测试应用程序,他只需使用 docker pull myorg/myapp:1.0.0 命令从仓库中拉取镜像。
- 测试人员 可以拉取特定版本的镜像,并在测试环境中进行验证。
- 运维人员 可以从仓库中拉取通过测试的稳定版镜像,并将其部署到生产服务器上。
- 如果应用程序需要更新,开发人员会重复上述过程,将新版本的镜像推送到仓库,并更新版本标签。
通过这种方式,公有 Docker 仓库成为了团队协作的枢纽,极大地提高了开发、测试和部署的效率和一致性。