Docker学习--认识Docker
目录
一、前言
二、认识Docker
是什么?
目标or理念
三、容器与虚拟机
传统虚拟技术
容器虚拟化技术
类比
四、Docker应用场景
五、Docker的基本构成
Docker镜像
Docker容器
Docker仓库
总结
六、Docker架构(单体)
一、前言
考虑一下的这些场景:
- 开发人员在本地电脑(Windows/Mac)上开发、测试通过的应用,部署到测试、预发或生产服务器(通常是 Linux)时,可能因为操作系统、库版本、依赖软件(如 Python、Node.js、MySQL 版本不同)导致运行失败或行为异常。
- 传统部署需要手动或脚本化地在服务器上安装各种运行环境、配置依赖、设置端口、管理进程等,过程繁琐,容易出错,且难以快速复制和扩展。
- 在使用虚拟机(VM)创建操作系统时,虽然可以隔离环境,但每个 VM 都需要运行一个完整的操作系统,占用大量内存和磁盘空间,启动慢,资源开销大。
- 将应用从一个环境(开发 → 测试 → 生产)或一个云平台(AWS → 阿里云)迁移到另一个时,过程复杂,容易出错。
这些无一都不是我们在平时的学习生产环境中的痛点,那么我们实际中遇到这种问题有没有什么好的解决方法呢?
有的兄弟,有的,那就是我们接下来学习的容器化技术--Docker
二、认识Docker
是什么?
那么docker是什么呢?
Docker 是一种容器化(Containerization)技术,它的出现主要是为了解决软件开发和运维过程中长期存在的“在我机器上能跑,到你机器上就出错”的问题,并极大地提升了应用的构建、分发、部署和运行的效率。
拿上面的例子来说,环境配置是一个相当麻烦的问题,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。也就是说,docker利用了容器虚拟化技术消除了协作编码时“在我的机器上可正常工作”的问题。
目标or理念
Docker是基于Go语言实现的云开源项目。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
三、容器与虚拟机
传统虚拟技术
我们熟悉的虚拟机(VM)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
容器虚拟化技术
Linux容器技术
Linux 容器技术(Linux Containers, LXC) 并不是一个单一的技术,而是指 Linux 内核提供的一组底层特性,这些特性共同实现了操作系统级别的虚拟化或轻量级虚拟化。它允许在单个 Linux 操作系统的内核上,运行多个相互隔离的、独立的“用户空间”实例,这些实例就是我们所说的容器。
Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
类比
特性 | 传统虚拟机 (VM) | 容器 (Container) |
---|---|---|
虚拟化层级 | 硬件虚拟化 | 操作系统虚拟化 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核 |
核心组件 | Hypervisor(虚拟机监视器,如 VMware ESXi, KVM, Hyper-V) | 容器引擎(如 Docker, containerd) |
操作系统 | 每个 VM 运行一个完整的客户操作系统(Guest OS),包括内核。 | 所有容器共享宿主机的操作系统内核。 |
资源占用 | 高。每个 VM 都需要独立的操作系统,占用大量内存(几百MB到几GB)和磁盘空间(几GB到几十GB)。 | 低。容器只打包应用及其依赖,不包含操作系统内核,非常轻量(通常几十MB到几百MB)。 |
启动速度 | 慢。需要启动整个操作系统,通常需要几分钟。 | 极快。只需启动应用进程,通常在几秒甚至毫秒内完成。 |
从上面也就能看出来Docker比虚拟机更快的原因。
可以简单理解为
- 虚拟机 = 物理机的抽象(一个物理机变多个虚拟机)。
- 容器 = 操作系统的抽象(一个操作系统变多个隔离的运行环境)。
四、Docker应用场景
Docker 的应用场景非常广泛,其核心价值在于封装和标准化。适用于:
- 需要环境一致性的场景(开发、测试)。
- 需要快速迭代和部署的场景(CI/CD)。
- 采用微服务架构的系统。
- 希望提高资源利用率和降低运维复杂度的场景。
- 构建云原生应用和现代化基础设施。
五、Docker的基本构成
需要注意的是Docker并非一个通用的容器工具,它不是一个可以在任何操作系统内核上直接运行的抽象层,它依赖于已经存在并运行的Linux内核环境。(在Windows上安装Docker时需要依赖WSL,也即Windows下的Linux子系统)。
Docker的基本组成部分:
- 镜像(image)
- 容器(container)
- 仓库(repository)
Docker镜像
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
可以用C++中的类模板来对照理解它,docker容器实例类似于C++中new出来的具体实例对象。
- Docker 镜像定义了容器运行时所需的所有内容——操作系统基础、应用程序代码、依赖库、环境变量、启动命令等。它是一个静态的、不可变的模板。与类模板一样都是创建具体实例的“蓝图”或“配方”。它们本身不是运行的实体。
- 镜像本身是不可修改的。任何对镜像的“修改”实际上都是创建一个新的镜像层(基于联合文件系统)。就像类模板都不能被直接“运行”或修改。
- 一个镜像可以启动出多个独立的容器实例。就像一个类模板可以生成多个运行时实体。
Docker容器
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是 C++ 中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台.
也就是说,可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
Docker仓库
仓库(Repository)是集中存放镜像文件的场所。类似 github 仓库,存放各种 git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等。
总结
Docker 本身是一个客户端-服务端架构的应用。核心是运行在宿主机上的 Docker Daemon(守护进程),它负责管理镜像、构建、运行和分发容器。
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
六、Docker架构(单体)
Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从容器接收命令并管理运行在主机上的容器。
Docker运行的基本流程为:
- 用户是使用Docker Client 与 Docker Daemon 建立通信,并发送请求给后者
- Docker Daemon 作为 Docker 架构的主体部分,首先提供 Docker Server 的功能使其可以接收 Docker Client 的请求
- Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在,即它接收到请求后,会将其分解为一系列内部的 Job(任务)来执行。例如,docker run 请求可能会被分解为 pull(拉取镜像)、create(创建容器)、start(启动容器)等多个 Job。
- Job 的运行过程中,当需要容器镜像时,如果本地没有,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph Driver 将下载镜像以 Graph 的形式存储
- 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境
- 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成
- Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作.
感谢阅读!