1. Docker发展与简介
1.1 云服务与虚拟化基础
1.1.1云服务模型介绍
云计算是通过网络为用户提供可伸缩的计算资源。云服务通常分为以下几种类型:
IaaS(基础设施即服务)
提供虚拟化计算资源(如虚拟机、存储、网络等)。
用户可以灵活配置自己的计算环境,负责安装操作系统、管理资源等。
优点:灵活度高、可扩展性强。
缺点:管理复杂,需要较多技术支持。
PaaS(平台即服务)
提供一个开发平台,用户可以在上面开发应用程序,而无需关注底层硬件或操作系统。
优点:简化开发过程,适合开发者。
缺点:灵活度较低,可能受到平台限制。
SaaS(软件即服务)
提供已经构建好的应用程序,用户可以直接使用,无需安装和维护。
优点:快速部署,省时省力。
缺点:定制化差,依赖于服务提供商。
DaaS(数据即服务)
提供数据处理和分析服务,用户可以访问、分析云端存储的大数据。
优点:降低用户管理数据的难度。
缺点:可能涉及数据隐私问题。
1.1.2常见云服务提供商
阿里云、腾讯云、AWS、Google Cloud、华为云等是市场上主要的云服务提供商。
云服务提供商通常提供各种服务,如存储、计算、网络、CDN 等。
1.2 虚拟化技术概述
1.2.1虚拟化基础
虚拟化类型
全虚拟化:虚拟化软件完全模拟硬件环境,允许多个操作系统共享硬件资源,彼此之间相互独立。
适用场景:需要兼容多个操作系统(如 Linux 与 Windows 同时运行)的环境。
半虚拟化:虚拟机与宿主操作系统协作,通过修改操作系统内核来提高性能。 急需架构
适用场景:高性能需求的环境,尤其是优化了开源操作系统(如 Linux)的虚拟化。
虚拟化产品
VMware:广泛使用的企业级虚拟化平台,支持全虚拟化和半虚 拟化。 企业版 mac fusion
EXSI企业版 vsphere work
Hyper-V:由微软推出的虚拟化平台,集成于 Windows Server 中。
VirtualBox:适用于个人和开发者的虚拟化产品,跨平台支持(Linux、macOS、Windows)。
1.3 Docker简介及其重要性
1.3.1. 为什么使用 Docker
Docker 是一种容器化技术,它使得开发者可以将应用及其依赖打包到一个标准化的容器中,从而在任何环境下都能一致地运行。这个概念类似于将应用放入一个容器(集装箱),无论容器被移动到哪个环境,它都能保持原有的运行状态。
容器技术相比传统的虚拟化技术(如 VMware)具有显著优势。传统虚拟化需要在每个虚拟机中运行完整的操作系统,资源消耗大,而 Docker 仅在宿主操作系统上运行多个隔离的容器,不需要完整的操作系统,大大减少了系统开销和资源浪费。
通过 Docker,应用可以更轻松地实现跨平台部署和运行。举个例子,一辆兰博基尼应用程序被装进集装箱(容器),可以在不同的操作系统上(如 CentOS 到 Ubuntu)无缝迁移,确保应用始终以相同的方式运行。
1.3.2 Docker 发展历史
Docker 是由 Solomon Hykes 和他团队在 2013 年从 DotCloud 开始开发的。它的最初目标是利用容器技术提供一种新的应用部署方式。Docker 从一开始就有了强大的生态系统和社区支持,迅速发展并成为全球最流行的容器化平台。
主要的发展节点包括:
2013年:Docker 项目发布;
2014年:Docker 公司成立;
2015年:Docker 发布了重要的版本 1.8,引入了新的网络架构和卷管理;
2017年:发布了 Docker Enterprise Edition(企业版)和 Docker Community Edition(社区版),并开始了时间驱动的版本发布。
2018年:Docker 18.09发布,加入了新的构建功能和改进的性能,重点是多阶段构建(Multi-stage Builds)和新的容器日志功能。
Docker 的Kubernetes 集成开始,推出了 Docker Desktop 中的 Kubernetes 支持,使得开发者可以在本地轻松使用 Kubernetes 来部署和管理容器。
2019年:Docker 19.03发布,新增了对GPU 加速的支持,以及Docker CLI的改进。此外,Docker 为 Kubernetes 提供了更好的支持。
Docker Desktop的更新增强了与 Kubernetes 的集成,支持在 Windows 和 macOS 上直接运行 Kubernetes 集群。
Docker 提出了Docker Desktop for Windows 和 macOS,为开发者提供了一个跨平台、统一的开发环境,结合了 Docker 引擎和 Kubernetes。
2020年:Docker 20.10发布,新增了对Docker Compose v2的支持,并在性能、功能和稳定性方面进行了一系列增强。
Docker 宣布将Docker Swarm和Kubernetes的集成进行区分,Kubernetes 成为 Docker 引擎推荐的容器编排工具。
Docker 开始更加聚焦于开发者工具,而逐渐减少对企业级 Kubernetes 的直接支持,特别是在容器编排方面。
2021年:Docker 进一步优化了其本地开发工具,使得开发者能够更容易在本地环境中使用容器和 Kubernetes 进行集成。
Docker Hub和Docker Desktop的改进,使得 Docker 的云端镜像存储和本地开发环境更加流畅。
2022年:Docker 继续加大对开发者体验的关注,推出了对GitHub等工具的深度集成,帮助开发者快速构建和部署容器。
在企业领域,Docker 企业版继续被 Kubernetes 和其他工具组合使用,尤其是对于CI/CD和DevOps环境中的大规模部署。
2023年:Docker 23.x发布,进一步增强了对云原生应用的支持,特别是对 Kubernetes 生态系统的集成增强。
Docker 在容器优化、安全性和持续集成/持续交付(CI/CD)方面继续推出新功能,提升了企业级应用部署的效率和安全性。
Docker 提供了更多对开源和社区驱动的工具的支持,力求保持其在容器生态中的主导地位。
1.3.3 Docker 版本:CE vs EE
Docker 提供了两个主要版本:
Docker Community Edition (CE):适用于个人开发者或小型团队,提供基本的容器功能,免费使用。
Docker Enterprise Edition (EE):适用于大规模生产环境,强调企业级的安全性和支持,通常是付费版本。
每个版本的发布周期不同,CE 通常每个月发布新版本,而 EE 版本则会有更长的维护周期。
1.3.4 Docker 与传统虚拟化的区别
Docker 通过操作系统级虚拟化(LXC)提供轻量级的虚拟化,容器之间共享宿主机的操作系统内核,因此相比传统虚拟机,Docker 容器更加轻便、高效。
传统虚拟机:每个虚拟机都包含完整的操作系统,资源占用大。
Docker 容器:共享宿主操作系统的内核,启动快,占用少,易于管理。
| 特性 | Docker 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 计算能力损耗 | 几乎无 | 损耗 50%左右 |
| 性能 | 接近原生 | 弱于 |
| 系统支持量(单机) | 上千个 | 几十个 |
| 隔离性 | 资源隔离/限制 | 完全隔离 |
1.3.5 容器化技术的生态系统
容器技术是一种轻量级、提供隔离的虚拟化技术。这里是一些知名的容器技术:
Docker:市场上最为知名和流行的容器框架之一,拥有生态系统完善且社区活跃的优秀特点。它通过简单的工具和接口,使得应用程序的部署于测试过程更为简单。
Kubernetes:Google 开发并开源的容器编排平台,可以管理、调度和扩展容器的应用。
OpenShift:是 Red Hat 提供的开源的容器平台,基于 Kubernetes,但提供了更丰富的功能。
LXC: Linux 容器技术,比 Docker 更接近传统的虚拟化技术,可以看作是轻量级的 VM(虚拟机)。
Rkt:由 CoreOS 开发的一种容器技术,设计上有别于 Docker,它更注重于安全性和模块化。
Apache Mesos:一种用于大规模数据中心的容器编排平台,特别地,它可以与其他调度系统如 Marathon、Chronos 或 Jenkins 集成。
Containerd:是一个开源的容器运行时,是 Docker 的核心组件之一,可用于管理完整的容器生命周期。
Crio:是一个轻量级的容器运行时,专门用于 Kubernetes。
Singularity:一款专注于面向性能敏感和计算密集型应用程序的容器技术。
Podman:与 Docker 相似,但无需守护进程,支持运行和管理 OCI 容器和镜像。
1.3.6 Docker 容器的优势
移植性:应用和其依赖打包在容器中,跨平台和跨环境运行无缝。
隔离性:容器内的应用互相隔离,不会影响宿主机或其他容器。
效率高:由于不需要完整的操作系统,容器消耗的资源少,启动速度快。
简化部署:通过 Docker,可以轻松创建、复制、修改和删除容器,简化了应用部署和管理的复杂度。
1.3.7 容器技术的应用场景
CI/CD(持续集成与持续交付):利用 Docker 快速构建和部署应用,保证开发、测试、生产环境的一致性。
微服务架构:容器技术与微服务架构相得益彰,可以独立部署和扩展每个微服务。
多云与混合云环境:容器跨平台能力使得应用能在不同云环境和本地环境间无缝迁移。
1.4 Docker 基础概念
① Docker 的 Logo 设计:Docker 的 Logo 设计为一条蓝色鲸鱼,拖着许多集装箱。鲸鱼代表宿主机,集装箱代表相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker 的设计宗旨Docker 的设计宗旨是Build, Ship and Run Any App, Anywhere。通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件可以是一个应用、一套服务,甚至是一个完整的操作系统。
鲸鱼背上有集装箱 蓝色的大海里面--------宿主机系统window10/linux 鲸鱼 ---------- docker 集装箱 ---------容器实例 from 来自我们的镜像模板Docker是一个开源的容器化平台,能够让开发者将应用及其依赖环境打包成容器,从而简化跨平台的部署和管理。
Linux 六大命名空间
| 命名空间 | 缩写 | 作用 | 效果 |
|---|---|---|---|
| MNT | 挂载 | 文件系统隔离 | 每个命名空间可以有自己的文件系统挂载点 |
| NET | 网络 | 网络资源隔离 | 每个命名空间可以有自己的网络栈,包括网络接口、路由表等 |
| PID | 进程 | 进程号隔离 | 每个命名空间有自己独立的 PID 编号空间 |
| IPC | 间通 | 进程间通信隔离 | 每个命名空间有自己独立的 System V IPC 和 POSIX 消息队列 |
| UTS | 主机 | 主机名、域名隔离 | 每个命名空间可以有自己的主机名和域名 |
| USER | 用户 | 用户名、组名隔离 | 每个命名空间可以有自己的用户和组 ID 映射 |
Docker架构以及组件
Docker daemon(Docker守护进程) Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。可通过Docker客户端与之通信。
Client(Docker客户端) Docker客户端是Docker的用户界面,它可以接受用户命令和配置标识,并与Docker daemon通信。图中,docker build等都是Docker的相关命令。
Images(Docker镜像) Docker镜像是一个只读模版,它包含创建Docker容器的说明。它和系统安装光盘有点像—使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行Docker镜像中的程序。
Container(容器) 容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过Docker API或者CLI命令来启停,移动,删除容器。
Registry Docker Registry是一个集中存储与分发镜像的服务。构建完Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助Docker Registry来避免镜像的手动复制。一个Docker Registry可包含多个Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个Docker镜像。这跟Maven的仓库有点类似,如果把Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。
④ Docker 组成
⑤ Docker 的核心技术
Docker 容器本质上是宿主机的一个进程,通过以下技术实现资源隔离和限制:
Namespace:实现资源隔离。
Cgroup:实现资源限制。
写时复制技术(Copy-on-Write):实现高效的文件操作。
1.4.2Docker 核心概念重点
镜像(Image)
镜像是包含应用程序及其所有依赖环境的可执行包。它是一个只读模板,基于该模板可以创建容器实例。
容器(Container)
容器是镜像的运行实例。容器提供了与外部环境隔离的运行时环境,可以在不同的系统上运行。
容器通过 Docker 引擎启动,具有独立的文件系统、网络、进程空间。
仓库(Repository)
仓库是存放 Docker 镜像的地方。Docker Hub 是最常用的公共仓库,用户也可以创建私有仓库
1.4.6 Docker安装与配置(CentOS 7示例)
镜像是Docker的基础,所有容器都基于镜像创建,以下是常用的镜像操作命令。
Docker 目前仅支持 64 位系统。
关闭防火墙和 SELinux
systemctl stop firewalld.service setenforce 01安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2 - yum-utils:提供了 `yum-config-manager` 工具。 - device-mapper:Linux 内核中支持逻辑卷管理的通用设备映射机制。 - device-mapper-persistent-data** 和 **lvm2**:device-mapper 存储驱动程序所需的依赖包。2.设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3安装 Docker-CE 并设置为开机自动启动
yum install -y docker-ce docker-ce-cli containerd.io 注意:如果是指定版本docker-ce-20.10.18 systemctl start docker.service systemctl enable docker.service #开机自启 - Docker 系统包含两个程序:Docker 服务端和 Docker 客户端。 - Docker 服务端是一个服务进程,负责管理所有容器。 - Docker 客户端是 Docker 服务端的远程控制器,用于控制 Docker 服务端进程。基本命令:
docker --version:查看 Docker 版本。docker info:查看 Docker 系统信息。
2. Docker 容器管理
镜像是Docker的基础,所有容器都基于镜像创建,以下是常用的镜像操作命令。
2.1.1 搜索镜像
从Docker Hub搜索镜像,示例:
1 # 搜索nginx镜像 2 docker search nginx2.1.2 拉取镜像
从仓库下载镜像到本地,示例:
docker pull nginx作用:从 Docker Hub 拉取nginx镜像,默认下载最新(latest)版本。如果你不指定标签(tag),则会下载默认的latest标签的镜像。
2.1.3 镜像加速下载
华为加速器:
# tee /etc/docker/daemon.json <<-'EOF' > { > "registry-mirrors": ["https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"] > } > EOF { "registry-mirrors": ["https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"] }2.1.4 查看镜像信息
cat /var/lib/docker/image/overlay2/repositories.json查看本地所有镜像:
2.1.5 获取镜像详细信息
docker inspect 镜像ID作用:获取指定镜像(通过镜像 ID)详
细信息。此命令返回一个 JSON 格式的详细信息,包括镜像的层次、历史记录、配置、大小等。
2.1.6 为本地镜像添加标签为了后期做迭代
#格式:docker tag 名称:[标签] 新名称:[新标签] docker tag nginx:latest nginx:web docker images | grep nginx作用:为本地的nginx:latest镜像添加新的标签nginx:web,这并不会创建新的镜像,而是为同一个镜像附加了新的标签
2.1.7 删除镜像
格式: docker rmi 仓库名称:标签 #当一个镜像有多个标签时,只是删除其中指定的标签 或者 docker rmi 镜像ID号 #会彻底删除该镜像 注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。 docker rmi nginx:web 强制删除 rmi-f作用:删除指定标签的镜像。注意:如果镜像有多个标签,删除指定标签不会删除镜像本身,只有在没有其他标签和容器依赖的情况下才会彻底
docker load < nginx.tar除镜像。如果镜像正在被容器使用,需要先删除容器
2.1.8 存储镜像(导出)
docker save -o nginx.tar nginx:latest作用:将本地镜像nginx:latest保存为 tar 包(nginx.tar)。这可以用于镜像备份或迁移。
2.1.9 载入镜像(导入)
docker load < nginx.tar作用:从本地 tar 文件中加载镜像。你可以将导出的镜像文件通过此命令重新加载到 Docker 中。