容器技术与 Docker 入门部署
容器介绍与docker部署
一、什么是容器
一句话概括
容器就是一个标准化的软件单元,它将代码及其所有依赖关系(库、系统工具、运行时等)打包在一起,从而确保应用在任何计算环境中都能以相同的方式快速、可靠地运行。
二、生动的比喻:集装箱
理解容器最好的方式就是联想集装箱。
- 传统运输(没有容器前):
- 货物(你的应用程序)形状各异,有箱子、袋子、散货。
- 需要专门的码头工人、不同的装卸工具(依赖环境)。
- 从一艘船换到一辆卡车时,可能需要重新打包、重新安排,非常容易出错,而且效率低下。(这就像开发环境能运行,生产环境就报错)
- 集装箱运输(使用容器后):
- 所有货物都被装进一个标准尺寸的集装箱里。
- 集装箱有统一的接口,可以被吊车、卡车、火车等各种交通工具无缝衔接地搬运。
- 集装箱内部的环境是独立的,无论外面风吹雨打,里面的货物都是安全的。(这确保了环境的一致性)
容器就是这个“软件界的集装箱”。 你的应用程序就是这个“货物”,容器把它和它需要的所有东西(比如特定的Node.js版本、系统文件等)打包在一起,形成一个独立的、可移植的单元。
为什么需要容器?
我们可以用一张表来清晰地总结:
痛点 / 需求 | 没有容器的世界 | 有容器的世界 | 带来的核心价值 |
---|---|---|---|
环境一致性 | “在我这能跑,你那不行” | 一次构建,随处运行 | 可靠性、可预测性 |
环境隔离 | 依赖冲突,配置复杂 | 相互隔离,互不影响 | 简化运维,提高密度 |
应用迁移 | 环境重配,痛苦易错 | 镜像迁移,无缝衔接 | 可移植性,云原生基础 |
开发效率 | 配置环境耗时耗力 | 一键获取标准环境 | 提升开发体验和协作 |
资源与弹性 | 虚拟机笨重,启动慢 | 容器轻量,启动快 | 高效率、低成本、快伸缩 |
架构现代化 | 单体应用臃肿,难以迭代 | 微服务的理想载体 | 敏捷性、可维护性 |
一言以蔽之:我们需要容器,是因为它通过将应用与环境打包成一个标准化的单元,从根本上简化了软件的构建、分发和运行方式,从而实现了更高的效率、更好的可靠性和更快的业务响应速度。 它是现代云计算和DevOps文化的核心技术基石。
三,对比虚拟机与容器
- 虚拟机 需要在物理硬件上运行一个Hypervisor(虚拟机监控器),然后在每个虚拟机里安装一个完整的客户操作系统,最后才能运行应用。这导致了巨大的资源浪费和启动延迟。
- 容器 直接在主机操作系统上运行(通过一个容器引擎,如Docker),它们共享主机的内核,但每个容器在自己的用户空间中运行,相互隔离。这使得它们极其轻量和高效。
四、容器的标准化
在2015年,由Google,Docker、CoreOS、IBM、微软、红帽等厂商联合发起的OCI(Open
Container Initiative)组织成立了,并于2016年4月推出了第一个开放容器标准。
1. OCI 的核心价值
OCI标准的两大基石:
- Runtime Spec(运行时标准):定义了如何运行一个“文件系统包”(即容器镜像)在磁盘上解压后的内容。它规定了容器的配置、执行环境和生命周期。这确保了任何符合标准的
runtime
都能以相同的方式运行同一个容器。 - Image Spec(镜像格式标准):定义了容器镜像的格式、文件系统层、配置文件和清单(Manifest)。这确保了不同工具(如Docker、Podman)构建的镜像可以互相兼容和使用。
简单比喻:
- Image Spec 就像是 .exe 安装程序 的格式标准。
- Runtime Spec 就像是 Windows 操作系统 运行这个.exe程序的标准方式。
- OCI 确保了任何按照标准制作的“安装程序”,都能在任何符合标准的“操作系统”上以相同的方式运行。
2. 关于三种 Runtime 的现状更新
您提到的三种runtime非常经典,准确地反映了2016年左右的市场格局。但经过几年的发展,情况有了显著变化:
- LXC:
- 正如您所说,它是老牌的容器运行时,更偏向于“系统容器”,提供了一个完整的轻量级Linux系统环境。
- 它与Docker倡导的“应用容器”(单个进程)理念不同。Docker早期用它,但后来为了更专注于应用容器和实现标准化,开发了自己的工具链。
- Runc:
- 这是当今绝对的主流和事实标准。
- 它是一个轻量级的、符合OCI标准的客户端,专门用于根据OCI规范来创建和运行容器。
- 关键点在于,Docker的默认运行时是containerd,而containerd在需要启动容器时,会调用runc。所以
runc
可以看作是底层引擎,而containerd
是管理它的守护进程。Kubernetes的默认容器运行时接口(CRI)实现之一CRI-O
,底层也使用runc
。
- Rkt:
- 这个项目已经停止开发(被归档)。它曾是CoreOS推出的、旨在挑战Docker并更注重安全的容器运行时。
- 它的失败恰恰证明了OCI标准化的成功。因为Docker镜像和运行时都标准化了,市场上不再需要一个独立的、不兼容的生态系统。CoreOS公司后来也被Red Hat收购,其技术融入了更广泛的Kubernetes生态。
五、 Docker
什么是docker?
Docker 是一个开源的容器化平台,用于开发、交付和运行应用程序。它允许开发者将应用程序及其依赖项打包到一个轻量级的、可移植的容器中,从而实现快速、一致的部署和运行。以下是根据您提供的内容整理的 Docker 概述,包括其定义、优势和核心架构。
- 起源:Docker 最初由 dotCloud 公司创始人 Solomon Hykes 在法国发起,于 2013 年以 Apache 2.0 协议开源。它使用 Go 语言编写,代码托管在 GitHub 上。
- 核心概念:Docker 提供了一个开放平台,通过容器化技术将应用程序与底层基础设施分离,使软件交付更快速、可靠。用户可以用管理应用程序的方式管理基础设施,从而缩短开发到生产的延迟。
Docker 的优势
-
更快速的交付和部署:
- 开发者可以使用标准镜像构建开发容器,运维人员直接使用同一容器部署代码。
- 容器启动时间为秒级,大大节约开发、测试和部署时间。
-
更高效的虚拟化:
- Docker 容器是内核级虚拟化,不需要额外的 hypervisor(虚拟机监控程序),因此性能更高、资源消耗更少。相比传统虚拟机(每个应用需单独虚拟机),Docker 只需启动多个隔离的容器即可。
-
更轻松的迁移和扩展:
- 容器几乎可在任何平台上运行(物理机、虚拟机、公有云、私有云等),支持跨平台迁移,兼容性强。
-
更简单的管理:
- 通过增量式更新和分发,Docker 简化了应用管理,只需少量修改即可完成大量更新工作,实现自动化管理。
Docker 架构和核心组件
Docker 采用客户端-服务器(C/S)体系架构,组件之间通过 REST API 进行通信(使用 UNIX 套接字或网络接口)。核心组件包括:
-
Docker 客户端:
- 用户与 Docker 交互的工具(如
docker
命令行界面),支持通过 REST API 与服务器通信。
- 用户与 Docker 交互的工具(如
-
Docker 服务器(Docker 守护进程):
- 以后台服务方式运行在 Docker host 上,负责构建、运行、监控容器,以及存储和管理镜像。默认仅响应本地客户端请求。
-
Docker 镜像:
- 只读模板,用于创建容器。镜像定义了应用程序的运行环境和依赖。
-
Docker 容器:
- 镜面的运行实例。用户可以通过客户端启动、停止、移动或删除容器。容器代表应用程序的启动和运行阶段。
-
Registry:
- 镜像仓库,用于存储和分发镜像。分为:
- 公有仓库:如 Docker Hub(官方仓库),提供大量公共镜像;国内源(如腾讯云、阿里云)可加速访问。
- 私有仓库:用户自建的本地仓库,用于私有镜像的存储和共享。
- 镜像仓库,用于存储和分发镜像。分为:
六、部署docker
一、环境准备:下载阿里 CentOS 7 Yum 源
搜索阿里源
打开对应的操作系统
下载网络yum源
# 方法1:使用 wget 下载
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 方法2:使用 curl 下载(若未安装 wget)
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
二、部署 Docker(按阿里 Docker-CE 源操作)
回到上一页选择容器页点开docker-ce
按照他的操作部署
回到上一页选择 “容器” 页,点开 “docker-ce” 后,先安装 yum 工具依赖:
[root@hrz3 ~]# yum install -y yum-utils
添加阿里 Docker-CE 源:
[root@hrz3 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 Docker 全套组件:
[root@hrz3 ~]# yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
此时docker就已部署完成
三、配置 Docker 加速器
为访问国外 Docker Hub,部署以下加速器:
[root@hrz3 ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"]
}
重启 Docker 服务使配置生效:
[root@hrz3 ~]# systemctl daemon-reload
[root@hrz3 ~]# systemctl restart docker
四、部署 Nginx 测试
执行 Nginx 镜像拉取命令,测试 Docker 功能:
部署nginx测试
[root@hrz3 ~]# docker pull nginxlatest: Pulling from library/nginx
5c32499ab806: Pull complete
375a694db734: Pull complete
5f825f15e2e0: Pull complete
16d05858bb8d: Pull complete
08cfef42fd24: Pull complete
3cc5fdd1317a: Pull complete
4f4e50e20765: Pull complete
Digest: sha256:75cad0ed4b9ea94413143f700eea1a71635806207ffb901b577c436a06ff4acd
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
fdd1317a: Pull complete
4f4e50e20765: Pull complete
Digest: sha256:75cad0ed4b9ea94413143f700eea1a71635806207ffb901b577c436a06ff4acd
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest