Docker
一、什么是Docker
Docker是开发,运行和部署应用程序的开放管理平台
- 开发人员能利用docker开发和运行应用程序
- 运维人员能利用docker部署和管理应用程序
二、为什么使用docker
- Docker使您能够将应用程序与基础架构分开 以便您快速交付软件
- 借助Docker 可以像管理应用程序一样管理基础架构
- 通过利用Docker的方法快速进行运输 测试 和部署代码 可以显著缩短编写代码和在生产环境中运行代码之间的延迟
- 如:
- 开发人员在本地编写代码 可以使用Docker与同事进行共享 实现协同工作
- 使用Docker开发完成程序 可以直接对应用程序执行自动和手动测试
- 当开发人员发现错误或者BUG时,可以直接在开发环境中修复后 并迅速将他们重新部署到测试环境进行测试和验证
- 利用Docker开发完成后 交付时 直接交付Ddock 也就意味着交付完成 后续如果有提供修补程序或者更新 需要推送到生成环境运行起来 也是一样的简单
- Docker主要解决的问题:
- 保证程序运行环境的一致性
- 降低配置开发环境 生产环境的复杂度和成本
- 实现程序的快速部署和分发
三、Docker整体结构了解
Docker引擎介绍(Docker Engine)
- Docker Engine是一个包含以下组件的客户端-服务端(C/S)应用程序
- 服务端:一个长时间运行的守护进程(Docker Daemon)
- REST API:一套用于与Docker Daemon通信并指示其执行操作的接口
- 客户端:命令执行接口CLI(Command Line Interface)
- CLI利用Docker命令通过REST API 直接操控Docker Daemon执行操作
- Docker Daemon负责创建并管理Docker的对象(镜像、容器、网络、数据卷)
Docker结构概览图
Docker结构简介:
- Docker客户端(Docker Client)
- Docker客户端是用户与Docker进行交互的最主要方式。当在终端输入docker命令时 对应的就会在服务端产生对应的作用 并把结果返回给客户端 Docker Client除了连接本地服务端 通过更改或者指定DOCKET_HOST连接远程的服务端
- Docker服务端(Docker Server)
- Docker Daemon其实就是Docker的服务端 他负责监听Docker API请求(如:Docker Client)并管理Docker对象(Docker Object) 如镜像 容器 网络 数据卷等
- Docker Registries
- 俗称Docker仓库 专门用于存储镜像的云服务器环境
- Docker Hub 就是一个公有的存放镜像的地方 类似GitHub存储代码文件 同样的也可以类似GitHub那样创建私有的仓库。
- Docker 对象(Docker Objects)
- 镜像:一个Docker的可执行文件 其中包括运行应用程序所需的所有代码内容 依赖库 环境变量和配置文件等
- 容器:镜像被运行起来后的实例。
- 网络:外部或者容器间如何相互访问的网络方式 如host、bridge模式
- 数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。
Docker底层使用的技术介绍(一)
Docker使用Go语言实现
Docker利用Linux内核的几个特性来实现功能:
- 利用Linux的命名空间(Namespaces)
- 利用Linux的控制组(Control Groups)
- 利用Linux的联合文件系统(Union Files Systems)
这也就意味着Docker只能在Linux运行
在windows、MacOS上运行Docker 其实本质上是借助了虚拟化技术 然后在Linux虚拟机上运行的Doc而程序
容器格式:
- Docker Engine将namespace、cgroups、UnionFS进行组合sss后的一个package,就是一个容器格式(Container Format)。Docker通过对这个package中的namespace、cgroups、UnionFS进行管理控制实现容器的创建和生命周期管理
- 容器格式(Container Format)有多种,其中Docker目前使用的容器格式被称为libcontainer
Docker底层使用的技术介绍(二)
- Namespace(命名空间):为Docker容器提供操作系统层面的隔离
- 进程号隔离:每一个容器内运行的第一个进程,进程号总是从1开始算起
- 网络隔离:容器的网络与宿主机或其他容器的网络是隔离的、分开的,也就是相当于两个网络
- 进程间通隔离:容器中的进程与宿主机或其他容器中的进程是互不可见的,通信需要借助网络
- 文件系统挂在隔离:容器拥有自己单独的工作目录
- 内核以及系统版本号隔离:容器查看内核版本号或者系统版本号时,查看的是容器的而非宿主机的
- Control Groups(控制组-cgroups):为Docker容器提供硬件层面的隔离
- 控制组能控制应用程序所使用的硬件资源
- 基于该性质 控制组帮助docker引擎将硬件资源共享给容器使用 并且加以约束和限制,如控制容器所使用的内存大小
- Union File System(联合文件系统–UnionFS):利用分层(layer)思想管理镜像和容器
总结
- 重点掌握Docker以下组件或对象直接的联系:
- Docker Client CLI
- Docker Daemon(Docker server)
- Docker Object
- Registry
- 了解以下列出的DOK而使用的底层技术
- Namespaces
- Control Groups
- Union File System
- Container Format
Docker核心技术之镜像
镜像简介
- 镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等
- 通过镜像可以创建一个或多个容器
镜像管理
镜像搜索 docker search
作用:
搜索Docker Hub(镜像仓库)上的镜像
命令格式:
docker search [OPTIONS] TERM
命令参数(OPTIONS):
- -f, –filter filter:根据提供的格式进行筛选结果
- –format string:利用Go语言的format格式化输出结果
- –limit int:展示最大的结果数,默认25个
- –no-trunc:内容全部展示
Docker核心技术之容器
什么是容器?
容器是一种轻量级、可移植、并将应用程序进行打包的技术,使应用程序可以在几乎任何一个地方以相同的方式运行
- Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例
- 容器具备一定的生命周期
- 另外,可以借助docker ps命令查看运行的容器,如同在Linux上利用ps命令查看运行着的进程那样
容器与虚拟机对比(一)
- 容器和虚拟机一样,都会对物理硬件资源进行共享使用
- 容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)
- 容器中或虚拟机中都可以安装各种应用,如:Redis、MySQL、Nginx等,也就是说,在容器中的操作,如同在一个虚拟机(操作系统)中操作一样
- 同虚拟机一样,容器创建后,会存储在宿主机上:Linux上位于/var/lib/docker/container下
容器与虚拟机不同点 对比(二)
注意:容器并不是虚拟机 但他们有很多相似地方
- 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上以一系列进程的结合
- 容器是轻量级的,虚拟机是重量级的。首先容器不需要额外的资源来管理(不需要Hypervisor、GuestOS),虚拟机额外更多的性能消耗;其次,创建、启动和关闭容器,如同创建、启动和关闭进程name轻松,而创建、启动和关闭一个操作系统就没有这么方便了
- 也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上。
容器的生命周期
虚拟机的生命周期
容器的生命周期
容器的创建——docker create
- 作用:利用镜像创建出一个Created 状态的待启动容器
- 命令格式:
- docker create [OPTIONS] IMAGE [COMMAND] [ARG….]
- 命令参数(OPTIONS):
- -t, –ty:分配一个伪TTY,也就是分配虚拟终端
- -i, interactive:即使没有连接,也要保持STDIN打开
- –name:为容器起名,如果没有指定将会随机产生一个名称
- 命令参数(COMMAND):
- COMMAND表示容器启动后,需要在容器中执行的命令,如ps,ls等命令
- ARG表示执行COMMMAND时需要提供一些参数,如ps命令的aux,ls命令的-a等等