云安全
云安全概述
阿里云概述
亚马逊AWS概述
云计算导论
云计算概述
云计算的关键技术
虚拟化
分布式文件系统
云存储
数据处理
并行计算
OpenStack
容器
Kubernetes概述
Serverless
Hadoop
云原生
云数据中心
微服务
对象存储OSS
云存储
对象存储
对象文件(Object)
存储桶(存储空间)
通过外网访问OSS
存储桶漏洞
STS访问OSS
权限与访问控制
访问控制
Bucket&RAM Policy
预签名
Docker
01docker概述
02docker安装
03目录结构
04基础操作
05底层原理【理论】
06底层原理【实践】
07DockerFile
08容器反查Dockerfile
09Docker 逃逸
-
+
首页
容器
## 容器与虚拟化技术 容器与虚拟机的区别:每台虚拟机都会有自己的操作系统,而容器没有自己的操作系统,所有的容器共用宿主机的操作系统。 容器的优势:首先,与虚拟机相比每台容器消耗的资源会更少,这就意味着在同一台物理机上可以启动更多的容器。第二,因为容器启动时不用启动自己的操作系统所以启动速度会大大快于虚拟机,一般来讲虚拟机启动为分钟级而容器则是秒级甚至是毫秒级。第三,容器比虚拟机更容易迁移,因为容器更加轻量。  容器的不足:容器是进程级隔离而虚拟机是操作系统级的隔离,所以容器的安全性要差一点,这需要额外的机制进行弥补。 ## 容器的发展史 容器的发展历程是计算技术从 “资源隔离” 到 “高效协作” 的演进史,其核心是通过技术创新不断突破物理硬件的限制,实现应用的轻量化、标准化和弹性化。 | 时间 | 技术 / 工具 | 核心贡献 | | ---- | ---------------------- | --------------------------------------------------------- | | 1979 | chroot | 文件系统隔离,容器技术的基石 | | 2006 | cgroups | 内核级资源控制,实现 CPU、内存等资源的隔离与限制 | | 2008 | LXC | 首个完整的 Linux 容器管理器,结合 cgroups 和 Namespaces | | 2013 | Docker | 镜像封装、标准化交付,开启容器技术商业化浪潮 | | 2014 | Kubernetes | 容器编排与自动化管理,云原生生态的核心 | | 2015 | OCI/CNCF | 容器标准制定与云原生技术推广 | | 2017 | AWS Fargate | Serverless 容器的商业化落地 | | 2018 | gVisor/Firecracker | 沙箱容器与 Serverless 优化 | | 2023 | WebAssembly+Kubernetes | 通过 Krustlet 实现 WebAssembly 容器编排,拓展边缘计算场景 | 容器技术的发展是隔离→标准化→生态化的螺旋上升过程:从早期的进程隔离工具,到 Docker 的镜像革命,再到 Kubernetes 的编排标准化,最终与云原生、边缘计算、Serverless 深度融合。 未来,容器将继续作为数字基础设施的核心,推动应用开发和部署模式的持续创新,助力企业实现高效、弹性、安全的数字化转型。 ## 概述  Docker是由Docker公司(当时叫dotCloud)于2013年3月发布的一款容器引擎。目前Docker已经开源,其源代码托管在Github上,基于go语言编写,并且遵守Apache2.0协议。 安装Docker之后,便可以基于Docker创建、管理和删除容器,所有这些操作都只需要一行或几行命令,简单易学。 Docker的理念是将应用的交付视作海运,Docker便像货轮,容器便像货轮上的集装箱,不同的集装箱装着不同的程序,程序之间环境是相互隔离的。而Docker的任务就是将载满集装箱的货轮从海的这一端送到另一端,就像将程序从一个系统迁移到另一个系统。 Docker公司位于旧金山硅谷,由法裔美籍企业家Solomon Hykes于2010年创立。Docker公司原名为dotCloud,是一家平台即服务提供商。因为业务关系,dotCloud需要使用Linux容器,为了方便管理这些容器,dotCloud开发了一套内部工具,这便是之后的Docker。 2013年作为初创公司的dotCloud生存得步履维艰,迫不得已,Solomon Hykes正式宣布将Docker项目开源。谁知不鸣则已一鸣惊人,Docker开源之后,众多的开发者都觉察到了Docker的优秀之处——其真正解决了容器的管理困难问题,纷纷加入Docker开源社区,Docker迅速火了起来,dotCloud借此机会将公司名字改为了Docker并重新振作起来。 官网地址:https://www.docker.com ## Docker组件 > Client Docker Client也就是Docker的客户端,是Docker的管理者。Docker管理员可以通过在Docker Client中输入相应的Docker命令对Docker服务进行使用和管理。Docker Client通过HTTP或REST API等方式与docker daemon通信,最终实现对容器的管理。 > Sever Docker Server也就是Docker 的服务端,是Docker的核心组件,它提供对容器的创建和管理,其中又包括诸多组件。 Docker daemon即Docker守护进程,它负责监听客户端发来的消息并依照客户端命令管理容器。 Docker image即镜像文件,它提供容器运行所需要的所有文件。 namespace和cgroup为Linux内核组件,Docker利用namespace进行容器资源的隔离,利用cgroup限制容器的资源使用。 > Registry Docker Registry也就是Docker镜像仓库服务,负责存储镜像。 最常用的镜像仓库服务是Docker hub也就是Docker官方的镜像仓库服务,另外还有一些其他的镜像仓库服务,比如阿里云镜像仓库服务。  ## docker镜像 Docker将镜像分为一些低耦合的只读镜像层,不同镜像之间可以共用镜像层,这样可以有效节省存储空间并提高性能。 Docker利用分层的联合文件系统UnionFS记录哪些镜像层会组合成一个镜像,并将这些镜像层对外暴露为一个完整的镜像文件。 Docker镜像都起源于一个基础镜像层,之后每进行一次修改就需要在基础镜像层之上加一个镜像层。比如可以将ubuntu:12.04作为一个基础镜像层,然后在Ubuntu中安装python,这就需要增加一个镜像层,再在python中安装pytorch,这便又需要增加一层。  ## Docker引擎 Docker引擎的作用:Docker引擎是Docker管理容器的关键组件,Docker通过Docker引擎创建、管理容器。直观来看,Docker引擎便是一个软件程序,这个程序的功能便是管理容器。 Docker引擎的功能拆分:Docker引擎将各功能进行了拆分,形成了众多的功能组件。  Docker client:client对外提供容器管理API,管理人员通过在client输入容器管理命令管理容器。 Docker daemon:Docker daemon的主要功能包括镜像的创建和管理、网络管理、存储管理、安全管理等。 Containerd:负责容器的生命周期管理,包括容器的创建、停止、删除等等。 Shim:Shim组件用于实现容器与守护进程的解耦。 RunC:容器运行时(Runtime),基于OCI标准实现的容器创建工具。 ## 持久化存储 一般情况下,容器中的数据保存在容器中,与容器的生命周期相同。也就是说如果删除容器,容器中的数据也就随着删除了。 但持久化保存数据的需求是存在的,持久化保存的数据能够独立地保存在容器外,即使容器被删除了数据仍然存在。使用持久化方式存储的数据将更加安全,也更容易在多容器之间分享。 常用的持久化存储数据的方式有两种,绑定挂载(bind)和卷挂载(volume)。绑定和卷两种方式都是维护两个有映射关系的目录,一个位于容器内,一个位于容器外,并保证这两个目录中保存的数据是相同的。 绑定挂载:绑定可以让用户自己指定在宿主机中的目录,且在挂载时会对容器中的目录进行覆盖。 卷挂载卷:在宿主机中的目录由Docker指定。如果挂载时卷是空的而容器目录中有数据,那么docker会将容器目录中的数据拷贝到卷中,但是如果卷中已经有数据,则会将容器中的目录覆盖。 ## Docker网络 none模式:处于none模式下的容器有自己独立的network namespace,这一点类似于bridge模式,但它并没有进行任何的网络设置。 bridge模式:bridge即虚拟网桥,在此种网络模式下,Docker会为每一个容器分配一个虚拟网卡并为每一个容器分配一个IP地址。容器会通过自己的虚拟网卡连接到一个虚拟网桥,这个虚拟网桥与宿主机相连,以此实现了容器与容器、容器与宿主机之间的互联互通。 container模式:处于container模式下的容器不会创建自己的虚拟网卡并设置自己的IP,这一点类似于host模式,但与host模式不同,它不会借用宿主机的网卡和IP而是借用另外一个容器的网卡和IP。 host模式:host模式是另外一种网络模式,相较于bridge模式,处于host模式下的容器不会虚拟出自己的网卡,也不会有自己的IP地址,而是使用宿主机的网卡和IP。 自定义网络:自定义网络也使用虚拟网桥进行通信。但与Docker默认创建的bridge不同,自定义网络支持自动DNS域名解析,即将容器名称解析到IP地址。 ## Docker Compose  Docker Compose是Docker公司推出的一个容器编排工具,项目目前托管在github上,其可以管理多个容器组成一个完整的应用。 Compose借助一个YAML格式的配置文件来管理容器,用户只需要在这个配置文件中写清楚规则,就可以一键创建、并管理组成一个完整应用的众多容器了。 Docker Compose 的 GitHub 仓库地址为:https://github.com/docker/compose > YAML配置文件 ```yaml 1. version: "3.9" 2. services: 3. 4. redis: 5. image: redis:alpine 6. ports: 7. - "6379" 8. networks: 9. - frontend 10. deploy: 11. replicas: 2 12. update_config: 13. parallelism: 2 14. delay: 10s 15. restart_policy: 16. condition: on-failure 17. 18. db: 19. image: postgres:9.4 20. volumes: 21. - db-data:/var/lib/postgresql/data 22. networks: 23. - backend 24. deploy: 25. placement: 26. max_replicas_per_node: 1 27. constraints: 28. - "node.role==manager" 29. 30. networks: 31. frontend: 32. backend: 33. 34. volumes: 35. db-data: ``` version表示compose配置文件的版本。每个compose文件中必须包含version,并且需要放在第一行。注意,这里指定的不是compose的版本,而是compose配置文件的版本,每个版本的compose配置文件格式都有区别,这里使用的是3.9版本。 services指定需要创建的服务,每个服务便是一个容器。其下的每一个二级Key便是一个服务,也就是一个容器。可以看到上例中指定了两个容器,redis和db。在services下每指定一个容器,便相当于执行了一条docker run命令。 networks指定需要创建的网络。这里创建了frontend和backend两个网络。在networks下每指定一个网络,便相当于执行了一条docker network create命令。 volumes指定需要创建卷。这里创建了一个名为db-data的卷。在volumes下每指定一个卷,便相当于执行了一条docker volume create命令。 ## Docker Swarm  Docker Swarm是Docker公司推出的Docker集群管理工具。Swarm将多个节点视为一个虚拟节点,并且对外以Docker API的形式提供服务。这意味着用户可以使用简单的Docker命令管理一个Swarm集群中的所有容器。 Swarm与Compose都是Docker公司制作的容器编排工具,但不同的是,Compose主要用于在单节点上编排多个容器,而Swarm用于跨节点的容器编排。 一个Swarm集群由管理节点(Manager)和工作节点(Worker)组成。管理节点的功能包括管理集群、维护集群状态、给工作节点分配任务等。工作节点主要用于接受和执行管理节点分配的任务,包括创建、删除容器等。  ## Docker Stack  Swarm解决了服务在多节点的部署问题,但当需要同时部署多个服务时,只依靠Swarm便不够了。为了解决在多节点同时部署多个服务的问题,Docker公司推出了Docker Stack。 Stack依赖于Swarm,实际上,Stack借助于Swarm将服务部署在集群上。Stack使用了一个声明文件来对需要部署的服务进行定义,这个声明文件就是Compose配置文件。
毛林
2025年10月27日 20:39
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码