docker技术之container与docker介绍
一、Docker 简介
Docker 是一种容器化技术,用于将应用程序及其依赖打包到一个独立的容器中,从而实现快速部署、隔离运行和跨环境一致性。
容器与虚拟机的区别
- 容器:运行在操作系统内核之上,依赖于 Linux 内核特性(如 Namespace 和 Cgroups),轻量级,启动速度快,资源消耗少。
- 虚拟机:通过虚拟化层运行完整的操作系统,资源占用大,启动慢,但隔离性更强。
Docker 的优点
- 快速:启动、停止等操作以秒或毫秒为单位,性能提升显著。
- 敏捷:部署简单,成本低。
- 灵活:应用和系统“容器化”,无需额外操作系统。
- 轻量:一台服务器可部署多个容器。
- 开源免费:由现代 Linux 内核支持,社区和生态系统丰富。
- 云支持:与众多云服务集成。
Docker 的争议点
- 隔离性:在复杂业务系统中,单 OS 的隔离性是否足够强。
- 语言成熟度:Docker 使用 Go 语言开发,Go 语言仍在不断改进。
- 商业化:由私有公司控制,未来可能商业化。
Docker 的目标
- 轻量建模:同一台宿主机运行多个容器。
- 逻辑分离:开发环境与生产环境一致。
- 快速开发周期:缩短从开发到生产的周期。
- 服务架构:鼓励单个容器运行单一服务,形成分布式模型。
Docker 的使用场景
- 开发、测试、部署服务。
- 创建隔离运行环境。
- 搭建测试环境。
- 构建 PaaS 基础设施。
- 提供 SaaS 应用程序。
- 高性能、大规模部署。
Docker 的技术实现
- Namespace:隔离资源(如进程、网络、文件系统等)。
- Cgroups:限制资源(如 CPU、内存)。
- UnionFS:联合文件系统,支持多层文件系统叠加。
Docker 的三大组件
- 仓库(Registry):存储和分发镜像,如 Docker Hub。
- 镜像(Image):容器的模板,包含启动容器所需的文件系统和配置。
- 容器(Container):运行中的实例,基于镜像启动。
Docker 的基本组成
- Docker Client:用户与 Docker 交互的客户端。
- Docker Daemon:后台服务,管理容器和镜像。
- Docker Image:只读文件系统,由多层组成。
- Docker Container:可写层,运行应用程序。
Docker 依赖的 Linux 内核特性
- Namespaces:隔离进程、网络、文件系统等资源。
- Cgroups:限制和管理资源使用。
Docker 容器的能力
- 文件系统隔离:每个容器有自己的 root 文件系统。
- 进程隔离:每个容器运行在独立的进程环境中。
- 网络隔离:容器间网络接口和 IP 地址独立。
- 资源隔离和分组:通过 Cgroups 管理资源分配。
二、什么是Docker?
PaaS(Platform as a Service)
PaaS 是一种云计算服务模型,为开发者提供了一个完整的开发平台,包括开发工具、运行时环境、数据库、中间件等。开发者可以在这个平台上开发、部署、运行和管理应用程序,而无需关心底层硬件和基础设施的管理。
PaaS 的特点
1、开发环境支持:
- 提供多种编程语言的运行时环境,如 Java、Python、Ruby、Node.js 等。
- 提供数据库服务,如 MySQL、PostgreSQL、MongoDB 等。
- 提供中间件支持,如消息队列(RabbitMQ)、缓存服务(Redis)等。
2、自动化部署:
- 支持通过配置文件或脚本实现应用程序的自动化安装、部署和升级。
- 提供持续集成和持续部署(CI/CD)工具,简化开发流程。
3、资源管理:
- 提供弹性扩展功能,根据应用负载自动调整资源分配。
- 提供资源监控和管理工具,帮助开发者优化性能和成本。
4、隔离性:
- 提供多租户支持,不同用户的应用程序在逻辑上隔离,互不影响。
常见的 PaaS 平台
- Heroku:支持多种编程语言,提供简单易用的部署流程。
- Google App Engine:提供强大的自动扩展功能,支持多种语言和框架。
- Microsoft Azure:提供广泛的开发工具和云服务,支持多种语言和平台。
- Amazon Web Services (AWS) Elastic Beanstalk:提供灵活的部署选项,支持多种语言和框架。
Docker 在 PaaS 中的应用
Docker 作为容器化技术,是实现 PaaS 平台的理想选择。它提供了以下优势:
1、轻量级和高性能:
- Docker 容器启动速度快,资源消耗少,适合在 PaaS 平台上快速部署和运行应用程序。
2、标准化和可移植性:
- Docker 容器将应用程序及其依赖打包成一个标准化的组件,可以在任何支持 Docker 的环境中运行,实现“一次打包,到处运行”。
3、隔离性:
- 每个容器运行在独立的环境中,应用程序之间互不干扰,提高了系统的稳定性和安全性。
4、自动化部署:
- 通过 Dockerfile 和 Docker Compose 等工具,可以轻松实现应用程序的自动化安装、部署和升级。
5、生态系统丰富:
- Docker 社区提供了大量的镜像和工具,支持多种编程语言和框架,方便开发者快速搭建开发环境。
Docker 与 PaaS 的结合
Docker 可以与 PaaS 平台无缝结合,为开发者提供更强大的开发和部署体验。例如:
- Heroku:支持 Docker 容器部署,允许开发者将应用程序打包成 Docker 镜像并部署到 Heroku 平台。
- Google Cloud Run:基于 Docker 容器的无服务器计算平台,支持自动扩展和按需计费。
- AWS ECS (Elastic Container Service):提供容器编排服务,支持 Docker 容器的管理和部署。
总结
PaaS 平台为开发者提供了一个完整的开发和部署环境,而 Docker 作为容器化技术,为 PaaS 平台提供了轻量级、高性能、标准化和可移植的解决方案。两者的结合,使得开发者可以更高效地开发、部署和管理应用程序,同时降低运维成本和复杂性。
三、Docker的核心技术
1. cgroups(Control Groups)
cgroups 是 Linux 内核的一个功能,用于对进程进行资源限制和隔离。它最初由 Google 工程师提出,后来被整合进 Linux 内核中。
重要概念
- 子系统(Subsystem):每个子系统是一个资源控制器,用于管理特定资源的分配。常见的子系统包括:
- cpu:控制 CPU 时间分配。
- memory:控制内存分配。
- blkio:控制块设备(如磁盘)的输入输出。
- net_cls:控制网络接口的分类。
- devices:控制设备访问权限。
- 控制组(Control Group):一个控制组是一个逻辑上的进程集合,可以分配特定的资源限制。例如,可以为一个控制组设置最大可用内存或 CPU 时间。
使用方法
1、挂载子系统:首先需要将子系统挂载到一个挂载点。
mount -t cgroup -o cpu,memory cgroup /sys/fs/cgroup
2、创建控制组:在挂载点下创建一个目录,表示一个新的控制组。
mkdir /sys/fs/cgroup/mygroup
3、设置资源限制:通过写入特定的文件来设置资源限制。
echo 100 > /sys/fs/cgroup/mygroup/cpu.shares # 设置 CPU 时间份额 echo 100M >
/sys/fs/cgroup/mygroup/memory.limit_in_bytes # 设置内存限制
4、将进程加入控制组:将进程的 PID 写入到控制组的 tasks 文件中。
echo 1234 > /sys/fs/cgroup/mygroup/tasks
优势
- 性能优势:cgroups 是内核级功能,性能开销小。
- 资源管理:可以精细控制各种资源的分配,适用于多租户环境。
- 广泛支持:被广泛应用于容器技术(如 Docker)和云计算平台。
2. LXC(Linux Containers)
LXC 是一种基于 Linux 的操作系统级虚拟化技术,利用 Namespace 和 cgroups 提供隔离和资源限制。
特点
- 轻量级:共享宿主机的内核,不需要单独加载内核,启动速度快,内存消耗少。
- 高性能:IO 和 CPU 性能接近物理机(baremetal)。
- 隔离性:通过 Namespace 提供进程、网络、文件系统等的隔离。
- 资源管理:通过 cgroups 限制资源使用。
与 Docker 的关系
- Docker 最初是基于 LXC 实现的,但后来 Docker 开发了自己的容器运行时(如 runc),不再依赖 LXC。
- LXC 和 Docker 都利用了 Linux 内核的 Namespace 和 cgroups,但 Docker 提供了更高级的抽象和工具,更适合应用容器化。
性能对比
- 性能:LXC > KVM(传统虚拟化技术)
- 内存利用率:LXC > KVM
- 隔离性:KVM > LXC(KVM 是完全的虚拟化,隔离性更强)
3. AUFS(Advanced Multi-Layered Unification Filesystem)
AUFS 是一种联合文件系统,支持将多个目录合并成一个虚拟文件系统。它通过“写入复制”(Copy on Write, COW)技术实现高效的文件系统操作。
特点
- 多层合并:可以将多个目录(如只读层和可写层)合并成一个单一的文件系统。
- 写入复制:当需要修改文件时,AUFS 会创建文件的副本,而不是直接修改原始文件。这减少了存储空间的占用。
- 高效部署:Docker 使用 AUFS 来管理容器的文件系统,使得容器的启动和部署非常快速。
应用
- Docker 镜像:Docker 镜像是由多层组成的,每层都是一个只读文件系统。AUFS 将这些层合并成一个可写的文件系统,供容器使用。
- 版本管理:Docker 利用 AUFS 的 COW 特性,只存储镜像之间的差异,从而节省存储空间。
典型的 Linux 启动文件系统
- bootfs:引导文件系统,用于启动过程中的初始化。
- rootfs:根文件系统,是系统启动后的主要文件系统。
总结
- cgroups:用于资源限制和隔离,是容器技术的核心组件之一。
- LXC:轻量级的容器技术,为 Docker 提供了早期的技术基础。
- AUFS:联合文件系统,通过 COW 技术实现高效的文件系统管理,是 Docker 容器文件系统的重要实现方式。
四、Docker全生命周期开发模式
Docker Image
定义Docker Image 是一个只读模板,包含了运行一个容器所需的文件系统和配置信息。它是一个极度精简的 Linux 程序运行环境,通常不包含不必要的工具(如 vi),除非是通过镜像叠加方式构建的。
特点
1、精简:
- 官方的 Java 镜像通常只包含运行 Java 应用程序所需的最小环境。
- 例如,CentOS + Java 7 的镜像会包含 CentOS 基础镜像和 Java 7 的运行时环境。
2、定制化:
- Docker Image 是一个需要定制化的“安装包”,包含基础镜像和应用的二进制部署包。
- 通过 Dockerfile 可以创建自定义的镜像,包含用户指定的软件依赖。
3、配置文件:
- Docker Image 内不建议包含运行时需要修改的配置文件。配置文件可以通过挂载卷(Volumes)或环境变量(Environment Variables)在运行时动态注入。
4、构建:
- 使用 Dockerfile 在当前目录下构建新的镜像:docker build -t my-image-name .
- Dockerfile 是一个文本文件,包含了一系列指令,用于定义如何构建镜像。
5、最佳实践:
- 重用基础镜像:尽量使用网上公开的基础镜像,避免重复造轮子。
- 多阶段构建:使用多阶段构建(Multi-Stage Builds)来减少镜像大小,只保留最终运行所需的文件。
- 标签化:为镜像添加清晰的标签(Tags),便于版本管理和区分。
Docker Container
定义
Docker Container 是 Docker Image 的运行实例。它共享宿主机的内核,但运行在隔离的环境中。
特点
1、实例化:
- Docker Container 是从 Docker Image 启动的实例,每个容器可以运行不同的操作系统镜像(如 Ubuntu 或 CentOS)。
- 容器的启动和停止速度非常快,通常在秒级。
2、隔离性:
- 容器之间是隔离的,每个容器运行在自己的环境中,互不干扰。
- 容器的文件系统是独立的,基于镜像的只读层和容器的可写层(Copy on Write)。
3、运行环境:
- 容器内部可以运行任何应用程序,但建议尽量保持容器的轻量化。
- 不建议在容器内部开启 SSHD 服务。Docker 1.3 版本后新增了 docker exec 命令,可以直接进入容器排查问题:docker exec -it container-name /bin/bash
4、网络配置:
- 容器默认没有对外的 IP 地址,但可以通过 Docker 的网络功能(如端口映射、自定义网络等)暴露服务端口。
- 容器可以连接到 Docker 网络,实现容器之间的通信。
5、生命周期:
- 容器的生命周期与应用程序的生命周期绑定。当应用程序退出时,容器也会停止运行。
- 容器可以被启动、停止、重启、删除等,操作非常灵活。
6、数据持久化:
- 容器的文件系统是临时的,容器删除后数据会丢失。可以通过挂载卷(Volumes)将数据持久化到宿主机或其他存储设备。
总结
- Docker Image 是一个只读模板,用于构建和分发应用程序及其依赖。它通过 Dockerfile 定制,支持多阶段构建和重用基础镜像。
- Docker Container 是 Docker Image 的运行实例,运行在隔离的环境中,共享宿主机的内核。它支持快速启动和停止,提供灵活的生命周期管理。
五、Docker Container的生命周期
注:Container必须在前台执行,命令执行完成就结束
Docker Daemon
定义
Docker Daemon 是 Docker 的核心组件之一,它是一个在后台运行的 Linux 守护进程,负责管理 Docker 镜像、容器、网络和存储卷等资源。
功能
1、容器管理:
- 创建、启动、停止、删除容器。
- 管理容器的生命周期,确保容器的正常运行。
2、镜像管理:
- 拉取、推送、存储和管理 Docker 镜像。
- 从本地或远程仓库下载镜像,或上传本地镜像到仓库。
3、网络管理:
- 配置和管理 Docker 网络,支持容器之间的通信。
- 支持多种网络模式,如桥接网络、主机网络、覆盖网络等。
4、存储卷管理:
- 管理数据卷,支持数据的持久化存储。
- 支持本地存储卷和外部存储卷(如 NFS、Ceph 等)。
5、REST API 服务:
- Docker Daemon 可以绑定本地端口(默认是 unix:///var/run/docker.sock 或 tcp://0.0.0.0:2375),提供 REST API 服务。
- 通过 REST API,用户可以远程访问和控制 Docker 守护进程,执行各种操作,如创建容器、拉取镜像等。
6、插件支持:
- 支持各种插件,如网络插件、存储插件等,扩展 Docker 的功能。
启动和配置
- 启动 Docker Daemon:
- bash复制sudo systemctl start docker
- 配置 Docker Daemon:
- 配置文件通常位于 /etc/docker/daemon.json,可以设置绑定的端口、镜像仓库地址等参数。
- 示例配置文件:
- JSON复制{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"], "insecure-registries": ["myregistry.local:5000"] }
六、Docker Registry/Hub
定义
Docker Registry 是一个集中化的镜像存储和分发系统,用于存储和管理 Docker 镜像。Docker Hub 是 Docker 官方提供的公共镜像仓库,是 Docker 生态系统的重要组成部分。
功能
1、镜像存储和分发:
- 存储和管理 Docker 镜像,支持用户上传和下载镜像。
- 提供镜像版本管理,用户可以拉取特定版本的镜像。
2、用户管理:
- 支持用户注册、登录和权限管理。
- 用户可以创建和管理自己的镜像仓库。
3、自动化构建:
- 支持与代码托管系统(如 GitHub 和 Bitbucket)集成,实现自动化构建。
- 当代码更新时,Docker Hub 会自动触发构建流程,生成新的镜像。
4、镜像搜索和发现:
- 提供镜像搜索功能,用户可以快速找到所需的镜像。
- 支持镜像分类和标签,方便用户管理和查找。
5、私有仓库:
- 支持创建私有仓库,用户可以将敏感镜像存储在私有仓库中,限制访问权限。
- 私有仓库可以部署在本地或云服务中,如 Docker Registry。
使用方法
- 登录 Docker Hub:docker login
- 拉取镜像:docker pull hello-world
- 推送镜像:docker push myusername/myimage
- 配置自动化构建:
- 在 Docker Hub 上绑定 GitHub 或 Bitbucket 仓库。
- 配置自动化构建规则,指定触发条件和构建步骤。
总结
- Docker Daemon 是 Docker 的核心守护进程,负责管理容器、镜像、网络和存储卷等资源。它通过 REST API 提供远程访问和控制功能,是 Docker 运行的基础。
- Docker Registry/Hub 是 Docker 镜像的存储和分发中心,提供了丰富的镜像资源和自动化构建功能。Docker Hub 作为官方公共仓库,极大地促进了 Docker 生态系统的繁荣。